背景
我在 Ubuntu 云服务器的 Docker 里跑 zcode-proxy(docker compose,镜像 ghcr.io/tridefender/zcode-proxy:latest,容器 CMD 就是 serve),桌面端是单文件 zcode-proxy.exe / --cli serve。这块目前没有任何"有新版本"的提示:
| 端 |
现在的更新体验 |
| Android |
✅ 已经有 Android-APP/app/src/main/java/com/zcode/proxy/UpdateChecker.kt:启动自动查 releases/latest、可手动"检查更新"、能"忽略此版本"、GitHub 不可达时静默失败 |
| CLI / TUI |
❌ 只有 --version 和面板横幅里的 VERSION(src/index.ts:38),要知道有没有新版得自己去 Releases 页面比对 |
| Docker |
❌ 连"镜像有新 tag 了"都不会说,只能自己想起来 docker compose pull |
VERSION 是硬编码常量(src/index.ts:38),而 .github/workflows/release.yml 的 bump job 发版时会把它改写成 tag 版本,所以"当前版本"和 releases/latest 的 tag_name 是一对可以直接比较的值。
期望
第一层(建议先做):只提示,不自动替换
- TUI /
serve 启动时查一次(或每 24h 一次)https://api.github.com/repos/TriDefender/zcode-api/releases/latest,比 VERSION 新就打印一行,例如:
- 独立二进制:
update available: v4.7.6 (current v4.7.5) — https://github.com/TriDefender/zcode-api/releases/latest
- 识别到容器环境时(
/.dockerenv 存在):update available: v4.7.6 — docker compose pull && docker compose up -d
- 建议同时给:
--version 顺带一行、一个手动入口(TUI 快捷键 / zcode-proxy update --check / 未来 Web 面板上的按钮),以及一个能关掉的开关(env 或 config.yaml,例如 ZCODE_UPDATE_CHECK=off)。
- 失败必须静默:GitHub 不可达 / 限流 / 解析异常都不该影响启动,也不该影响代理转发(Android 那版的注释里明确写了"绝不影响启动流程")。
- 隐私:这会是项目里唯一主动出网的地方,只发一个带
User-Agent 的匿名 GET,不带任何本机信息。
第二层(可选,有前提):Linux 独立二进制的真自更新
- 只在"从 Releases 下载的独立二进制"场景有意义:下载对应资产(
zcode-proxy-linux-x64 / zcode-proxy-linux-arm64 / zcode-proxy-darwin-* / zcode-proxy.exe)→ 校验 → 原子替换 → 提示重启。
- Docker 场景建议明确不做自更新:镜像不可变,进程替换自己没有意义;正确做法是提示用户
docker compose pull,真要自动化就交给宿主机的 watchtower / cron。
- 前提:现在 release 里没有校验文件(v4.7.5 的 assets 只有 5 个二进制 +
app-debug.apk),自更新下载完无从校验完整性。建议先在 .github/workflows/release.yml 里 files: dist/* 旁边加一份 SHA256SUMS,再考虑做自更新。
也许能省很多事的实现建议
- Android 那套逻辑几乎是现成的,可以 1:1 翻成 TS(大约 60 行,无新依赖):
releases/latest + Accept: application/vnd.github+json + 必须带 User-Agent(否则 403) + 10s 连接 / 15s 读取超时 + 任何异常返回 null;版本比较沿用同一个"取前三个数字段逐位比较"的规则;UpdatePrefs 的"跳过此版本 / 自动检查开关"可以映射成 config.yaml 的一节或 env。
- 运行形态判断:
/.dockerenv 存在 → Docker 文案;否则按 process.platform + arch 拼资产名。Bun 里 fetch 直接可用,不需要新依赖。
- 将来如果有前端 UI:可以把结果并进面板的状态接口(或加一个
checkUpdate 控制命令),由服务端查询、前端只负责显示 —— 这样无头 + 浏览器场景都能看到,也避免让浏览器直连 GitHub(CSP / 企业网络 / 隐私都更麻烦)。
环境
- zcode-proxy 4.7.5(Docker + Ubuntu 云服务器,前面还挂过一层 nginx)
- 桌面端:Windows 单文件 exe /
--cli serve
- Android 端 4.7.2 上已经能用上述检查
(顺带说明:我搜过现有 issue、含已关闭的,没有关于 Linux / CLI 更新提示的重复项;#48 是安卓包版本号不同步,已关闭。)
背景
我在 Ubuntu 云服务器的 Docker 里跑 zcode-proxy(
docker compose,镜像ghcr.io/tridefender/zcode-proxy:latest,容器CMD就是serve),桌面端是单文件zcode-proxy.exe/--cli serve。这块目前没有任何"有新版本"的提示:Android-APP/app/src/main/java/com/zcode/proxy/UpdateChecker.kt:启动自动查releases/latest、可手动"检查更新"、能"忽略此版本"、GitHub 不可达时静默失败--version和面板横幅里的VERSION(src/index.ts:38),要知道有没有新版得自己去 Releases 页面比对docker compose pullVERSION是硬编码常量(src/index.ts:38),而.github/workflows/release.yml的bumpjob 发版时会把它改写成 tag 版本,所以"当前版本"和releases/latest的tag_name是一对可以直接比较的值。期望
第一层(建议先做):只提示,不自动替换
serve启动时查一次(或每 24h 一次)https://api.github.com/repos/TriDefender/zcode-api/releases/latest,比VERSION新就打印一行,例如:update available: v4.7.6 (current v4.7.5) — https://github.com/TriDefender/zcode-api/releases/latest/.dockerenv存在):update available: v4.7.6 — docker compose pull && docker compose up -d--version顺带一行、一个手动入口(TUI 快捷键 /zcode-proxy update --check/ 未来 Web 面板上的按钮),以及一个能关掉的开关(env 或config.yaml,例如ZCODE_UPDATE_CHECK=off)。User-Agent的匿名 GET,不带任何本机信息。第二层(可选,有前提):Linux 独立二进制的真自更新
zcode-proxy-linux-x64/zcode-proxy-linux-arm64/zcode-proxy-darwin-*/zcode-proxy.exe)→ 校验 → 原子替换 → 提示重启。docker compose pull,真要自动化就交给宿主机的 watchtower / cron。app-debug.apk),自更新下载完无从校验完整性。建议先在.github/workflows/release.yml里files: dist/*旁边加一份SHA256SUMS,再考虑做自更新。也许能省很多事的实现建议
releases/latest+Accept: application/vnd.github+json+ 必须带User-Agent(否则 403) + 10s 连接 / 15s 读取超时 + 任何异常返回 null;版本比较沿用同一个"取前三个数字段逐位比较"的规则;UpdatePrefs的"跳过此版本 / 自动检查开关"可以映射成config.yaml的一节或 env。/.dockerenv存在 → Docker 文案;否则按process.platform+arch拼资产名。Bun 里fetch直接可用,不需要新依赖。checkUpdate控制命令),由服务端查询、前端只负责显示 —— 这样无头 + 浏览器场景都能看到,也避免让浏览器直连 GitHub(CSP / 企业网络 / 隐私都更麻烦)。环境
--cli serve(顺带说明:我搜过现有 issue、含已关闭的,没有关于 Linux / CLI 更新提示的重复项;#48 是安卓包版本号不同步,已关闭。)