GitWeb + Nginx 搭建微型代码库

安装组件:

1
2
3
4
5
# 安装 nginx+扩展功能
sudo apt install nginx nginx-extras

# 安装 git/gitweb/fcgi
sudo apt install git gitweb fcgiwrap

默认创建 git 用户, 所有功能基于 git 用户操作

创建项目信息和权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 设置全局用户/邮箱
git config --global user.name 'MeteorCat'
git config --global user.email '[email protected]'

# 加入权限组, 把 nginx 默认组追加到 git
sudo usermod -a -G git www-data

# 创建代码仓库目录, 这里创建根目录
sudo mkdir /projects
sudo chown -R git:git /projects

# 部署配置, 用于测试
cd /projects
sudo -u git git init --bare mix-game.git

# 创建 http 设置支持
cd mix-game.git
sudo -u git git config --file config http.receivepack true

修改 GitWeb 配置内容:

1
2
3
4
5
6
# 安装之后会追加该配置文件
sudo vim /etc/gitweb.conf

# 内部内容基本上只需要单个配置
## path to git projects (<project>.git)
## $projectroot = "/projects";

启用 fcgiwrap, 让其启动并设置开机启动:

1
2
sudo systemctl restart fcgiwrap.service
sudo systemctl enable fcgiwrap.service

配置 Nginx 服务文件( /etc/nginx/conf.d/gitweb.conf ), 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
server {
listen 11111;
server_name _;

# 默认静态文件
location ~* ^.+\.(css|js|png|jpg|jpeg)$ {
root /usr/share/gitweb;
access_log off;
expires 24h;
}

# 挂起GitWeb服务
location / {
root /var/www;
fastcgi_param SCRIPT_FILENAME /usr/share/gitweb/gitweb.cgi;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
}

# 静态文件展示
location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
root /projects;
}

# 转发 git-http-backend, 内部转发到 gitweb.cgi 对象
location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {

# 代码仓库目录
root /projects;

# 引入默认 fastcgi 变量
include /etc/nginx/fastcgi_params;

# 通知调用 git-http-backend
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;

# 如果不设置该参数, 则仅能访问明确标记为导出的git目录. 默认可以访问任何git目录
fastcgi_param GIT_HTTP_EXPORT_ALL "";

# 表示git仓库的地址, 这里直接设置 `root` 目录
fastcgi_param GIT_PROJECT_ROOT $document_root;

# 表示请求的用户
fastcgi_param REMOTE_USER $remote_user;

# 表示请求的git路径
fastcgi_param PATH_INFO $uri;

# 转发给管道通讯
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
}

之后访问局域网就能看到挂起的服务对象:

image

如果想拉取代码直接常规 clone 即可:

1
2
# 拉取代码, 这里没有设置安全加密提交代码也不需要账号密码, 公网切勿这样处理
git clone http://192.168.1.111:11111/mix-game.git

image