轻量级 GitHub 加速网关。把任意公开 GitHub 链接拼在 gh.balong.in/ 后面,通过美国 CN2 节点中转下载——无需 Token、无需代理配置、无需修改 ~/.gitconfig。
# 下载文件
curl -LO https://gh.balong.in/https://github.com/owner/repo/releases/download/v1/app.tar.gz
# Raw 单文件
curl https://gh.balong.in/https://raw.githubusercontent.com/owner/repo/main/README.md
# Git clone(流式转发 git-upload-pack,禁止 push)
git clone https://gh.balong.in/https://github.com/owner/repo.git| 路由 | 用途 |
|---|---|
/https://github.com/... |
前缀代理(推荐)—— 任意公开 GitHub 链接 |
/https://raw.githubusercontent.com/... |
前缀 Raw |
/raw/{owner}/{repo}/{40位SHA}/{路径} |
按提交 SHA 锁定文件,缓存最长 |
/archive/{owner}/{repo}/{ref}.zip 或 .tar.gz |
按分支/Tag/SHA 打包源码 |
/release/{owner}/{repo}/{tag}/{文件名} |
Release 附件下载 |
服务器解析 URL 中嵌入的域名,与精确白名单比对:
github.com
raw.githubusercontent.com
codeload.github.com
api.github.com
objects.githubusercontent.com
release-assets.githubusercontent.com
github-releases.githubusercontent.com
非白名单主机、端口、URL 凭据一律拒绝(400)。GitHub Release 下载的 302 重定向链逐跳验证 DNS → 公共 IP → 白名单,遇到未知目标域名失败关闭而非临时放行。
路径匹配 owner/repo/info/refs 或 owner/repo/git-upload-pack 时,透传 Git 原生协议:
git-upload-pack(clone / fetch):POST 流式转发,请求体最多 32 MiBgit-receive-pack(push):返回 403,永不转发- Git 协商响应带
Cache-Control: no-store,不落缓存
Nginx 缓存成功的 GET / HEAD 响应,上限 12 GB,14 天无访问淘汰。Range 请求和 Git 响应绕过缓存。
- 私有仓库或任何需要 GitHub Token 的操作
- Git push(
git-receive-pack) - Git LFS(独立协议,不做代理)
- 任意 URL 代理(仅精确白名单 GitHub 主机)
- GitHub API 通用代理(仅用到归档/Release 元数据的最少路径)
需要一台 Debian 12 机器、一个域名和 Cloudflare(或其他 DNS 服务商)。纯 Node.js 20 + Nginx,无框架、无构建步骤。
公网 → Nginx :443 → Node.js :3689 (localhost) → GitHub
├─ proxy_cache / rate limit
└─ TLS (Let's Encrypt + certbot)
以下假设域名为 example.com,服务器已安装 Debian 12 minimal。
apt-get update && apt-get install -y nginx certbot xz-utils curl
# 安装 Node.js 20(Debian 12 自带 v18,不够用)
# 方式 A:官方二进制(推荐)
V=20.19.5
curl -fsSLO https://nodejs.org/dist/v$V/node-v$V-linux-x64.tar.xz
curl -fsS https://nodejs.org/dist/v$V/SHASUMS256.txt \
| grep "node-v$V-linux-x64.tar.xz$" | sha256sum -c -
tar -xJf node-v$V-linux-x64.tar.xz -C /usr/local --strip-components=1
node --version # 应输出 v20.19.5useradd --system --home /opt/gh-accel --shell /usr/sbin/nologin gh-accel
install -d -o gh-accel -g gh-accel -m 0750 /opt/gh-accel /opt/gh-accel/releases
install -d -m 0755 /var/www/acme /var/cache/nginx/gh-accel# 克隆本仓库到服务器
cd /tmp
git clone https://github.com/balongTTY/gh-accel.git
# 安装到 /opt/gh-accel/releases/v1
install -d -o gh-accel -g gh-accel /opt/gh-accel/releases/v1
cp -a gh-accel/server.js gh-accel/package.json gh-accel/package-lock.json gh-accel/public \
/opt/gh-accel/releases/v1/
chown -R gh-accel:gh-accel /opt/gh-accel/releases/v1
cd /opt/gh-accel/releases/v1
# 以 gh-accel 用户安装依赖
sudo -u gh-accel npm ci --omit=dev
# 创建 current 软链
ln -sfn /opt/gh-accel/releases/v1 /opt/gh-accel/currentcp /tmp/gh-accel/deploy/gh-accel.service /etc/systemd/system/gh-accel.service
systemctl daemon-reload
systemctl enable --now gh-accel
systemctl status gh-accel --no-pager
# 确认 Active: active (running)默认绑定 127.0.0.1:3689,不暴露公网。检查:
curl -fsS http://127.0.0.1:3689/healthz
# 应输出 {"ok":true}5a. 先部署 HTTP 引导配置,用于申请证书
cp /tmp/gh-accel/deploy/nginx-bootstrap.conf /etc/nginx/sites-available/gh-accel
rm -f /etc/nginx/sites-enabled/default # 移除 Debian 自带默认站点
ln -sfn /etc/nginx/sites-available/gh-accel /etc/nginx/sites-enabled/gh-accel
nginx -t && systemctl reload nginx5b. 申请 Let's Encrypt 证书
certbot certonly --webroot -w /var/www/acme -d example.com --non-interactive \
--agree-tos --email your@email.com5c. 切换到完整 TLS 配置
cp /tmp/gh-accel/deploy/nginx-gh-accel.conf /etc/nginx/sites-available/gh-accel
# 编辑文件,把所有 gh.balong.in 替换为你的域名
sed -i 's/gh\.balong\.in/example.com/g' /etc/nginx/sites-available/gh-accel
# 修改证书路径
sed -i 's|/etc/letsencrypt/live/gh.balong.in/|/etc/letsencrypt/live/example.com/|g' \
/etc/nginx/sites-available/gh-accel
nginx -t && systemctl reload nginx5d. 证书自动续期
certbot 会安装 systemd timer 自动续期。如需续期后 reload nginx,编辑续期配置:
# 为已有证书添加 post-hook
echo "deploy_hook = systemctl reload nginx" \
>> /etc/letsencrypt/renewal/example.com.conf# 本例使用 nftables
nft add table inet filter 2>/dev/null || true
nft add chain inet filter input '{ type filter hook input priority filter; policy drop; }' 2>/dev/null || true
nft add rule inet filter input iifname lo accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ip protocol icmp limit rate 5/second accept
nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input tcp dport 80 accept
nft add rule inet filter input tcp dport 443 accept
# 持久化(Debian 12)
nft -f /etc/nftables.conf 2>/dev/null || echo "请手动持久化你的 nftables 规则"在 DNS 控制台(Cloudflare / DNSPod 等)添加一条 A 记录:
| 类型 | 名称 | 值 |
|---|---|---|
| A | example.com | <服务器公网 IP> |
注意:必须用 DNS-only(灰云)模式——普通橙云代理(CDN)不支持 Git 协议和大文件流。
验证:
dig +short A example.com @1.1.1.1
# 应返回服务器 IP
curl -fsS https://example.com/healthz
# 应输出 {"ok":true}服务端环境变量(systemd 里设):
| 变量 | 默认值 | 说明 |
|---|---|---|
HOST |
127.0.0.1 |
绑定地址 |
PORT |
3689 |
监听端口 |
CONNECT_TIMEOUT_MS |
30000 |
上游连接超时(毫秒) |
IDLE_TIMEOUT_MS |
120000 |
数据块间最大空闲时间(毫秒) |
Nginx 侧关键参数(在 nginx-gh-accel.conf 中调整):
| 参数 | 默认值 | 说明 |
|---|---|---|
| 下载缓存 | 12 GB · 14 天 inactive | proxy_cache_path |
| 请求速率 | 600 次/分钟/IP | limit_req_zone |
| 并发连接 | 10/IP | limit_conn_zone |
| Git 请求体上限 | 32 MiB | client_max_body_size |
| 下载超时 | 15 分钟 Nginx + 120 秒 Node 空闲 | proxy_read_timeout |
# 指向上一个版本
ln -sfn /opt/gh-accel/releases/<上一版本> /opt/gh-accel/current
systemctl restart gh-accel
nginx -t && systemctl reload nginxgit pull
V=v2
install -d -o gh-accel -g gh-accel /opt/gh-accel/releases/$V
cp -a server.js package.json public /opt/gh-accel/releases/$V/
cd /opt/gh-accel/releases/$V && sudo -u gh-accel npm ci --omit=dev
ln -sfn /opt/gh-accel/releases/$V /opt/gh-accel/current
systemctl restart gh-accelMIT — 详见 LICENSE。