14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ミニマムなgitサーバを作る方法

Last updated at Posted at 2016-07-31

この記事について

この記事ではミニマムなgitサーバの作成方法について書いていきます。
manjaro Linuxで作っていますが、Arch Linuxでも問題なく作れると思います。
pacmanなどの環境依存のコマンドを置き換えればubuntu、fedora上でも同じ方法で作成可能です。
最小限なのでプッシュとプルしかできません。(それで十分だと思いますが。)
より統合的なgitサーバを作りたいならば gitlab などのパッケージを使うのが良いでしょう。

必要なソフトのインストール

まずはgit。
パッケージマネージャで簡単に入れられます。

pacman -S git

次にサーバとクライアント間の通信に使われるsshを入れる必要があります。
下記のコマンドでsshをサーバにインストールして有効化してください。

sudo pacman -S openssh
sudo systemctl enable sshd
sudo systemctl start sshd

gitユーザの変更

gitを入れると新しくgitデーモンユーザができます。
ユーザのパスワード、ホームディレクトリを変更していきます。
アクセス制限を回避するためにルートに昇格します。

sudo su

gitユーザのパスワードを変更します。

passwd git

gitユーザのホームディレクトリを作成します。
所有者を変更することをお忘れなく。

mkdir /home/git
chown git /home/git

/etc/passwdを編集して作成したディレクトリをホームディレクトリに登録します。/etc/passwdのgitユーザの行

git:x:995:995:git daemon user::/bin/bash

git:x:995:995:git daemon user:/home/git:/bin/bash

に変更します。

sshの設定

サーバにクライアントがアクセスできるようにsshを設定します。
クライアント側で以下のコマンドを実行して鍵を生成します。

ssh-keygen -t rsa

ftpなどでサーバに公開鍵(id_rsa.pu)をアップロードします。
gitユーザのホームディレクトリにsshの設定ファイルを作ります。
下記のコマンドをgitユーザとして実行してください。

mkdir ~/.ssh
touch ~/.ssh/authorized_keys

クライアント側で生成した公開鍵を作成したauthorized_keysに書き込みます。

cat id_rsa.pub >> ~/.ssh/authorized_keys

これでsshの設定が終わりました。

git-shellの設定

セキュリティのためgitユーザのシェルを変更します。
この変更によりgitユーザは~/git-shell-commands内にあるコマンドしか実行できなくなります。
git-shellを有効化する前にgit-shellに許可するコマンドを設定します。
~/git-shell-commands内に新しいレポジトリを作るコマンドを書いたシェルスクリプトnewgitを置きます。

newgit
#! /bin/sh
mkdir -p ~/Projects/$1
cd ~/Projects/$1
git init --bare

これからgit-shellを有効化します。
/etc/passwdの先ほどと同じ行のうち/usr/bin/bashと書かれている場所を/usr/bin/git-shellに変更します。

git:x:995:995:git daemon user:/home/git:/usr/bin/git-shell

これでサーバの設定は終わりました。

テスト

まずサーバに先ほど作成したnewgitコマンドでTestレポジトリを作ります。

ssh git@remote_host
newgit Test.git

それから、クライアント側でコミットの準備をします。

git remote add origin git@remote_host:~/Projects/Test.git

プッシュが成功すれば完成です。

git push origin HEAD

バックアップの自動化

バックアップの自動化をしておきましょう。
サーバ側の"~/git-shell-commands"に下記のようにバックアップを作成するスクリプトをつくります。

backup.sh
#! /bin/sh
mkdir -p ~git/Backup/                                                                FNAME=`date --iso-8601`
tar -cvjf ./Backup/${FNAME}.tar.bz2 ./Projects
find ./Backup/ -mtime +14 -exec \rm -rf \{} \;
wall "Git Repository BackUped :)"

findから始まる行が重要です。この行がないとバックアップフォルダが肥大し続けます。
このコマンドをcronジョブに登録します。
sudo crontab -eを実行してジョブの編集を行います。

クロンジョブ編集画面
* */5 * * * /home/git/git-shell-commands/backup.sh

これにより、5時間ごとにbackupコマンドが実行されます。

セキュリティの強化

大切なものは守りましょう。ここでは2つの方法でセキュリティを強化する方法を紹介します。

  1. ファイルのアクセス制限
    サーバにログインしてsuでルートになります。
    下のコマンドでgitユーザのホームディレクトリ丸々のアクセス権限を変更します。
アクセス権限変更
chmod -R 700 /home/git/

これにより、他のユーザからはgitのファイルにアクセスできなくなります。

  1. sshのログイン制限
    sudoedit /etc/ssh/sshd_configを実行してsshの設定ファイルを編集します。
/etc/ssh/sshd_config
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
AllowUsers git # ログイン出来るユーザの指定。厳しすぎるかも?
14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?