跳到主要内容
  1. 所有文章/

使用 cgit 托管小小的也很可爱的 Git 服务器

·1630 字·约 4 分钟

简介 #

cgit 是一个用 C 编写的用于 Git 存储库的超高速前端用户界面,特点:简单、强大。谁在使用?比如:https://git.kernel.org/

cgit
cgit

准备环境 #

前置条件:在 Debian 11 上已安装 nginx, git, vim 等软件包

必需软件包 #

安装 apache2-utils 用于 HTTP 基本认证管理,fcgiwrap 用于将 CGI 脚本转发到 FastCGI 进程和 Web 服务器通信

sudo apt update \
sudo apt install -y apache2-utils fcgiwrap

添加 git 用户 #

sudo adduser git

# 用于 cgit 展示当前存储库所有者信息
sudo usermod -c "<Owner Name>" git

su git  # 切换用户
cd  # 回到 git 用户主目录 /home/git

创建存储库 #

初始化第一个裸存储库

# 设置默认分支名称
git config --global init.defaultBranch master
git init --bare yourepo.git
cd yourepo.git

# 用于 cgit 展示当前存储库描述信息
echo "A simple, minimal and safe URL Shortener." > description

git update-server-info

设置权限和用户组

sudo chown -R git:www-data /home/git/
sudo chmod -R ug+rwX /home/git/

如果每次创建裸存储库都这样未免有点繁琐,我写了一个简单的 Shell 脚本

wget https://git.xvo.es/self-hosted/plain/cgit/git-bare
sudo mv ./git-bare /usr/local/bin/git-bare
sudo chmod +x /usr/local/bin/git-bare

初始化新的裸存储库,只需要

sudo git-bare

脚本会提示您输入存储库名称和描述等基本信息并完成初始化

缓存路径 #

创建路径 /var/cache/cgit 用于 cgit 缓存

sudo mkdir -p /var/cache/cgit
sudo chgrp www-data /var/cache/cgit
sudo chmod 775 /var/cache/cgit

安装 cgit #

当前 cgit 项目依然算是活跃,考虑到它最近的正式发行版是 3 年前了,本文将从源码开始构建1,以帮助我们获取最新的错误修复和补丁

git clone https://git.zx2c4.com/cgit \
&& cd cgit \
&& git submodule init \
&& git submodule update

cgit.conf 包含了 cgit 构建时可以覆盖的配置

sed -n '3,31p' Makefile > cgit.conf

按需编辑它

CGIT_VERSION = v1.2.3
CGIT_SCRIPT_NAME = cgit.cgi
CGIT_SCRIPT_PATH = /var/www/cgit  # 本文只改了这里
CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH)
CGIT_CONFIG = /etc/cgitrc  # 默认配置文件路径
CACHE_ROOT = /var/cache/cgit
prefix = /usr/local
libdir = $(prefix)/lib
filterdir = $(libdir)/cgit/filters
docdir = $(prefix)/share/doc/cgit
htmldir = $(docdir)
pdfdir = $(docdir)
mandir = $(prefix)/share/man
SHA1_HEADER = <openssl/sha.h>
GIT_VER = 2.39.0
GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
INSTALL = install
COPYTREE = cp -r
MAN5_TXT = $(wildcard *.5.txt)
MAN_TXT  = $(MAN5_TXT)
DOC_MAN5 = $(patsubst %.txt,%,$(MAN5_TXT))
DOC_HTML = $(patsubst %.txt,%.html,$(MAN_TXT))
DOC_PDF  = $(patsubst %.txt,%.pdf,$(MAN_TXT))

ASCIIDOC = asciidoc
ASCIIDOC_EXTRA =
ASCIIDOC_HTML = xhtml11
ASCIIDOC_COMMON = $(ASCIIDOC) $(ASCIIDOC_EXTRA)
TXT_TO_HTML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_HTML)

开始编译,如果不需要 lua 支持

make NO_LUA=1

建议开启对 lua 的支持,设置个性化功能时会十分有用

# 本文以 lua5.2 为例
sudo apt install liblua5.2-0 liblua5.2-0-dbg liblua5.2-dev lua5.2
make LUA_PKGCONFIG=lua5.2

安装

sudo make install

稍微注意下文件路径

# 输出信息
    SUBDIR git
install -m 0755 -d /var/www/cgit  # cgit 网站路径
install -m 0755 cgit /var/www/cgit/cgit.cgi
install -m 0755 -d /var/www/cgit
install -m 0644 cgit.css /var/www/cgit/cgit.css
install -m 0644 cgit.js /var/www/cgit/cgit.js
install -m 0644 cgit.png /var/www/cgit/cgit.png
install -m 0644 favicon.ico /var/www/cgit/favicon.ico
install -m 0644 robots.txt /var/www/cgit/robots.txt
install -m 0755 -d /usr/local/lib/cgit/filters
cp -r filters/* /usr/local/lib/cgit/filters

配置 cgit #

安装一些基础包,用于 cgit 的代码高亮、Markdown 渲染、Gravatar 头像渲染等

sudo apt install -y python3-docutils python3-markdown highlight python3-pygments
sudo mkdir -p /usr/local/share/cgit
sudo cp -r /usr/local/lib/cgit/filters /usr/local/share/cgit/
sudo chown -R www-data:www-data /usr/local/share/cgit/

# 编译安装 LuaoSSL
# https://25thandclement.com/~william/projects/luaossl.html
git clone https://github.com/wahern/luaossl.git && cd luaossl
make LUAPKG=lua5.2
sudo make install LUAPKG=lua5.2

# 给下面使用 filter api 的脚本赋予可执行权限,比如
sudo chmod +x /usr/local/share/cgit/filters/email-gravatar.lua

编辑 cgit 配置文件

sudo vim /etc/cgitrc

下面是一个示例配置,更多可用的配置项及其说明请参阅 cgitrc.5.txt

# 包含 cgit 的所有运行时设置
# 格式 NAME=VALUE
# 以 "#" 开头的行是注释

# 全局配置
css=/cgit.css
logo=/cgit.png
favicon=/favicon.ico
#footer=
virtual-root=/
# 禁用哑克隆
enable-http-clone=0
# Smart HTTP
clone-url=https://git.xvo.es/$CGIT_REPO_URL
root-title=GIT.XVO.ES
root-desc=Dejavu Moe's Git Server
#root-readme=/var/www/htdocs/about.html

# 建议配置
enable-index-owner=1
enable-index-links=1
enable-blame=1
enable-log-filecount=1
enable-log-linecount=1
enable-commit-graph=1

# 禁止搜素引擎索引
robots=noindex, nofollow

branch-sort=age
commit-sort=date
max-stats=quarter
snapshots=tar.gz zip

# 使用 RAM 的缓存大小 单位 MB
cache-size=1024

# 代码高亮
source-filter=/usr/local/share/cgit/filters/syntax-highlighting.py

# 格式化贡献者,显示Gravar 头像
email-filter=lua:/usr/local/share/cgit/filters/email-gravatar.lua

# 格式化 about 页面
about-filter=/usr/local/share/cgit/filters/about-formatting.sh
readme=:README.md
readme=:readme.md
readme=:README.txt
readme=:readme.txt
readme=:README
readme=:readme

# MIME 类型
mimetype.html=text/html
mimetype.gif=image/gif
mimetype.jpg=image/jpeg
mimetype.jpeg=image/jpeg
mimetype.png=image/png
mimetype.webp=image/webp
mimetype.pdf=application/pdf
mimetype.svg=image/svg+xml

# 移除 .git 后缀
remove-suffix=1

# 扫描路径
scan-path=/home/git

# 每个存储库配置
#repo.url=reponame
#repo.path=/home/git/reponame.git
#repo.desc=Some description here
#repo.owner=Owner Name
#repo.logo=/repo-logo.png

代码高亮风格 #

上面的代码高亮脚本使用的是 Pygments,您可以修改代码高亮的风格

sudo vim /usr/local/share/cgit/filters/syntax-highlighting.py

# pastie 是默认的代码高亮风格
formatter = HtmlFormatter(style='pastie', nobackground=True)

如果想要更加细粒度的控制每个存储库的访问,可参阅 cgit-simple-authentication

Gravatar 头像优化 #

我们启用了显示提交者头像的 lua 脚本,会发现它和 cgit 官网 上有一点不一样,我们的小头像鼠标经过的时候怎么不会悬浮变大呢?

我在 cgit 的邮件列表2上找到了实现方式的说明

新建一个 lua 脚本,写入 email-libravatar-korg.lua 的内容

sudo vim /usr/local/share/cgit/filters/email-libravatar-korg.lua

Gravatar 官方源在国内太慢,您可以替换成其他可用的镜像源

修改脚本后,别忘了设置用户组和可执行权限

sudo chown -R www-data:www-data /usr/local/share/cgit/
sudo chmod +x /usr/local/share/cgit/filters/email-libravatar-korg.lua

只有 lua 脚本还不够,在 cgit.css 里增加一段

/* libgravatar */
div#cgit span.libravatar img.onhover {
  display: none;
  border: 1px solid gray;
  padding: 0px;
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
  width: 128px;
  height: 128px;
}

div#cgit span.libravatar img.inline {
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  width: 13px;
  height: 13px;
  margin-right: 0.4em;
  opacity: 0.9;
}

div#cgit span.libravatar:hover > img.onhover {
  display: block;
  position: absolute;
  margin-left: 1.5em;
  background-color: #eeeeee;
  box-shadow: 5px 5px 3px #bbb;
}

修改 cgit 配置文件

email-filter=lua:/usr/local/share/cgit/filters/email-libravatar-korg.lua

配置 Nginx #

将域名解析到 VPS 的 IP3,新建 Nginx 复用配置文件

sudo vim /etc/nginx/git-http-backend.conf

写入下面内容,用于 FastCGI 进程和 Nginx 之间通信

https://git.xvo.es/self-hosted/plain/cgit/git-http-backend.conf

生成 HTTP 基本认证凭据,替换您的用户名

sudo htpasswd -c /etc/nginx/.htpasswd <username>

新建 Nginx 站点配置

sudo vim /etc/nginx/conf.d/git.xvo.es.conf

示例 cgit 站点的 Nginx 配置

https://git.xvo.es/self-hosted/plain/cgit/cgit.nginx

检查 Nginx 配置文件

sudo nginx -t

没问题就可以

sudo nginx -s reload

完成,享受吧。

My cgit
My cgit

我微调了一下样式,效果如下,链接在 cgit.css

cgit.css
cgit.css

参考信息:


  1. 开始前 sudo apt install -y gcc make ↩︎

  2. https://lists.zx2c4.com/pipermail/cgit/2014-March/002036.html ↩︎

  3. Cloudflare 可以开启 CDN 代理,注意 SSL 需要设置为完全或严格 ↩︎

Dejavu Moe
作者
Dejavu Moe
Not for success, just for growing.