从 Heroku 迁移
Zenavo 只需少量修改就能构建并运行 Heroku 应用:它用 zbpack 或你的 Dockerfile 从 Git 构建(代替 buildpack),并以同样的方式设置 PORT。之后你的应用运行在你自己的服务器上。
Heroku 与 Zenavo 的对应关系
| Heroku | Zenavo |
|---|---|
| 应用 | 一台服务器上的一个项目 |
Procfile 中的 web 进程 | 从仓库构建、带 HTTP 端口的服务 |
worker 和其他进程 | 每个进程对应同一仓库的另一个服务,使用对应的命令,不设 HTTP 端口 |
| Buildpack | zbpack,或你的 Dockerfile |
release 阶段 | 写在启动命令里、在应用启动前运行的命令 |
| Config vars | 环境变量 |
| Heroku Postgres、Heroku Redis | 项目中的数据库服务 |
| Dyno 与扩容 | 副本数和资源限制 |
| Automated Certificate Management | 自动签发的 Let's Encrypt 证书 |
| Pipeline 与 review app | 没有对应功能:用复制项目做预发布环境 |
| Heroku Scheduler | 暂不支持定时任务:在应用里运行一个带调度器的 worker 服务 |
1. 部署应用
- 添加服务器并创建项目。
- 添加服务 → GitHub,选择仓库和分支,检查 构建计划预览。
- 如果 zbpack 推断的启动命令和
Procfile中的web:行不同,请设置启动命令:在 设置 → 构建 → zbpack 选项 中设置ZBPACK_START_COMMAND,或者在 设置 中设置 启动命令(服务设置)。把release:命令放在它前面,例如sh -c "bin/rails db:migrate && bin/rails server -b 0.0.0.0"。 - 其他每种进程类型,再添加一次这个仓库,使用该进程的命令,不设 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 上的应用。