Appearance
升级与迁移
这一页只回答两件事:怎么升级,迁移失败了怎么办。
升级最小路径
bash
cd ember/infrastructure/docker
docker compose pull
docker compose up -d启用 Bot 时:
bash
docker compose pull
docker compose --profile bot up -d不需要任何手工 SQL。ember-api 启动期会自动应用未应用的迁移。
数据库迁移如何工作
Ember 自 v1.4 起把数据库 schema 演进收敛到「ember-api 启动期内嵌迁移」一条路径:
- 真相源:主仓
infrastructure/database/下的顶层 SQL 文件,按字典序 forward-only 排序 - 启动序列:
InitDB → Migrate → VerifySchema → Bootstrap → Start Migrate阶段通过pg_advisory_lock串行化、schema_migrations表记账,已应用的不重复执行VerifySchema兜底校验:表 / 关键列 / 关键索引三层缺一就 fail-fast- 日志带
[Migrate]前缀,失败时容器进 restart loop
两条分支:
- 新空库:业务核心表不存在 +
schema_migrations为空 → 按字典序跑全部 SQL 完成初始化 - 已有库:直接
pull && up -d→ 自动应用未应用 SQL
镜像是只读的:不要 docker exec 进容器删 SQL 文件、不要修改原文件(这会破坏 checksum)。
完整说明见主仓 infrastructure/database/README.md 的「自动迁移与 schema_migrations」章节。
如果迁移失败
容器进 restart loop 时,先看 API 日志:
bash
docker compose logs --tail=200 ember-api带 [Migrate] 前缀的行会直接告诉你失败的 SQL 文件名。常见原因:
- 数据库里有不符合 migration 预期的脏数据(migration 内置
RAISE EXCEPTION预检并附排查 SQL) - 上一次升级某条 SQL 没跑成功,留下中间态
- PostgreSQL 版本不兼容
不要走偏:
- 不要手工进容器改 SQL 文件
- 不要手工
INSERT INTO schema_migrations跳过失败项 - 不要直接
docker compose down -v(这会删数据卷)
正路:
- 看清楚失败的 SQL 文件名与报错
- 按 forward-only 原则在主仓追加一条新的 SQL 抵消错误效果(不修改原文件)
- 重新构建并推送镜像 →
docker compose pull && up -d恢复
更细的步骤与 v1.3.1 → v1.4.0 历史升级期的脏数据自查表见主仓 部署环境与配置 的「数据库迁移策略」章节。
回滚思路
Ember 的迁移是 forward-only:
- 没有「downgrade」脚本
- 数据库无法回滚到旧 schema
- 但镜像版本可以回退:在
.env显式钉住旧版镜像 tag,再docker compose up -d
如果旧版 API 拒绝在新 schema 上启动(比如校验失败),唯一可行的方案是从备份恢复数据库。备份方法见主仓 部署排障 的「备份与恢复」章节。
生产部署前请先做一次完整的数据库备份。
升级前自检
- 已备份 PostgreSQL 数据
- 已查看主仓 Releases 看本次升级是否有破坏性变更说明
- 已确认
.env里的密钥没被替换(特别是JWT_SECRET和CONFIG_ENCRYPTION_KEY,换值会导致登录态失效或敏感配置无法解密)