在FreeBSD + fcgiwrap + cgit上建立Git Web前端和Git伺服器

4 min

language: ja bn de en es fr hi ko pt ru zh-cn zh-tw

大家好,我是無能。
不久前我還在使用GItea進行建置,但它過於豐富且佔用了不必要的伺服器資源,所以我一直想改進這一點。
此外,我也想盡可能地透過CLI建立基本儲存庫。雖然Github有gh指令,但我不想私自採用這種依賴平台的指令,所以沒有導入。
這是因為依賴平台的二進位檔在底層學習方面沒有太多幫助。

因此,我另外採用了cgit作為git的Web前端,並透過SSH將git儲存在遠端,從而實現了預期的建置。

讓git能夠push

換句話說,只需在Git伺服器端建立一個裸儲存庫,然後能夠push到那裡即可。
前提是已經可以透過SSH連接到遠端,這次是Git伺服器端。

建立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 socket以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設定

接下來是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 Web前端。
由於能夠以極少的資源進行建置,我相當滿意。

那麼,下次再見。請多關照。