Repository navigation
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
背景
我在 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 是安卓包版本号不同步,已关闭。)
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
Ma6302 commentedon Oct 2, 2026
实现提上来了:#61
照着 Android 端
UpdateChecker的做法移植到 Linux / CLI / TUI:src/update/check.ts:启动时异步查一次releases/latest。离线、被挡、403/429/5xx、返回体解析不了,一律静默忽略;从不抛异常、不阻塞启动,10s 超时用的定时器unref,不吊住进程。4.7.10>4.7.9),v4.7.2.android这类带后缀的只比数字核心;解析不出来的 tag 绝不判为「有新版」。serve有新版时最多多打一行update: ...;TUI 同样打一行,并按 u 可以手动重查(手动检查不受开关和忽略列表影响,而且一定给答复:「已是最新」或「检查不可用」,不会静默)。ZCODE_UPDATE_CHECK=off关掉检查,ZCODE_UPDATE_SKIP=v4.7.6忽略某个版本。docker compose pull && docker compose up -d(镜像不可变);release 目前也没有校验和,所以不做自动下载替换 —— 和 Android 端一样只提示,不自己动文件。测试:
src/update/check.test.ts24 个用例全部注入 fetch,不发真实网络请求;bun x tsc --noEmit通过,全量bun test969 通过(另有 Windows 上既有的 captcha worker 用例失败,master 上同样失败)。另外用真网络验证过:当前版本4.7.4会提示v4.7.5,4.7.5判定为最新,ZCODE_UPDATE_CHECK=off返回不可用。fix(update): 按评审修正版本解析、容器提示与手动检查排队
feat(cli): serve/TUI 提示有新版本(移植 Android UpdateChecker,#60)
Merge pull request #61 from Ma6302/update-notice
TriDefender commentedon Oct 2, 2026
已经merge到主线,标记为完成
feat(cli): serve/TUI 提示有新版本(移植 Android UpdateChecker,TriDefender#60)
fix(update): 按评审修正版本解析、容器提示与手动检查排队
Merge pull request TriDefender#61 from Ma6302/update-notice