在FreeBSD + fcgiwrap + cgit上建立Git Web前端和Git伺服器
大家好,我是無能。
不久前我還在使用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前端。
由於能夠以極少的資源進行建置,我相當滿意。
那麼,下次再見。請多關照。