FreeBSD + fcgiwrap + cgitでGit WebフロントエンドとGitサーバーを建てる
3 min read
こんにちは、無能です。
少し前までGItea
にて構築していたのですが、あまりにもリッチすぎて不必要なサーバーリソースを食ってしまうことからこの点を改善したいと思っていました。
また、基本レポジトリの作成もできる限りCLI上から行いたく、Githubだとgh
コマンドもありますがこのようなプラットフォーム依存なコマンドを私的採用することはしたくないので導入してませんでした。
というのもプラットフォーム依存のバイナリは低レイヤーの学びは多くはないためです。
そこで、別途git
のWebフロントエンドとしてcgit
を採用しgit
はSSH経由でリモート先に保管することで願い通りの構築ができました。
gitをpushできるようにする
つまりは、ベアレポジトリをGitのサーバー側に作成しそこへpush
できればよいというだけです。
すでにSSHでリモート先、今回はGitサーバ側へSSHできることを前提としています。
gitユーザ作成
FreeBSDの場合"adduser"コマンドで対話式に作成が可能です。
adduser
ここで作成するgit
ユーザのあとにスイッチし、.ssh/authorized_keys
へクライアント側の公開鍵を追加します。
su - git
mkdir .ssh
chmod 700 .ssh
vim .ssh/authorized_keys
# または
echo "クライアント側の公開鍵" > ".ssh/authorized_keys"
chmod 600 .ssh/authorized_keys
これでssh
できることを確認します。
追加で、このgitユーザのホームディレクトリ配下にレポジトリを保管するディレクトリを作成します。
mkdir repos
そして、git config
でデフォルトの使用ブランチを設定しておきます。
git config --global init.defaultBranch main
クライアント側からサーバ側へレポジトリ作成できるように
このままだと毎回gitサーバ側へログインし、レポジトリ作成してクライアント側からgit push
する必要がありますが面倒すぎるのでクライアント側から一連の動作を行えるようにします。
以下を.bashrc
に追加しました。
mkr() {
ssh git@bsd "git init --bare repos/$1.git"
ssh git@bsd "cd repos/$1.git; git branch -m main"
echo "remote add origin git@bsd:~/repos/$1.git"
}
これで引数に与えたレポジトリ名からクライアント側でレポジトリ作成が行えるようになりました。
最後にリモートURLを実行するコマンドを標準出力させることで楽にリモートURLをセットできるようになります。
cgitのインストール
cgit
を使うためにはcgi
が必要なので必要パッケージをインストールします。すでにNginxはインストールしているものとします。
pkg install cgit fcgiwrap
NginxがUNIXソケット経由www:www
のユーザ、グループ権限でアクセスできるように、そしてサービス有効化を行う必要があります。
sysrc fcgiwrap_enable=YES
sysrc fcgiwrap_user=www
sysrc fcgiwrap_group=www
sysrc fcgiwrap_socket_owner=www
sysrc fcgiwrap_socket_group=www
service fcgiwrap start
cgitの設定
cgit
の設定を行う必要があります。
今回は少しデフォルトとはカスタムしているので以下のようになりました。
$ cat /usr/local/etc/cgitrc
root-title=Git
root-desc=public repositories
virtual-root=/
scan-path=/home/git/repos/
css=/style.css
logo=/top.png
head-include=/usr/local/www/cgit/head.html
readme=:README.md
readme=:README.rst
enable-commit-graph=1
配信するファイル群はパッケージインストールした時点で/usr/local/www/cgit/
配下に作成されておりました。
Nginxの設定
さて、ここでえんじんえっくすくんです。
server {
if ($host = git.soulminingrig.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name git.soulminingrig.com;
listen 80;
}
server {
server_name git.soulminingrig.com;
listen 443 ssl;
root /usr/local/www/cgit;
location / {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/www/cgit/cgit.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
}
location ~* \.(css|png|ico)$ {
root /usr/local/www/cgit;
}
ssl_certificate /usr/local/etc/letsencrypt/live/git.soulminingrig.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /usr/local/etc/letsencrypt/live/git.soulminingrig.com/privkey.pem; # managed by Certbot
}
上記のconf
ファイル作成後、nginx -t
で構文チェックあとに再起動します。
nginx -t
service nginx restart
ちなみにすでに証明書はcertbot
で取得しちゃっていました。
certbot --nginx -d git.soulminingrig.com
これでアクセスできるようになりました。
おわりに
これで非常に軽量にGitのウェブフロントエンドを構築できました。
非常に少ないリソースで構築することができるので、なかなか満足しています。
それではまた。よろしくおねがいします。