如何将已部署Heroku应用从美国区域迁移至欧盟且不丢失数据
前置准备
- 确保本地已安装最新版Heroku CLI,且完成账号登录,执行命令:
heroku login - 提前完整记录原美国区应用的所有配置项,包括自定义环境变量、附加组件版本、域名绑定规则、CI/CD配置,避免迁移遗漏
- 对应用关联的所有数据库、存储服务生成全量备份,提前下载备份文件到本地留存
- 确认应用的部署源(本地代码仓库、代码托管平台关联配置等)可正常访问
迁移操作步骤
1. 新建欧盟区空白应用
执行命令指定区域创建新应用,将<new-app-name>替换为你自定义的新应用名称:
heroku create <new-app-name> --region eu
执行完成后运行heroku info --app <new-app-name>,确认返回的Region字段为eu即创建成功。
2. 批量迁移环境变量
先导出原美国区应用的所有环境变量到本地文件,将<old-us-app>替换为原美国区应用的名称:
heroku config --app <old-us-app> --shell > .env.migrate
打开生成的.env.migrate文件,删除所有HEROKU_前缀的系统自带变量(这类变量为新应用自动生成,无法手动覆盖),随后将剩余自定义变量批量导入欧盟区新应用:
heroku config:set --app <new-app-name> $(cat .env.migrate | xargs)
导入完成后可运行heroku config --app <new-app-name>和原应用配置逐一对比,确认所有自定义变量正确导入。
3. 迁移附加组件与数据
先查看原应用的所有附加组件列表:
heroku addons --app <old-us-app>
逐个在欧盟区新应用中安装对应版本的附加组件:免费版组件可直接创建,付费版组件需提前确认账号额度支持同类型多实例创建,避免扣费异常。如果是数据库类附加组件,创建完成后用之前下载的本地备份文件执行恢复,以Heroku Postgres为例:
heroku pg:backups:restore <本地备份文件路径> DATABASE_URL --app <new-app-name>
4. 部署应用代码到新应用
进入本地应用代码仓库目录,将欧盟区新应用添加为远程仓库:
heroku git:remote --app <new-app-name> --remote heroku-eu
推送代码到新应用的远程仓库触发部署:
# 主分支为main时执行 git push heroku-eu main # 主分支为master时执行 git push heroku-eu master
部署完成后运行heroku open --app <new-app-name>测试应用功能,确认接口响应、数据读取均符合预期。
5. 迁移域名与流量切换
先解绑原美国区应用绑定的自定义域名:
heroku domains:remove <your-custom-domain.com> --app <old-us-app>
再将域名绑定到欧盟区新应用:
heroku domains:add <your-custom-domain.com> --app <new-app-name>
根据命令返回的DNS解析地址,前往你的域名服务商处修改域名的CNAME记录,指向新应用的解析地址,等待DNS生效后即可完成流量切换。
6. 收尾操作
确认新应用稳定运行72小时无异常后,再删除原美国区应用,避免误删数据:
heroku apps:destroy <old-us-app> --confirm <old-us-app>
常见注意事项
- 部分付费附加组件不支持跨区域备份恢复,迁移前可先通过导出结构化数据、手动迁入的方式完成数据迁移
- Heroku免费dyno的欧盟区和美国区计费规则一致,不会产生额外基础费用
- DNS全球生效最长可能需要48小时,切换期间不要立即删除原应用,避免部分区域用户访问失败
内容的提问来源于stack exchange,提问作者Shreyash mishra

