惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
B
Blog
The GitHub Blog
The GitHub Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
Microsoft Azure Blog
Microsoft Azure Blog
D
DataBreaches.Net
I
InfoQ
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
腾讯CDC
H
Help Net Security

Dejavu's Blog

甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 服务器配置指南 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗?
在 Debian 上使用 stagit 和 Nginx 的简单 Git 服务器
Dejavu Moe · 2023-05-09 · via Dejavu's Blog

失败了

本来想在本文标题加个(失败了)的,但也不是全无所获,「几乎成功」了。大概是因为冷门吧,找到 stagit 与 OpenBSD 和 Apache Web 服务器的资料稍微多点,最终,我放弃了。

放弃可耻但有用!假以时日,我一定会卷土重来,完成它。如果看到这篇文章的您了解这些方面的知识,还恳请不惜赐教。

TL;DR

思路是这样的:我有个用于 Git 服务器的域名 git.dejavu.moe,Git 服务器使用 git-http-backend 提供 HTTP(S) 访问,fcgiwrap 将 CGI 程序转换为 FastCGI 进程,apache2-utils 里的 htpasswd 用于 HTTP 基本身份认证管理。

理想状况是:

  • 访问 https://git.dejavu.moe 是由 stagit 构建的静态存储库界面

  • 上面的存储库都可以被公开克隆,比如

    git clone https://git.dejavu.moe/repoA.git
    
  • 涉及到需要更改存储库的操作需要经过 HTTP 基本认证

  • 本地推送提交到 Git 服务器后,Git Hooks 自动执行 stagit 构建静态存储库页面

记录

前提:已经安装好了 git, nginx 和 stagit

软件包

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

新建用户

# 新建 git 用户
sudo adduser git

# 切换到 git 用户
su git

用户目录为 /home/git,各个存储库就像这样:

/home/git/repoA.git
/home/git/repoB.git

初始化

一个裸存储库初始化步骤如下:

git config --global init.defaultBranch master
git init repoC.git --bare --shared

cd repoC.git
vim config
# 添加两行
[http]
    receivepack = true
# 添加结束
git update-server-info
touch git-daemon-export-ok

Nginx 配置

域名解析到服务器 IP,在 Cloudflare 上可以开启小黄云,SSL 证书设置完全或严格。使用 htpasswd 设置用于 HTTP 基本身份认证的密码凭据

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

假设 /var/www/git 存放 stagit 生成的静态网页

mkdir -p /var/www/git
sudo chown -R git:www-data /var/www/git
su git
cd /var/www/git

# stagit 个性化静态文件
wget https://github.com/DejavuMoe/stagit/raw/master/style.css
wget https://github.com/DejavuMoe/stagit/raw/master/logo.png
wget https://github.com/DejavuMoe/stagit/raw/master/favicon.png

编辑

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

写入,注意 /home/git 是包含所有存储库的父级路径

fastcgi_pass unix:/var/run/fcgiwrap.socket;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /home/git;
fastcgi_param PATH_INFO $1;
fastcgi_param REMOTE_USER $remote_user;

Nginx 配置文件

server {
    listen 80;
    listen [::]:80;
    server_name git.dejavu.moe;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name git.dejavu.moe;
  
    # 包含所有 Git 存储库的路径
    root /home/git;

    # 访问日志  
    access_log /var/log/nginx/git.dejavu.moe-access.log;
    error_log  /var/log/nginx/git.dejavu.moe-error.log;
    gzip off;
    # SSL 证书路径
    ssl_certificate /etc/nginx/cert/git.dejavu.moe.pem;
    ssl_certificate_key /etc/nginx/cert/git.dejavu.moe.key;

    location / {
        root /var/www/git;
        index index.html;
        try_files $uri $uri/ =404;
    }

    location ~ /git_read(/.*) {
        include git-http-backend.conf;
    }

    location ~ /git_write(/.*) {
        # HTTP 基本认证
        auth_basic "Require password to push to git.dejavu.moe:";
        auth_basic_user_file /etc/nginx/.htpasswd;
        include git-http-backend.conf;
    }
    # 路径捕获条件匹配
    location ~ (/.*) {
        if ($arg_service = git-receive-pack) {
            rewrite (/.*) /git_write$1 last;
        }
        if ($uri ~ ^/.*/git-receive-pack) {
            rewrite (/.*) /git_write$1 last;
        }
        if ($arg_service = git-upload-pack) {
            rewrite (/.*) /git_read$1 last;
        }
        if ($uri = ^/.*/git-receive-pack) {
            rewrite (/.*) /git_read$1 last;
        }
    }
}

确定没啥问题,可以启动了

sudo nginx -t
sudo nginx -s reload

尝试手动运行 stagitstagit-index 生成静态存储库页面,打开 https://git.dejavu.moe 可以正常浏览静态存储库页面

使用

本地推送提交到 Git 服务器

git add .
git commit -m 'add something'
git remote add origin https://git.dejavu.moe/repoC.git
git push -u origin master  # 输入 HTTP 基本验证的用户名和密码

一些细节可能记不太清楚了,这并不是结束,不过,我现在要好好睡一觉,哈哈~

参考资料