Inkwell 升级与回滚指南
本文档面向未来维护者与部署者,说明当你需要升级 Inkwell 版本、部署新改动,或在升级失败后恢复站点时,应该按什么顺序操作。
适用范围:
- Linux VPS 宿主机部署
- Docker / Docker Compose 单机部署
- 单站点、自托管场景
不适用范围:
- 多机集群
- Kubernetes
- 蓝绿发布 / 金丝雀发布
- 自动化数据库回滚平台
1. 先理解 Inkwell 的恢复模型
升级与回滚前,先记住几个关键事实:
1.1 PostgreSQL + uploads 才是核心状态
对 Inkwell 来说,真正需要保护的是:
- PostgreSQL 业务数据
public/uploads媒体文件- 部署环境中的 secret 与配置
1.2 Meilisearch 索引不是备份主体
搜索索引可以重建,不是主数据源。
恢复后如果需要,执行:
npm run search:reindex-posts或在恢复时直接带上:
npm run backup:import -- --input <backup-dir> --force --reindex-search1.3 backup snapshot 与代码版本有关联
当前 backup manifest 会记录:
packageVersionlatestDrizzleMigrationTag
这意味着:
- 不能把任意快照随便恢复到任意代码版本
- 如果要做完整数据回滚,应该先恢复到与该快照兼容的代码版本,再导入快照
1.4 secret 默认不会被完整导出
backup:export 默认会对 settings 表中的 secret 做脱敏。
这意味着:
- 备份恢复不会替你凭空恢复真实 secret
- 回滚前要确认
.env中的部署级 secret 仍可用 - DB-backed secret 若备份中是脱敏值,目标实例没有当前值时,该 secret 可能会被跳过
2. 升级前最低准备
无论是宿主机还是 Docker,升级前都建议先做下面这些事。
2.1 记录当前已知可用版本
至少记下:
- 当前代码提交或发布版本
- 当前部署方式(VPS / Docker)
- 当前
.env/ 反向代理 / systemd 或 Compose 配置位置
如果你使用 git 部署,建议先记住当前提交:
git rev-parse HEAD2.2 先做一次可恢复备份
建议在升级前执行:
npm run backup:export -- --output <backup-dir>至少确认:
- 备份目录已生成
- 导出过程中没有 checksum / media 缺失错误
- 你知道这个备份对应的是哪个版本
2.3 先看这次升级是否涉及高风险变更
如果这次改动涉及以下任一项,要提高回滚警觉:
- schema / migration
- settings 结构变化
admin_path或登录相关行为- 搜索索引结构
- backup import / export 行为
- 部署方式、standalone 资源复制、反向代理或 HTTPS
建议先阅读:
docs/release-checklist.mddocs/schema-and-migrations.mddocs/settings-system.mddocs/testing-strategy.md
2.4 先确认回滚材料是否齐全
至少确认:
- 上一个可用代码版本仍可拿到
- 升级前备份已完成
.env/ secret 没有丢- 你知道如何重启当前部署方式下的服务
3. 宿主机部署升级步骤
适用于:
- Linux VPS
- systemd 托管 Next.js standalone
- Nginx 反向代理
推荐顺序:
3.1 拉取新代码
把项目更新到目标版本。
3.2 安装依赖
npm install3.3 应用数据库迁移
npm run db:migrate如果这一步失败,不要继续启动新版本,先停在这里处理。
3.4 构建应用
npm run build3.5 补齐 standalone 静态资源
如果你使用 standalone 部署,构建后仍要确认:
public已复制到.next/standalone.next/static已复制到.next/standalone/.next
否则很容易出现:
- 首页 200
- 但 CSS / JS 404
3.6 重启服务
使用你的 systemd 服务配置重启应用。
3.7 做升级后最小 smoke
至少确认:
- 首页可访问
- CSS / JS 正常
GET /api/health正常- 后台登录稳定
- 关键后台页可打开
如果这次升级涉及搜索、备份恢复或内容发布,再补:
npm run search:reindex-postsnpm run posts:publish-scheduled- 手动创建/编辑/发布一篇文章验证链路
4. Docker / Compose 升级步骤
适用于:
docker-compose.production.yml- 单机 app + postgres + meilisearch 方案
推荐顺序:
4.1 更新代码与配置
确认:
- Compose 配置已更新
- 占位 secret / 域名没有被错误覆盖
- volume 仍然正确挂载
4.2 重建并启动容器
常见方式:
docker compose -f docker-compose.production.yml up -d --build4.3 在 app 容器内执行迁移
docker compose -f docker-compose.production.yml exec app npm run db:migrate4.4 按需执行初始化或恢复性命令
例如:
docker compose -f docker-compose.production.yml exec app npm run search:reindex-posts4.5 做升级后最小 smoke
至少确认:
- 首页正常
- 健康检查正常
- 后台登录正常
- app / postgres / meilisearch 都在运行
public/uploads与数据卷未丢
5. 什么时候可以只做代码回滚
满足以下条件时,可以优先尝试 代码回滚:
- 还没有执行新的 migration
- 或虽然执行了 migration,但旧代码仍能兼容当前数据库结构
- 数据本身没有被错误写坏
- 主要问题是构建、静态资源、部署配置或运行时行为退化
典型例子:
- standalone 静态资源漏复制
- Nginx / HTTPS 配置错误
- 新版本前端资源有问题
- 反向代理或环境变量配置失误
这种情况下,优先思路通常是:
- 切回上一个已知可用代码版本
- 重新安装依赖 / 构建
- 重新启动服务
- 再做 smoke
6. 什么时候需要完整数据回滚
满足以下任一项时,要考虑 代码 + 数据一起回滚:
- 已执行的新 migration 与旧代码不兼容
- 新版本写入了错误数据
- settings / schema 结构变化导致站点逻辑失真
- 数据恢复必须回到升级前状态
这种情况下,不要只回退代码;否则可能出现:
- 代码版本回退了,但数据库结构已经不匹配
- 旧代码启动了,但行为仍异常
- secret / settings 状态不一致
7. 完整回滚步骤
7.1 先切回与备份兼容的代码版本
这是完整回滚最容易忽略的一步。
先恢复到与升级前备份匹配的代码版本,再继续导入备份。
7.2 确认部署级 secret 仍然可用
确认:
DATABASE_URLNEXTAUTH_SECRETNEXTAUTH_URLINTERNAL_CRON_SECRETMEILISEARCH_*
仍然正确。
7.3 执行备份恢复
npm run backup:import -- --input <backup-dir> --force --reindex-search如果你不想在恢复时联动搜索重建,也可以先:
npm run backup:import -- --input <backup-dir> --force然后再手动执行:
npm run search:reindex-posts7.4 重启服务并做 smoke
至少确认:
- 首页正常
- 后台可登录
- 关键文章页可访问
- 搜索可用
- sitemap / RSS 正常
- 媒体文件没有丢
8. 升级失败后的决策顺序
如果升级后站点异常,建议按下面顺序判断:
场景 A:站点起不来 / 页面无样式 / 健康检查异常
优先检查:
npm run build是否成功- standalone 静态资源是否复制
- systemd / Compose / Nginx 是否指向新构建结果
通常先考虑代码或部署层回退。
场景 B:后台登录异常
优先检查:
- HTTPS
NEXTAUTH_URLNEXTAUTH_SECRETadmin_path是否发生变化
通常先考虑配置修正或代码回退。
场景 C:数据库行为异常 / 页面结构错乱 / 保存逻辑异常
优先检查:
- 是否执行了新 migration
- schema / settings 是否已变化
- 是否需要完整数据回滚
场景 D:只有搜索异常
优先检查:
- Meilisearch volume 是否还在
- 直接执行:
npm run search:reindex-posts不要因为单纯搜索异常就立刻做整站数据回滚。
9. 升级后建议验证清单
至少验证:
GET /api/health- 首页加载
- 后台登录
- 文章列表页
- 一篇已发布文章详情页
如果涉及高风险改动,再追加:
- 设置页保存
- 新建 / 编辑 / 发布文章
- 搜索页查询
- 备份导出
- 备份导入到测试环境或备用实例
- 定时发布入口
更完整检查可参考:docs/release-checklist.md
10. 常见错误
- 没做升级前备份就直接迁移
- 只回退代码,不处理已经变化的数据库状态
- 忘记 backup snapshot 与 migration tag 绑定
- 忘记
.env/ secret 不是备份自动恢复的一部分 - 宿主机升级后忘记补齐
public与.next/static - 搜索异常时直接整站回滚,而不是先 reindex
11. 推荐阅读顺序
如果你接下来准备做升级或回滚,建议按顺序读:
docs/deployment.md- 本文档
docs/upgrade-and-rollback.md docs/release-checklist.mddocs/troubleshooting.md- 若涉及 schema / settings,再看对应专项手册