版本与更新(更新中心)
面向已经部署了博客号的站长(Cloudflare 版 / Docker 自托管版)与自托管运维:怎么知道有没有新版本、新版本带来了什么、以及怎么安全地升级。
一句话:博客号不会自动更新——「检查更新」只帮你看「更新了什么 / 优化了什么」,真正换版本永远是一次你自己发起的部署动作。
1. 更新中心在哪
| 部署形态 | 入口 | 看到什么 |
|---|---|---|
| Cloudflare 版 | 后台 → 概览页 → 「系统」卡片里的 「检查更新」 按钮 | 当前版本、最新版本、从你的版本到现在「更新了什么」、一键「保持当前版本」、升级指引 |
| Docker 自托管 | 控制面(后台之外的运维控制台)仪表盘 → 「版本与更新」卡片 | 同上(以镜像版本为准),另有「保持当前版本」记账 |
两处都是按需检查——不点不开,点开才去官网取一次清单,不会在你每次进后台时偷偷出网。
2. 它怎么工作(以及为什么不自动更新)
- 检查更新时,后台向官网取一份机器可读的版本清单:
https://bloghao.com/version.json。 这份清单由发布流程从 CHANGELOG.md 自动生成(npm run build:release),内容是每个版本号的日期 + 要点列表。 - 后台拿清单里的最新版本和你当前运行的版本比一比:
- 有更新 → 列出「从你这一版到现在,更新了什么」(新 → 旧),并给升级指引链接;
- 已是最新 → 明确告诉你「已是最新版本」。
- 清单来自官网静态文件,但后台仍当不可信输入处理:版本号必须形如
x.y.z,说明文字剥控制字符、限长,脏值一律丢弃;取不到(网络不通 / 官网维护)就降级显示「暂时获取不到最新版本信息」,不报错、不阻塞。 - 为什么不做自动更新:博客号的身份是「你自己的站」。自动拉代码 / 自动重建容器 / 自动改数据库,一旦某次发布有问题就是无人看守的半夜事故。所以这里刻意只做告知 + 记录你的选择,升级动作留给一次你确认过的部署(见第 4 节)。这也与「部署即上线、测试是唯一刹车」的发布纪律一致。
3.「保持当前版本」是什么意思
有时你就是不想现在升——某个新版本用不上,或者想等它稳定一阵。点 「保持当前版本」 后:
- 后台记下你选择保持的版本号(Cloudflare 版存站点设置的
updateIgnoredVersion,自托管控制面存data/tenants/.update-pref.json)。 - 之后打开更新中心,仍会显示有新版本,但会注明「你已选择保持当前版本」,不再反复催你。
- 这是记录一个选择,不是关闭检查:一旦出现比它更新的版本,这条「保持」记录自动失效,更新中心会重新正常提示。想随时改主意,直接按升级指引操作即可,无需先去哪里「取消保持」。
它只影响提示语气,不影响任何功能——保留旧版本不会让站点少任何东西,旧版本也照常安全运行(除非新版本里有「⚠️ 升级注意」标出的必要动作)。
4. 怎么真正升级
升级 = 把你运行的那份代码换成新版本,再走一次标准部署。数据库结构由 ensureSchema 在启动时自动增量迁移,正常情况无需手动改库。
升级前先备份(尤其跨版本):后台「设置 → 订阅与备份 → 立即备份」来一份,或按 GUIDE.md §19 导出 SQL。有底气才动。
4.1 Cloudflare 版(Worker + D1 + R2)
若你是一键部署出来的(Cloudflare 接管了 push 自动部署):你的仓库是你自己的副本(在部署时创建)。把 bloghao/bloghao 的最新代码同步进你的副本(git pull 官方仓库后推你的副本,或在 GitHub 上点 Sync fork / Update branch),Cloudflare 会自动重新构建部署,几十秒后新版本上线。
若你是命令行部署的:
git pull # 拉官方仓库最新代码
npm install # 依赖有变时
npm run deploy # 部署 Worker
# 若本次发布含 schema 变化(CHANGELOG 标了「⚠️ 升级注意」):
npx wrangler d1 execute xwblog-db --remote --file schema.sql # 幂等,安全D1 建表 / 加列是幂等的,重跑 schema.sql 不会破坏数据;表结构也会在 Worker 冷启动时由 ensureSchema 自动补。
4.2 Docker 自托管版
镜像里就是业务代码,升级 = 拉最新代码 → 重建镜像 → 重启容器。数据库在 data/ 卷里,重建容器不动它:
cd docker-poc
git pull # 拉最新代码
docker compose up --build -d # 重建并滚动重启(数据卷保留)多租户(一个容器带多个分站)同样一条命令;Caddy / 反代配置不变。想锁到某个稳定版而不是追最新,用官方仓库的版本 tag:
git fetch --tags
git checkout v2.6.0 # 换成你要的版本 tag
docker compose up --build -d自托管用的官方稳定版来自 bloghao/bloghao,每个版本都打
vX.Y.Ztag(见 RELEASING.md)。控制面的「版本与更新」卡片显示的「当前版本」即镜像里的APP_VERSION。
4.3 升级可能需要的额外动作
绝大多数版本「拉代码 + 重新部署」就完事。少数版本会含需要手动动作的条目(例如某个设置要重填、某个外部依赖要改),这类条目在 CHANGELOG.md 里一律以 ⚠️ 升级注意 标出——更新中心的要点列表来自同一份 CHANGELOG,看到带这个标记的条目就先照着做。
5. 升级会不会丢数据 / 丢设置
不会。三种部署形态下:
- 文章 / 微博 / 评论 / 会员 / 图片:都在数据库与图床里,升级只换代码,不碰数据;
- 设置 / 主题 / 皮肤包 / 自定义 CSS:都在数据库的 settings 里,随库保留;
- D1 结构变化:由
ensureSchema自动增量迁移(只加不删),冷启动时补齐; - 自托管 Docker:数据在挂载的
data/卷里,up --build重建容器不动卷。
真正会「清空内容」的只有你主动点的**「清空本站内容」**(整站搬家配套,硬删不可撤销)——那不是升级动作,别混。
6. 常见问题
Q:更新中心显示「暂时获取不到最新版本信息」?
A:官网清单 bloghao.com/version.json 那一刻取不到(本机/服务器出网受限、DNS 或官网短时维护)。不影响站点运行,稍后再点一次即可。自托管若服务器本身没有公网出网,检查更新会一直取不到——不影响升级(按第 4 节手动拉代码即可)。
Q:我点了「保持当前版本」,以后还会提示吗? A:会出现比它更新的版本时重新提示;同一版本不再反复催。
Q:演示站为什么看不到更新中心? A:演示站(demo.bloghao.com)禁一切对外调用,更新中心对它恒为「不检查」(服务端直接短路),与后台其他出网工具同口径。
Q:能不能让某个分站保持旧版、其余分站升级? A:可以。分站共用同一份代码(同一容器 / 同一镜像),要「分站差异化版本」得分别部署两套代码——一回事一地做,别指望一个容器里跑两个版本。
Q:更新中心会把版本号或使用数据传回官网吗? A:不会。它只单向拉取官网的公开清单,不上报任何本站信息(版本号、站点地址都不外发)。