使用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套接字以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。

nginx -t
service nginx restart

顺便说一下,证书我已经通过certbot获取了。

certbot --nginx -d git.soulminingrig.com

现在可以访问了。

结语

通过这种方式,我成功构建了一个非常轻量级的Git Web前端。
由于可以用极少的资源进行构建,我相当满意。

那么下次再见。请多关照。