Skip to content

[Feature] Linux / CLI / TUI 加「有新版」提示(Android 已有 UpdateChecker,可复用) #60

Closed

Description

@Ma6302

背景

我在 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 是安卓包版本号不同步,已关闭。)

Activity

  1. Ma6302 commented on Oct 2, 2026

    @Ma6302
    ContributorAuthor

    实现提上来了:#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.ts 24 个用例全部注入 fetch,不发真实网络请求;bun x tsc --noEmit 通过,全量 bun test 969 通过(另有 Windows 上既有的 captcha worker 用例失败,master 上同样失败)。另外用真网络验证过:当前版本 4.7.4 会提示 v4.7.5,4.7.5 判定为最新,ZCODE_UPDATE_CHECK=off 返回不可用。

  2. TriDefender commented on Oct 2, 2026

    @TriDefender
    Owner

    已经merge到主线,标记为完成

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions