案例 release-hub:用一份 manifest.json 自托管桌面应用更新,不依赖 GitHub Releases

2026-10-01 21:02:26

release-hub:用一份 manifest.json 自托管桌面应用更新,不依赖 GitHub Releases

release-hub 是一个自托管的桌面应用发行与更新服务。它用一份 manifest.json 契约,给桌面客户端(Electron / Wails / Tauri / 原生)提供统一的版本检查与下载分发,发行渠道不依赖 GitHub Releases 或 App Store。

单二进制加 SQLite,一个 Docker 镜像部署整站,数据集中在一个 volume 里。多应用托管——一个 Hub 可以管名下所有桌面产品;管理后台与游客下载页前后端一体。

仓库地址:

功能

  • 多应用管理:slug、名字、描述、图标。
  • Release 上传:支持任意二进制(exe / dmg / AppImage / zip),流式写盘 + 流式 SHA-256。
  • 双 channel:Stable / Beta,关键更新用 is_critical 标记。
  • 草稿状态:可以处于「未发布」状态。
  • 游客下载页:打开 hub.yourdomain.com/ 即看到公开应用;/apps/:slug 展示已发布的 stable 版本,支持下载历史版本,changelog 按 Markdown(GFM)渲染;beta 对游客不可见。
  • 公开 manifest API:
GET /api/public/apps/:slug/manifest.json?channel=stable

技术栈

  • 后端:Go 1.22+ · Gin · modernc.org/sqlite(纯 Go,无需 CGO)· golang-migrate
  • 前端:React 18 + Vite + TypeScript + Tailwind + Zustand + React Router
  • 部署:三阶段 Dockerfile → Alpine 运行时约 30MB,数据在 /data volume

生产部署:Docker + Nginx Proxy Manager

docker-compose.yml 默认加入一个名为 npm 的外部网络用于对接 NPM;如果你的网络名不同,改 networks.npm.name。

docker compose up -d --build
docker compose logs -f release-hub

在 NPM 里配置 Proxy Host:

  • Domain:hub.yourdomain.com
  • Scheme:http
  • Forward Hostname:release-hub
  • Forward Port:8082
  • SSL:Let's Encrypt + Force SSL + HTTP/2 + HSTS
  • Advanced 里放开大文件上传:
client_max_body_size 500M;
proxy_read_timeout 300s;
proxy_send_timeout 300s;

路径划分:/ 是游客下载页,/admin 是管理后台登录。

CI 自动上传

用 API Token 在 CI 里直接推送构建产物:

curl -X POST "$HUB_URL/api/admin/apps//releases" \
-H "Authorization: Bearer $RELEASE_HUB_TOKEN" \
-F file=@./dist/my-app-1.0.0.zip -F version=1.0.0 -F channel=stable \
-F 'changelog=## v1.0.0' -F is_critical=false -F published=true

channel 决定这条 release 落到 stable 还是 beta 通道,is_critical 标记关键更新,published=false 则先存成草稿。上传走的是一次 multipart 请求,file 字段是构建产物的路径,changelog 支持 GFM,会在下载页按 Markdown 渲染。

客户端拿到公开 manifest 后自行比对版本号与 SHA-256,再决定是否下载。因为契约只有一份 manifest.json,Electron、Wails、Tauri 或原生客户端可以用同一套检查逻辑,不需要为每个产品单独搭一套更新接口。

复制全文 生成海报 Go 自托管 Docker 桌面应用更新 SQLite

推荐文章

程序员茄子在线接单