この記事について
この記事ではミニマムな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を置きます。
#! /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"に下記のようにバックアップを作成するスクリプトをつくります。
#! /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つの方法でセキュリティを強化する方法を紹介します。
- ファイルのアクセス制限
サーバにログインしてsu
でルートになります。
下のコマンドでgitユーザのホームディレクトリ丸々のアクセス権限を変更します。
chmod -R 700 /home/git/
これにより、他のユーザからはgitのファイルにアクセスできなくなります。
- sshのログイン制限
sudoedit /etc/ssh/sshd_config
を実行してsshの設定ファイルを編集します。
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
AllowUsers git # ログイン出来るユーザの指定。厳しすぎるかも?