跳到正文

从 Heroku 迁移 ​

Zenavo 只需少量修改就能构建并运行 Heroku 应用:它用 zbpack 或你的 Dockerfile 从 Git 构建(代替 buildpack),并以同样的方式设置 PORT。之后你的应用运行在你自己的服务器上。

Heroku 与 Zenavo 的对应关系 ​

HerokuZenavo
应用一台服务器上的一个项目
Procfile 中的 web 进程从仓库构建、带 HTTP 端口的服务
worker 和其他进程每个进程对应同一仓库的另一个服务,使用对应的命令,不设 HTTP 端口
Buildpackzbpack,或你的 Dockerfile
release 阶段写在启动命令里、在应用启动前运行的命令
Config vars环境变量
Heroku Postgres、Heroku Redis项目中的数据库服务
Dyno 与扩容副本数和资源限制
Automated Certificate Management自动签发的 Let's Encrypt 证书
Pipeline 与 review app没有对应功能:用复制项目做预发布环境
Heroku Scheduler暂不支持定时任务:在应用里运行一个带调度器的 worker 服务

1. 部署应用 ​

  1. 添加服务器并创建项目。
  2. 添加服务 → GitHub,选择仓库和分支,检查 构建计划预览。
  3. 如果 zbpack 推断的启动命令和 Procfile 中的 web: 行不同,请设置启动命令:在 设置 → 构建 → zbpack 选项 中设置 ZBPACK_START_COMMAND,或者在 设置 中设置 启动命令(服务设置)。把 release: 命令放在它前面,例如 sh -c "bin/rails db:migrate && bin/rails server -b 0.0.0.0"。
  4. 其他每种进程类型,再添加一次这个仓库,使用该进程的命令,不设 HTTP 端口。

已经监听 $PORT 的应用不需要修改;同时请监听 0.0.0.0。

2. 复制变量 ​

导出 config vars,粘贴到服务的 变量 标签页 → 编辑原始变量,或者用 CLI 设置:

sh
heroku config --shell -a my-app > heroku.env
zenavo env set --file heroku.env -s web

不要复制 DATABASE_URL、REDIS_URL 等插件变量:改为指向新的数据库服务,例如 DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}。完成后删除 heroku.env,里面有机密。

3. 迁移数据库 ​

在项目中添加 PostgreSQL,主版本与 Heroku 上的一致(heroku pg:info 会显示)。Heroku 自己的备份使用 pg_dump 的 custom 格式,Zenavo 不读取这种格式,所以请导出纯 SQL:

sh
pg_dump --no-owner --no-acl "$(heroku config:get DATABASE_URL -a my-app)" | gzip > heroku.sql.gz

在新数据库的 备份与恢复 标签页上传 heroku.sql.gz,并恢复到空的数据库中(上传备份)。导出前先开启维护模式(heroku maintenance:on),确保导出后不会再有写入。上传文件最大 2 GB。

Heroku Redis 通常只是缓存:新的 Redis 从空开始即可。

4. 切换域名 ​

在服务的 网络 标签页绑定每个域名。Heroku 的域名用 CNAME 指向 herokudns.com;请改为指向服务器 IP 地址的 A 记录。解析生效后会签发证书(域名与 HTTPS)。在新应用稳定承接流量一段时间之前,请保留 Heroku 上的应用。

与 Zeabur 无关联。