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