一行命令自建 GitHub 加速代理,告别几 KB/s 的下载噩梦。本文含实测部署命令与成功标志
GHFAST_READY=1,可直接复制使用。
一、痛点:每个开发者都被 GitHub 限速支配过
凌晨三点,你的 CI 跑到第 47 步,卡在了下载一个 30MB 的 release 资产。10 分钟过去,进度条只挪了 5%——典型的 128KB/s,甚至经常掉到 0,然后 timeout 退出,整个 pipeline 失败回滚,你只能手动触发重跑,继续等。这不是个例,而是在国内访问 GitHub Release、Raw 内容时,几乎所有开发者都体验过的”基础设施级”痛点。
常见的几种绕路方案各有代价,没有一个是真正省心的。公共 GitHub 加速站点是免费午餐,但限速、排队严重,而且随时可能停服跑路;走全局代理 VPN 影响其他流量,很多公司网络也明令禁止;修改 hosts 的方案命中率很低,因为 GitHub Release 资产实际走的是 objects.githubusercontent.com,IP 经常变动;手动改 URL 走国内镜像又增加了心智负担,每次下载都要改造一遍。开发者真正需要的,是一个自己能控制、部署简单、能复用、能加缓存的 GitHub 加速层——这就是 GHFast 要解决的问题。
二、GHFast 是什么:一个能自托管的 GitHub 反代
GHFast(cshdotcom/ghfast)是一个开源的、自托管的 GitHub 加速服务。简单说,你把它部署在自己的服务器上,它会替你向 GitHub 发起请求,把响应转发给你,顺便把热点资产缓存到本地,后续命中缓存时直接走本地存储,不再回源。它的定位很清晰:是 ghproxy 这类公共服务的自托管替代品,不是要替代 git clone 本身,而是解决 GitHub 资产下载(raw、release、archive)在特定网络环境下的慢速问题。
它最打动人的特性有三个。第一,零配置部署:官方提供 install.sh 一键脚本,自动下载预编译包、初始化本地 SQLite、启动服务、做健康检查,整个过程不到 30 秒。第二,自托管可控:不依赖任何公共服务,你部署在哪台机器上,这就是你的私有加速节点;团队共享一个,资源池化更划算,也不必担心哪天公共代理突然下线。第三,预编译免编译:Linux x86_64 直接用编译好的 standalone 包,不需要 Node 项目那一套 install/build 流程,这对 CI 环境特别友好——拉一个 tar 包解压就能跑,不污染系统依赖。
三、原理简介:它是怎么把 GitHub 资产变快的
GHFast 的核心机制可以用一句话概括:URL 重写 + 反向代理 + 本地缓存。这三层叠加在一起,构成了它”快”的全部秘密。
URL 重写。用户访问 GHFast 时,把原始 GitHub URL 拼接到 GHFast 的路径后面,例如原始链接 https://github.com/owner/repo/releases/download/v1.0.0/asset.tar.gz 会被改写成 http://your-ghfast:3000/gh/https/github.com/owner/repo/releases/download/v1.0.0/asset.tar.gz。GHFast 收到请求后,从路径中解析出真实的 GitHub URL,作为反向代理向 GitHub 发起请求,把响应字节流式转发给客户端。这种”前缀拼接”模式的好处是不需要修改客户端代码,任何 HTTP 工具(curl、wget、浏览器)都能直接使用。
反向代理。服务端到 GitHub 的网络环境通常比客户端直接访问要好——尤其当你的 GHFast 部署在网络条件好的机房或者海外节点时,回源速度天然就更快。同时,服务端可以做连接复用、HTTP/2 多路复用等优化,减少握手开销。这意味着即使不考虑缓存,GHFast 单纯作为透传代理也能带来显著的下载提速,因为它把”客户端 → GitHub”这一段拥堵链路换成了”客户端 → GHFast → GitHub”的更优路径。
本地缓存。GHFast 内置 SQLite(db/custom.db)作为元数据存储,记录每个 URL 对应的缓存状态。首次下载后,资产会被缓存到本地磁盘;相同 URL 再次被请求时,直接从本地读取返回,完全不再回源 GitHub。这意味着团队内第二个、第三个人下载同一个 release,几乎是秒级返回。健康检查端点 /api/stats 还会返回缓存命中率、流量统计等指标,部署脚本用这个端点做 30 秒内的健康轮询,确认服务真正起来再宣布成功。
四、一键部署:两行命令,30 秒搞定
下面这套命令是本文在 Linux 环境实测跑通的,部署成功后会输出 GHFAST_READY=1 作为完成标志,适合写进自动化脚本或者 CI/CD pipeline。
系统要求
- Linux x86_64(非 x64 架构会回退到源码构建方案,脚本会给出对应提示)
- Node.js ≥ 20 或者 Bun 运行时
- curl
- 一个空闲端口(默认 3000)
部署命令
curl -fsSL https://github.com/cshdotcom/ghfast/releases/latest/download/install.sh -o install.sh
bash install.sh --dir ./ghfast --port 3000
就这么两行。脚本做了以下事情:首先做环境检测,检查 curl、Node ≥ 20 / Bun 是否可用,自动选择运行时;然后从 GitHub Release 拉取 ghfast-standalone-linux-x64.tar.gz(latest 永远指向最新版本,无需调 GitHub API,规避匿名限流);接着解压部署到 --dir 指定目录,默认是当前目录下 ghfast/;之后做数据库初始化,包内自带 db/custom.db,自动生成 .env 写入 DATABASE_URL(使用绝对路径,迁移目录后依然有效);再用 nohup 后台启动服务,日志写入 ghfast/ghfast.log,PID 写入 ghfast/ghfast.pid;最后做健康检查,对 http://localhost:3000/api/stats 轮询 30 秒,HTTP 200 才算成功。
成功标志
部署成功时,脚本最后会输出三行机器可解析的标志:
GHFAST_READY=1
GHFAST_URL=http://localhost:3000
GHFAST_DIR=/home/z/your-path/ghfast
如果你的 CI 脚本要判断是否部署成功,直接 grep 这个标志即可:
output=$(bash install.sh --dir ./ghfast --port 3000)
if echo "$output" | grep -q "GHFAST_READY=1"; then
echo "部署成功,GHFast 已就绪"
fi
关键路径速查表
| 用途 | 路径或命令 |
|---|---|
| 安装目录 | ./ghfast/ |
| 访问地址 | http://localhost:3000 |
| 运行日志 | ./ghfast/ghfast.log |
| 进程 PID | ./ghfast/ghfast.pid |
| 停止服务 | bash ./ghfast/stop.sh |
| 重启服务 | nohup bash ./ghfast/start.sh > ./ghfast/ghfast.log 2>&1 & |
手动验证健康检查
部署脚本本身已经做了健康检查,但如果你想再次确认服务还活着:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/api/stats
# 期望输出: 200
返回 200 即代表服务正常,缓存层和反代层都在工作。返回非 200 或者连接拒绝时,先看 ghfast/ghfast.log 排查;最常见的原因是端口被其他进程占用,换一个端口重新部署即可。
五、使用方法:三种典型场景
1. 直接拼接直链(最快上手)
把 GitHub 资产 URL 前面加上 http://your-host:3000/gh/ 即可,这是最直接的用法,适合脚本和命令行场景:
# 原始下载(慢)
wget https://github.com/owner/repo/releases/download/v1.0.0/asset.tar.gz
# GHFast 加速(快)
wget http://localhost:3000/gh/https/github.com/owner/repo/releases/download/v1.0.0/asset.tar.gz
注意拼接的格式是 /gh/<原始URL>,原始 URL 必须包含 https:// 协议头,否则 GHFast 无法正确解析目标地址。
2. Web 界面粘贴(适合偶尔下载)
浏览器访问 http://localhost:3000,页面提供了一个输入框,粘贴 GitHub 链接点击下载,GHFast 会自动重写到加速 URL。适合偶尔下载一个 release 的场景,不需要记拼接规则,也不需要复制粘贴改 URL。
3. CI/CD 集成(收益最大)
在 GitLab CI / GitHub Actions / Jenkins 里,把所有 GitHub 资产下载的 URL 都改走 GHFast,这是收益最大的用法。团队内多个 job 下载同一个 release 时,第一个 job 回源,后续 job 全部走缓存,跑得飞快:
# GitLab CI 示例
stages:
- build
build:
script:
- ASSET_URL="http://ghfast.internal:3000/gh/https/github.com/owner/repo/releases/download/v1.0.0/asset.tar.gz"
- curl -fsSL -o asset.tar.gz "$ASSET_URL"
- tar -xzf asset.tar.gz
把 ghfast.internal 换成你部署 GHFast 的机器内网域名,整条 pipeline 的 GitHub 依赖下载都会立竿见影地提速。
六、收尾:适合谁,可以怎么玩
GHFast 适合三类典型场景。团队内部:统一一个 GHFast 实例,所有 CI 共享缓存,流量成本和耗时都同时降下来,这是 ROI 最高的用法。个人开发者:自己 VPS 上跑一个,日常拉 GitHub release 不再卡顿,部署成本就两行命令,几乎为零。海外节点反代:在海外服务器部署 GHFast,再回国拉取,绕过国内到 GitHub 的拥堵链路,稳定性和速度都能拉满。
更进一步可以做的事也不少:配 systemd unit 让它开机自启,服务挂掉自动拉起,稳定性接近系统级守护;套 nginx 反向代理,加上 HTTPS 和域名,变成团队正式的内部加速服务,接入成本对调用方完全透明;监控 /api/stats 端点,接 Prometheus 采集缓存命中率指标,看清楚到底是哪些 release 在被反复下载。脚本本身是幂等的,定期重新跑一次 bash install.sh 就是平滑升级,不需要停服维护,也不用担心版本对不上。
本文实测的两行命令,从下载到健康检查通过,在普通 Linux 机器上耗时不到 30 秒。比起折腾各种 hosts、代理、镜像,这种”自托管 + 一键部署”的方式,可控性和稳定性都强得多。下一次 GitHub 下载又卡住的时候,试试 GHFast,你会回来感谢这两行命令的。








暂无评论内容