v1.9.0 · 知道自己落后了 —— 以及升级安不安全
你现在能知道自己落后了 —— 以及升级安不安全
自部署工具有个结构性缺陷:装完之后没人告诉你有新版。你可能正踩着一个上个月就修掉的 bug,却以为是自己部署坏了。
这一版只做「查」:不下载、不换 jar、不重启、不回滚,一个字节的产物都不落盘。 为什么不做一键更新,见文末。
![]() 管理页 · 版本卡 · 落后几个版本 / 这中间改了什么(每行链到对应 Release)/ 有没有 DB 迁移 / 两行升级命令 / 隐私开关 |
![]() 手机端 · 同一张卡 |
![]() 提示极克制 · 版本徽记右上角一个 5px 描边圆点,不是红色角标、没有弹窗。点徽记直接进版本卡 |
|
和别的更新检查最不一样的一格:这中间有没有 DB 迁移
因为我们有条红线:回滚只回 jar 不回 DB。所以「有没有动过 schema」直接决定你能不能安全退回来。
这一格不是猜的 —— 用 GitHub 的 compare API 读两个 tag 之间的改动文件清单(实测 v1.7.1...v1.8.0 精确报出 V53__expense_entry_mode.sql)。
而且是 fail-closed 的:compare 的文件清单有 300 条上限,一旦被截断或请求失败,显示的是「无法确定,升级前请自行核对 db/migration」——不会报「无 schema 变更」。后者是个既错误又危险的结论,会让你以为能安全回退。
隐私:说清楚,而且能关
向 GitHub 发请求会把你服务器的 IP 暴露给 GitHub。对一个「数据只在自己服务器上」的工具,这事得摆到明面,所以卡上直接写三行:
- 会做什么 —— 每天一次 GET
api.github.com读本仓库的 Releases - 发出去什么 —— 只有这个请求本身。不带版本号、不带实例标识、不带任何用户数据(即无遥测)
- 代价 —— GitHub 会看到你服务器的 IP。介意就关掉,关掉后零后台请求
默认开。介意的话管理页一键关掉,圆点立刻消失。
三条刻意的设计
页面渲染永不等网络。 出网只发生在定时器和「立即检查」按钮里,页面读的是缓存。GitHub 慢或不通,不影响任何一次点击。
查不通不甩红字。 内网部署、或你不想让它出网,都属正常 —— 那时全站什么都不显示,只有管理页那张卡里说明。不会给非技术的家人看一个「检查失败」。
圆点不是未读消息。 看过版本卡之后它仍然在 —— 它反映的是事实状态(你确实还在跑旧版),不是一条待清理的通知。
为什么不做一键更新 / 自动更新
调研过同类实现(sub2api 的自更新只在「脚本装 + systemd」这条路上有,Docker 那条没有)。技术上我们也能做 —— 权限通道其实已经存在。
但不做无人值守的自动更新,理由是:一次坏发布会同时打坏所有开了自动更新的实例,而他们没有 staging、没有金丝雀;我们自己的发布流程恰恰有个人工闸门,因为我们自己都不信任无人值守的晋级。另外 GitHub 账号一旦被盗,等于一次 release 推到所有实例。
一键更新(人在场、点一下、看着结果)是另一个风险等级,以后可能做 —— 完整的可行性与风险分析在 tech-design/v1.9.md §7。
升级注意
- 无 DB 迁移,回滚只回 jar
- 升级后不做任何设置,当天会自动查一次(凌晨 03:17,刻意错开整点)。想立刻看结果:管理页 → 版本 → 立即检查
设计文档:prd/v1.9.md · tech-design/v1.9.md
467 单元测试 · 544 黑盒回归 · 74 条 e2e 断言


