Skip to content
balongTTYPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

GH / RELAY

轻量级 GitHub 加速网关。把任意公开 GitHub 链接拼在 gh.balong.in/ 后面,通过美国 CN2 节点中转下载——无需 Token、无需代理配置、无需修改 ~/.gitconfig。

⚠️ 不是任意 URL 开放代理。 只允许白名单内的 GitHub 官方域名,每跳 DNS + 重定向逐跳校验,私人仓库、Git push、Git LFS 一律拒绝。

快速开始(使用者)

# 下载文件
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 → 白名单,遇到未知目标域名失败关闭而非临时放行。

Git Smart HTTP

路径匹配 owner/repo/info/refs 或 owner/repo/git-upload-pack 时,透传 Git 原生协议:

  • git-upload-pack(clone / fetch):POST 流式转发,请求体最多 32 MiB
  • git-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。


1. 安装运行时

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.5

2. 创建系统用户和目录

useradd --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

3. 部署应用代码

# 克隆本仓库到服务器
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/current

4. 注册 systemd 服务

cp /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}

5. 配置 Nginx(HTTPS)

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 nginx

5b. 申请 Let's Encrypt 证书

certbot certonly --webroot -w /var/www/acme -d example.com --non-interactive \
  --agree-tos --email your@email.com

5c. 切换到完整 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 nginx

5d. 证书自动续期

certbot 会安装 systemd timer 自动续期。如需续期后 reload nginx,编辑续期配置:

# 为已有证书添加 post-hook
echo "deploy_hook = systemctl reload nginx" \
  >> /etc/letsencrypt/renewal/example.com.conf

6. 防火墙

# 本例使用 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 规则"

7. DNS

在 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 nginx

升级

git 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-accel

License

MIT — 详见 LICENSE。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages