如何用Openship实现数据库零停机发布:迁移与部署联动实战
2026/9/15 18:42:30 网站建设 项目流程

如何用Openship实现数据库零停机发布:迁移与部署联动实战

【免费下载链接】openshipSelf-hosted deployment platform项目地址: https://gitcode.com/GitHub_Trending/ope/openship

Openship(开源自托管部署平台)发布带数据库的应用时,最让人紧张的就是那一步:新版本上线,但 schema 还没迁移,或者迁移跑挂了,生产库直接遭殃。这篇文章手把手教你用 Openship 自带的部署前自动备份 + 部署后迁移任务,搭出一套数据库零停机发布流程——迁移与部署联动,出问题还能一键回滚。

为什么数据库是发布中最大的一环

如果你的项目里有MySQL / Postgres这类带持久化卷(Docker volume)的服务,官方文档 database-migrations.mdx 提醒了两件事:

  1. 初始化脚本不会重复执行:容器里docker-entrypoint-initdb.d中的脚本只在卷为空(第一次初始化)时运行。数据库已经有数据后,这些脚本永远不会再跑,所以不能指望它来做 schema 迁移。
  2. 有状态容器可能被重建:全栈部署时数据库容器可能被 recreate。好消息是命名卷会被保留、数据不丢;坏消息是"重建那一刻"正是最需要安全网的时候。

好消息是:Openship 不需要你手写复杂的发布脚本,它给了你三个现成的"积木"。

三件套:只部署变更 + 部署前备份 + 部署后迁移

① 无关联改动就别碰数据库(最快的手动优化)

后端代码变了,不应该顺带重建你的数据库容器。用选择性部署,只发变更的服务:

openship deploy --service-ids api,web

没点名的服务(比如db)会原容器继续运行,数据纹丝不动。多服务细节可参考 compose-multi-service.mdx。

② 每次发布前自动备份(回滚安全网)

在项目Backup页面对数据库服务创建备份策略(Backup policy),关键是勾选"Pre-deploy trigger"(部署前触发)。它的工作方式很讲究(详见 backups-restore.mdx 与源码 pre-deploy.ts):

  • 备份在新版本构建成功、但破坏性切换之前执行,快照捕获的是旧容器的数据——正是你回滚时想恢复的状态;
  • 所有走部署通道的路径(手动按钮、Webhook 自动部署、CLI 部署、回滚重建)都会被覆盖;
  • 备份是尽力而为的:慢或失败的备份不会阻塞发布;
  • 这类运行在备份历史中统一标记为pre_deploy,方便你事后精确找回切换前快照。

备份目的地支持 S3 兼容存储、SFTP、已有服务器或本地磁盘,密钥静态加密存储。

③ 部署成功后跑迁移任务(联动核心)

给已有卷应用 schema/数据迁移,用Jobs里的一个"命令任务"实现(jobs.mdx):

  1. 打开Jobs,新建一个command类型的任务;
  2. 触发器选"Deploy succeeded"(部署成功)事件——迁移只在新版本真正上线后才执行;
  3. 命令指向你的迁移工具,例如 Postgres:
docker run --rm --network <project-network> \ -e DATABASE_URL="postgres://user:pass@db:5432/app" \ ghcr.io/amacneil/dbmate:latest up

每次任务运行都会记录历史:何时执行、是否成功、耗时与完整输出,出问题有据可查。

一次完整的安全发布长什么样

按官方文档给出的顺序,整套流程是:

阶段动作由谁触发
1部署前备份pre_deploy快照备份策略自动触发
2新版本构建并上线openship deploy/ Webhook 自动部署
3迁移任务对新版本卷执行迁移Jobs "Deploy succeeded" 事件
4迁移失败?从备份历史恢复pre_deploy快照

再叠加一层保险:rollback-redeploy.mdx 说明回滚只恢复代码,绝不触碰数据库与卷数据。也就是说,即使新代码有 bug,一键回滚到上一个健康版本(Snapshotted 版本秒级恢复、无需重新构建),而数据库始终由你的迁移策略掌控。

边界与最佳实践 ⚠️

  • 目前没有"迁移门禁":Openship 暂不提供"迁移未完成则阻止应用启动"的预部署钩子(官方 roadmap 上的一等公民特性)。迁移任务是在新容器上线之后运行的。
  • 如果你的应用必须先迁移 schema 才能启动,两个选择:在镜像 entrypoint 里先跑migrateexec启动应用;或者让应用能容忍短暂的迁移窗口。
  • 发布前把上一个可靠版本Pin(固定)住:回滚永远一键可达、无需重建。

小结

用 Openship 做数据库零停机发布,不需要自己造轮子:

  1. 选择性部署--service-ids,无关联改动不碰数据库;
  2. 备份策略开启Pre-deploy trigger,每次发布前自动留快照;
  3. Jobs 里挂一个Deploy succeeded迁移任务,迁移与部署天然联动;
  4. 出问题:代码回滚(不动数据)+ 数据恢复(pre_deploy快照)双保险。

完整资料入口:database-migrations.mdx、backups-restore.mdx、rollback-redeploy.mdx。

【免费下载链接】openshipSelf-hosted deployment platform项目地址: https://gitcode.com/GitHub_Trending/ope/openship

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询