Ubuntuでgitサーバの作り方

/ Linux

Ubuntu22.04でssh認証とhttps接続で動作するgitサーバの作り方をGit Book等を参考に記す。

その他の参考ページ

gitユーザの作成

sudo adduser git
su git
cd
mkdir .ssh && chmod 700 .ssh
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

これでローカルにgitというユーザが作成された。ssh://git@domain-name.comという形式でのアクセスが可能になる。

ssh-keygen -t ed25519

で鍵ペアを生成し、すべてデフォルトの場合は~/.ssh/id_ed25519.pubの内容に次の内容を冒頭に付け足したものをgitユーザのauthorized_keysにアクセスさせる鍵の分だけ記入していく。

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ed25519 <KEY> <MACHINE>

クライアント側には通常と同様に次のような~/.ssh/configを用意しておく。

Host domain-name.com
    User git
    IdentityFile ~/.ssh/id_ed25519

次にセキュリティの観点でgitユーザのログインシェルをgit-shellに置換する。これを実行するとsu gitなどが出来なくなる。

which git-shell
/usr/bin/git-shell  #控える

sudo vim /etc/shells #控えた箇所を追記

sudo chsh -s git $(which git-shell)

以上でOK。完全に本家のまま。

gitリポジトリの作成

httpsとssh両方/srv/gitにフォルダを作ってアクセスさせる。

cd /srv
sudo mkdir git
sudo chmod g+w git
sudo chown git:www-data git

グループ書き込み権限とwww-dataグループを割り当てておく。所有者は前述したgitユーザにしておく。

SmartHTTPの設定

Apache2をインストールする。

sudo apt update
sudo apt install apache2 apache2-utils
sudo a2enmod env cgi alias rewrite

次に、/etc/apache2/sites-enabled/000-default.confのVirtualHost要素内に次を追記する。

<VirtualHost *:80>
    # git server configuration
    SetEnv GIT_PROJECT_ROOT /srv/git
    SetEnv GIT_HTTP_EXPORT_ALL
    ScriptAlias /git /usr/lib/git-core/git-http-backend/

    <Directory "/usr/lib/git-core">
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    AllowOverride None
    Require all granted
    </Directory>
</VirtualHost>

ここで

ScriptAlias /git /usr/lib/git-core/git-http-backend/

の真ん中/gitがアクセスするときのURLになる。このURLにアクセスしたとき、内容はGIT_PROJECT_ROOTで指定した場所が探索される。最後はこのGIT_PROJECT_ROOTすなわち/srv/gitの配下にベアリポジトリを作成するのみとなる。

ベアリポジトリの作成

ファイルの権限設定が面倒であるため参考ページと同様にスクリプトを用いる。

#!/usr/bin/env bash
GIT_PROJECT_ROOT=/srv/git
[[ -z $1 ]] && exit
REPOSITORY=$1
REPOSITORY=${REPOSITORY%\.git}.git

D="$GIT_PROJECT_ROOT/$REPOSITORY"

mkdir -p "$D"
GIT_DIR="$D" git init --bare
cp "$D/hooks/post-update.sample" "$D/hooks/post-update"
GIT_DIR="$D" git config http.receivepack true
GIT_DIR="$D" git config https.receivepack true
GIT_DIR="$D" git update-server-info
chown -R git:www-data "$D"
chmod -R g+w "$D"

こちらは参考ページと同じです。

クローンのテスト

サーバのドメインがdomain-name.comだとする。次が通れば成功。

sudo ./name_of_script.sh test/project
git clone ssh://git@domain-name.com:/srv/git/test/project.git
git clone http://domain-name.com/git/test/project.git