從 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 上的應用。