跳到正文

迁移项目 ​

把一个已部署的项目连同数据迁移到同一团队的另一台服务器上:换一台更大的服务器、换一个地区,或者淘汰旧机器。项目的 ID、设置、域名和历史都会保留。

在你确认项目在新服务器上运行正常之前,旧服务器上不会删除任何东西。

开始之前 ​

  • 你需要在团队中拥有 admin 或 owner 角色,并输入项目名称确认。
  • 项目必须已经部署。未部署的项目没有需要复制的数据;请改为把它复制到另一台服务器上。
  • 新服务器必须处于就绪状态,旧服务器必须能访问,因为数据要从旧服务器复制。
  • 迁移期间项目不可用:为了保证副本的一致性,它的服务会被停止。请安排在访问量少的时候迁移。耗时大约相当于备份并恢复它的全部数据。

开始迁移 ​

  1. 打开项目的 设置 → 通用 → 迁移到其他服务器。
  2. 选择新服务器。Zenavo 会检查并显示:
    • 服务器是否就绪、团队是否在套餐限制之内,以及服务器是否有足够的空闲内存(按每个服务的内存限制或近期用量计算);
    • 与该服务器上其他项目的域名和发布的 TCP/UDP 端口冲突;
    • 将要复制的数据;
    • 会自动切换的生成域名,以及自定义域名需要你修改的 DNS 记录。
  3. 输入项目名称,点击 迁移。

迁移以任务的形式运行。任务页面会显示每个步骤和日志。

迁移过程 ​

步骤Zenavo 做什么
检查新服务器确认它已就绪并有足够空间。此时还没有任何改动。
停止写入停止旧服务器上的应用服务。
备份导出没有数据卷的 PostgreSQL 和 MySQL 数据库,然后停止它们,再把每个数据卷复制为 .tar 归档。记录每个文件的 SHA-256。
部署在新服务器上部署相同的镜像和配置,所有服务都处于停止状态。不运行初始化命令:数据来自旧服务器。TLS 证书也会被复制,所以流量一到达,HTTPS 就能正常工作。
恢复把每个数据卷恢复到新的空数据卷中,然后启动需要导入的数据库并恢复导出内容。
启动按依赖顺序启动服务,实例数与原来相同,并等待它们通过健康检查。
切换把每个生成的域名指向新服务器的地址,并把新服务器设为项目的服务器。

迁移前已暂停或停止的服务,在新服务器上仍保持停止。

如果出现失败 ​

如果切换之前的任何步骤失败,Zenavo 会撤销迁移:服务在旧服务器上按原样重新启动,新服务器上的副本被删除,任务以失败结束并给出原因。迁移永远不会改动旧服务器上的数据。

如果撤销也失败了(例如旧服务器变得无法访问),迁移会保持未完成状态并显示原因。问题解决后,点击 回滚 重试。只有在旧服务器重新运行之后,新服务器上的副本才会被删除。

切换之后 ​

项目现在运行在新服务器上。它已停止的副本连同全部数据仍保留在旧服务器上。在迁移等待你确认期间:

  • 自定义域名:把它们的 DNS 记录改为新服务器的地址。迁移页面会为每个域名显示具体的记录(类型 A 或 AAAA 以及地址)。在你修改之前,这些域名仍然指向已经停止的旧服务器。
  • 在新服务器上检查应用:登录、后台任务、邮件、Webhook 以及它依赖的其他功能。
  • 部署和其他项目操作会暂停,以便迁移仍然可以被完整地撤销。

然后选择一项:

  • 完成迁移 会从旧服务器上删除已停止的副本及其数据卷,并从 Zenavo 中删除迁移的传输文件。之后项目无法再回滚到旧服务器。
  • 回滚 会停止新服务器上的副本,把生成的域名指回去,用迁移开始时的数据在旧服务器上启动服务,并删除新副本。切换之后在新服务器上产生的修改不会被复制回去。 如果你改过自定义域名,也请把它们指回去。

补充说明 ​

  • 生成域名的记录会先添加新记录,再删除旧记录,所以名称始终能够解析。解析器可能会把旧地址缓存最多五分钟。
  • 服务保存在数据卷以外(容器中)的数据不会被复制:这些数据在任何一次重启时都会丢失。需要保留的数据请放在数据卷中。
  • 传输文件与备份是同一种文件,在迁移完成或回滚之前会出现在项目的备份中。
  • 不支持迁移到其他团队的服务器。请把项目复制到另一个团队,然后在那里恢复备份。
  • 每次迁移、完成和回滚都会记录在团队的审计日志中。

API ​

方法路径
GET/api/projects/{pid}/move最近一次迁移:状态、服务器、数据、域名、can_finish 和 can_roll_back
GET/api/projects/{pid}/move/preflight?server_id=检查迁移,不做任何改动(管理员)
POST/api/projects/{pid}/move开始迁移:{server_id, confirmation: "<project name>"}(返回一个任务)
POST/api/projects/{pid}/move/finish从旧服务器上删除已停止的副本(返回一个任务)
POST/api/projects/{pid}/move/rollback回到旧服务器(返回一个任务)

与 Zeabur 无关联。