跳到正文

從 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 無關聯。