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のウェブフロントエンドを構築できました。
非常に少ないリソースで構築することができるので、なかなか満足しています。

それではまた。よろしくおねがいします。

PGP --- Contact --- Machines