使用cgit和gitolite搭建个人git服务器

最近有打算使用私有 Git 服务器并且可提供以对外部公共访问的需求,本文将简单记录如何配置一个属于自己的私有 Git 服务器。

安装

创建 Git 用户

添加一个 Git 的专属用户:

$ sudo adduser --system --group --disabled-password --home /var/lib/git git

指定 Git 的 shell:

$ sudo chsh -s /bin/fish git:

切换到新建的 Git 用户并跳转至其家目录:

$ sudo su - git

构建 gitolite

其他具体细节可以查看 Gitolite README

clone gitolite 的源码:

$ git clone https://github.com/sitaramc/gitolite
$ mkdir -p $HOME/bin
$ gitolite/install -to $HOME/bin

添加自己的公钥:

$ HOME/bin/gitolite setup -pk YourName.pub

构建 cgit

安装一些基本的构建需要的工具:

$ apt install build-essential

clone cgit 的源码:

$ git clone https://git.zx2c4.com/cgit

初始化 git 子模块并进行源码拉取:

$ git submodule init
$ git submodule update

如果网速过慢的话手动进行深度为 1 的 clone:

$ git clone https://git.kernel.org/pub/scm/git/git.git --depth 1

安装 fcgiwrap

$ sudo apt install fcgiwrap

将 www-data 添加至 git 组:

$ sudo usermod -aG git www-data

配置

nginx 配置

将下列 snippet 插入到 Nginx 配置中,其他细节可按需修改。

server {
    server_name  git.cyunrei.moe;

    listen [::]:80;
    listen 80;

    access_log  /var/log/nginx/cgit-access.log;
    error_log   /var/log/nginx/cgit-error.log;

    root /var/www/html/cgit/cgi;
    try_files $uri @cgit;

    location @cgit {
        include          fastcgi_params;
        fastcgi_param    SCRIPT_FILENAME /var/www/html/cgit/cgi/cgit.cgi;
        fastcgi_pass     unix:/run/fcgiwrap.socket;

        fastcgi_param    PATH_INFO    $uri;
        fastcgi_param    QUERY_STRING $args;
        fastcgi_param    HTTP_HOST    $server_name;
    }
}

gitolite 配置

生成默认的配置文件,并修改 UMASK 权限:

$ bin/gitolite print-default-rc > .gitolite.rc
$ vim .gitolite.rc

找到 UMASK 将其改为 0027 ,这样就可以将新建的文件赋予组可读权限,方便 fastcgi 通过 www-data 组访问。

cgit 配置

编辑 cgit 的配置:

$ cd /var/www/html/cgit/
$ sudo vim cgitrc

下面是我个人的测试配置,有其他的需求可以到这个网站上查看。

# Page config
virtual-root=/
root-title=Cyunrei’s Git
root-desc=
footer=

# Ban robots index
robots=noindex, nofollow

# HTTPS clone
clone-prefix=https://git.cyunrei.moe
enable-http-clone=1

# Enable snapshots
snapshots=tar.gz zip

# Disable owner index
enable-index-owner=0

# Caching
cache-dynamic-ttl=60
cache-static-ttl=44640
cache-root-ttl=6
cache-repo-ttl=120

# README
readme=:README.md
readme=:readme.md

# Git projects
# scan-path=/var/lib/git/repositories
# project-list=/var/lib/git/projects.list

section=Miscellaneous
repo.url=testing.git
repo.desc=This repo is used for testing git clone :)
repo.path=/var/lib/git/repositories/testing.git

总结

使用 Cgit 和 gitolite 托管代码时大致流程如下。

浏览器浏览 cgit:

nginx -> fastcgi -> cgit [(www-data) read repo]

提交 git 请求:

git -> ssh -> gitotlite [(git) write repo]

参考链接