Zeabur 停止營運:n8n 搬家到 Railway 完整教學(附踩坑筆記)

當初推薦給客戶的平台要結束營運了,所以我們先自己搬一次

2026 年 10 月 17 日,Zeabur 寄出停止營運公告:共享叢集 12/1 起暫停,專用伺服器依各自到期日在 12/1–12/31 陸續關閉,12/31 全面停止服務。

呼嚕實驗室的 n8n 自動化(LINE 通知、Notion 自動化、排程報表⋯⋯)都跑在 Zeabur 上,也有幾位客戶是我們推薦去用的。是我們推薦的,就會陪客戶搬完——所以第一步,是自己先完整搬一次,把每個坑都踩過、寫下來。

這篇是那份 n8n 搬家筆記。照著做,你也可以在一天內把 n8n 從 Zeabur 搬到 Railway,workflow、credentials、執行紀錄、帳號、API key 全部原封不動。

📌 這篇適合誰
  • 在 Zeabur(或任何平台)自架 n8n + PostgreSQL,需要搬家的人
  • 會開終端機、看得懂環境變數,但不想自己顧主機的人
📋 文章目錄
  1. 為什麼選 Railway
  2. n8n 搬家前準備:盤點三件事
  3. 步驟一~四:資料庫整份搬過去
  4. 步驟五~六:部署 n8n、綁自己的網域
  5. 步驟七~八:驗證與切換 webhook
  6. 步驟九:舊站收尾
  7. 踩坑筆記與常見問題
  8. 給 AI 的執行清單

一、為什麼選 Railway

這次選新家,我們看三件事:

  • ⚡ 上線要快:直接用大型雲端主機,租機器、裝環境、顧系統更新都要自己來。Railway 把這些包好了,時間可以留給客戶的需求。
  • 🏦 資安有把關:搬家最怕的就是再搬一次。Railway 在 2026 年 1 月宣布完成 1 億美元 B 輪融資,也在 2025 年 8 月通過 SOC 2 Type II 稽核(第三方定期查核資安控管)。
  • 🤖 能用 API 操作:Railway 有完整的 GraphQL API,這次搬遷大部分步驟是 AI 助理透過 API 完成的,之後維運也一樣。

方案怎麼選?Railway Pro 是每個 workspace 每月 US$20,內含 US$20 的用量額度,成員人數不限。Hobby 方案可以先拿來測試,但建立備份是 Pro 才有的功能(Dashboard 上會直接提示),放正式服務建議用 Pro。

Railway Hobby 方案的 Backups 分頁提示升級 Pro 才能建立備份

二、n8n 搬家前準備:盤點三件事

動手前先把這三件事寫下來,後面每一步都會用到。

1. n8n 的版本號

到舊站的 n8n 左下角 Help → About n8n 看版本。新站先用完全相同的版本,確認穩定後再升級——一次只改一個變數,出問題才知道是搬家造成的還是升級造成的。我們這次是 2.2.5。

2. N8N_ENCRYPTION_KEY(最重要!)

n8n 用這把 key 加密存在資料庫裡的所有 credentials(API key、OAuth token、密碼)。資料庫搬過去了、key 沒帶過去,所有 credentials 都會解不開,等於每一個連線都要重建。

到 Zeabur n8n 服務的環境變數找 N8N_ENCRYPTION_KEY,複製下來放進密碼管理器。如果環境變數裡沒有,代表是 n8n 第一次啟動時自己產生的,存在 volume 裡的 /home/node/.n8n/config,要從那裡取出。

3. Webhook 呼叫端清單

換平台= n8n 的網址會變。所有「打你 n8n 網址」的地方都要改,而且它們通常散落各處。我們這次盤點出來的有:

  • LINE Messaging API 的 Webhook URL
  • Notion 資料庫 automation 的 webhook 動作
  • iPhone 捷徑(Siri)
  • 外部平台的通知設定、自己寫的本機排程與腳本

找法:在 n8n 裡把有 Webhook trigger 的 workflow 列出來,再回頭想「誰會呼叫它」;本機可以全文搜尋舊網域(例如 grep -rl "xxx.zeabur.app" ~/)。

三、步驟一~四:資料庫整份搬過去

n8n 搬家最關鍵的一步就是資料庫。我們選的做法是整個 PostgreSQL 資料庫用 pg_dump / pg_restore 搬過去,而不是用 n8n 的匯出/匯入功能。差別在於:

  • 整庫搬:workflow、credentials、執行紀錄、使用者帳號、API key、Variables 全部帶走,登入帳密也一樣
  • n8n CLI 匯出:只有 workflows 和 credentials,帳號、執行紀錄、instance 設定都不含,匯入後要重新建立 owner

本機需要安裝 PostgreSQL 客戶端工具,版本要大於或等於資料庫版本(例如資料庫是 17,就裝 postgresql@17)。Mac 可以用 brew install postgresql@17。

步驟一:在 Railway 建 PostgreSQL,版本對齊舊站

Railway 專案右上角 + Add → Database → PostgreSQL。注意:Railway 官方 Postgres 範本目前是 18 版,如果舊站是 17,要在匯入資料之前,到 Postgres 服務的 Settings → Source,把 image 改成 ghcr.io/railwayapp-templates/postgres-ssl:17。

⚠️ 這一步一定要在資料庫還是空的時候做。已經有資料的資料庫直接改大版本號,Railway 官方文件說幾乎一定會啟動失敗。

Railway Postgres 服務設定:Source Image 改成 postgres-ssl:17,下方是 Public access 設定
步驟二:把區域改到新加坡,並確認有生效

Railway 在亞洲目前只有新加坡機房。到服務的 Settings → Scale → Regions 選 Southeast Asia (Singapore)。Postgres 和之後的 n8n 兩個服務都要設。更省事的做法是先到 Workspace Settings 把預設區域改成新加坡,之後新建的服務就會直接建在新加坡。

⚠️ 區域要在放資料之前就選好。已經掛了 volume 的服務換區域,volume 要跟著遷移,遷移期間服務會停擺。

Railway 服務設定的 Regions 選擇 Southeast Asia (Singapore)

改完一定要讀回確認:我們這次就遇到設好新加坡、部署後卻跑在美東的狀況(詳見踩坑筆記第 1 點)。

步驟三:從 Zeabur 匯出資料庫
  1. 先在 Zeabur 暫停 n8n 服務(PostgreSQL 保持運作),避免匯出途中還有新的執行紀錄寫進去
  2. 到 Zeabur 的 PostgreSQL 服務頁,找到對外連線的 Host 與 Port,以及帳號密碼
  3. 在本機執行:
pg_dump -Fc --no-owner --no-acl \
  "postgresql://使用者:密碼@Zeabur主機:連線埠/資料庫名稱" \
  -f n8n-final.dump

-Fc 是壓縮的自訂格式,搭配 pg_restore 使用。這份 dump 裡有你所有的 credentials(雖然是加密的),請當成機密檔案保管,搬完也別刪,先留著當最後一份備份。

步驟四:匯入 Railway

Railway 的資料庫預設不對外開放,從本機連進去有兩種方式:

  • Railway CLI 加密通道(推薦):railway connect Postgres --tunnel-only,不需要把資料庫公開
  • 暫時開 Public Access:Postgres 的 Settings → Networking → Add Public Access,會產生 DATABASE_PUBLIC_URL 變數;匯入完記得關掉,公開期間的流量也會計費
Railway Postgres 設定中的 Connect without exposing the database,提供 railway connect 指令

連得上之後執行:

pg_restore --no-owner --no-acl \
  -d "Railway 的連線字串" \
  n8n-final.dump

跑完到 Postgres 服務的 Database 分頁,確認 workflow_entity、credentials_entity、user 這幾張表都有資料。

四、步驟五~六:部署 n8n、綁自己的網域

步驟五:建立 n8n 服務

資料庫匯入完成後才建 n8n,避免 n8n 先在空資料庫上建好一套新的表。

  1. + Add → Docker Image,輸入固定版本號的 image,例如 docker.io/n8nio/n8n:2.2.5。不要用 latest,否則每次重新部署都可能默默升級
  2. 掛一個 volume 到 /home/node/.n8n
  3. 區域一樣改到新加坡(步驟二)
  4. 設定環境變數(下面這段)
Railway n8n 服務的 Source Image 固定為 n8nio/n8n:2.2.5

環境變數可以在 Variables 分頁用 Raw Editor 一次貼上。資料庫連線用 Railway 的變數參照 ${{Postgres.XXX}},密碼就不用手動複製:

DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=${{Postgres.PGHOST}}
DB_POSTGRESDB_PORT=${{Postgres.PGPORT}}
DB_POSTGRESDB_DATABASE=${{Postgres.PGDATABASE}}
DB_POSTGRESDB_USER=${{Postgres.PGUSER}}
DB_POSTGRESDB_PASSWORD=${{Postgres.PGPASSWORD}}

N8N_ENCRYPTION_KEY=(舊站那把,一個字都不能錯)

N8N_HOST=n8n.你的網域.com
N8N_PROTOCOL=https
N8N_PORT=5678
PORT=5678
WEBHOOK_URL=https://n8n.你的網域.com/
N8N_EDITOR_BASE_URL=https://n8n.你的網域.com/
N8N_PROXY_HOPS=1

GENERIC_TIMEZONE=Asia/Taipei
TZ=Asia/Taipei
RAILWAY_RUN_UID=0

幾個重點:

  • WEBHOOK_URL:n8n 在反向代理後面時,如果不設,webhook 網址會被拼成內部的 http://...:5678。n8n 2.35.0 之後改名為 N8N_WEBHOOK_URL(舊名稱還能用,但會出現警告),請依你的版本選用
  • N8N_PROXY_HOPS=1:Railway 前面有一層代理,設了 n8n 才拿得到真實的來源 IP 與協定
  • RAILWAY_RUN_UID=0:n8n 的 image 不是用 root 執行,掛 volume 會遇到權限問題,Railway 官方文件提供的解法就是這個變數
Railway n8n 服務的環境變數列表(值已隱藏)
步驟六:綁自己的網域

到 n8n 服務的 Settings → Networking → Public Networking → + Custom Domain,輸入例如 n8n.你的網域.com,Port 填 5678。Railway 會給你兩筆 DNS 記錄:CNAME 和 TXT 都要加,只加 CNAME 會出現 404。

Railway Networking 設定中已驗證的自訂網域,指向 Port 5678

如果你的 DNS 在 Cloudflare 而且開了 Proxy(橘色雲朵),SSL/TLS 模式要選 Full,不能選 Full (Strict)。

💡 為什麼一定要綁自己的網域?這次最花時間的不是搬資料,而是逐一去改散在各處的 webhook 網址。如果當初就用自己的網域,這次只要改一筆 DNS。下次不管換到哪個平台,呼叫端都不用再動。

五、步驟七~八:驗證與切換 webhook

步驟七:驗證新站

部署成功後,先在服務的 Deployments 分頁確認狀態是 ACTIVE、區域顯示 Southeast Asia,Postgres 和 n8n 兩個服務都要看。如果畫面上方出現「Apply changes」,先按 Details 看清楚內容,不認得的變更就按 Discard,不要直接 Deploy。

n8n 搬家到 Railway 後部署成功,區域為 Southeast Asia

接著逐項檢查:

  • 登入:用舊站的帳號密碼登入(資料庫整份搬,所以帳密相同)
  • workflow 數量:跟舊站一致
  • credentials:隨便打開一個,按 Test,能連上就代表 encryption key 正確
  • 手動執行一個不會對外造成影響的 workflow
  • n8n API:舊的 API key 一樣有效,只要把呼叫端的網址換掉
步驟八:切換 webhook 呼叫端

拿出準備階段的清單,逐一把舊網址改成新網域。webhook 路徑(/webhook/xxxx)不會變,只有網域會變。

每改一個就測一次:到 n8n 的 Executions 看新的執行紀錄有沒有進來。LINE 後台有「Verify」按鈕可以直接測;Notion automation 可以手動觸發一次。

六、步驟九:舊站收尾

新站穩定後再處理舊站,順序很重要:

  1. 暫停、不刪除:Zeabur 上的服務先全部暫停而不是刪除,萬一新站有狀況,還能重新啟動回退
  2. 留最後一份備份:步驟三的 dump 檔放在安全的地方
  3. 關閉自動續約:專用伺服器的「設定 → 自動續約」記得關掉,讓它到期自然關閉
  4. 申請餘額退款:Zeabur 公告餘額退款要向 Support 申請。注意不要直接使用自助退款,依 Zeabur 現行退款政策,自助退款會退成 Zeabur Credits,而不是退回原付款方式
Zeabur 專案列表,n8n 與 Postiz 服務皆已暫停(0/3 運作中)
Zeabur 專用伺服器設定中的自動續約已停用

最後,Railway 上也要有平台以外的備份。不管平台多穩,備份只放在同一個平台上都不算真正的備份。我們的做法是定期 pg_dump 到另一個儲存空間(例如 Cloudflare R2),encryption key 另外離線保存。

七、踩坑筆記與常見問題

坑 1:區域會被默默改回美東

我們明明設定了新加坡,部署後卻發現服務跑在美東(US East),volume 也一起被搬過去。之後 Dashboard 上還出現一筆「待套用」的變更,內容是把 Postgres 的區域從新加坡改成美東——只要按下 Deploy,資料庫就會被搬到美國。

Railway 待套用變更:把 Postgres 區域從 asia-southeast1 改成 iad

解法:每次部署後到 Deployments 分頁確認區域;看到「Apply changes」時,先按 Details 看清楚內容再決定要不要 Deploy,不認得的變更就 Discard。

坑 2:volume 權限錯誤,n8n 起不來

n8n 的 image 是用非 root 使用者執行,掛上 Railway volume 後會寫不進去。加上環境變數 RAILWAY_RUN_UID=0 就解決了。

坑 3:Postgres 版本不一致

Railway 官方 Postgres 範本是 18 版。舊站如果是 17,要在空資料庫時就把 image tag 改成 17,匯入後才改會啟動失敗。

坑 4:搬完登入不了

新站登入一直顯示 Wrong username or password,按「忘記密碼」又叫你聯絡管理員。原因是瀏覽器自動填入了別組舊密碼,手動輸入正確的密碼就好了。

⚠️ 網路上常見的解法 n8n user-management:reset 會刪除所有使用者帳號,回到剛安裝好的狀態,不要隨便執行。忘記密碼要寄信重設的話,n8n 必須先設定好 SMTP。

Q:n8n 的 API key 要重新產生嗎?

不用。API key 存在資料庫裡,整庫搬過去就一樣有效,只要把呼叫端(例如 n8n MCP、腳本)的網址換成新網域。

Q:大概要停機多久?

真正的停機只有「暫停舊站 n8n → 匯出 → 匯入 → 新站啟動」這段,資料量不大的話是幾分鐘到十幾分鐘。新的 Postgres 和 n8n 可以先用測試資料架好、驗證過,正式切換時再做最後一次匯出匯入,停機時間就能壓到最短。

八、給 AI 的執行清單

這次搬家,大部分步驟是 AI 助理幫我們做的。如果你也想交給 AI(例如 Claude Code、Codex 這類能下指令的 AI),這段是寫給它看的:把每一步改寫成「指令+怎麼確認成功」,並標出哪些步驟一定要停下來交給人。

使用方式:把這篇文章的網址交給 AI,並告訴它:

照這篇文章「給 AI 的執行清單」一步一步做。每一步做完先照「確認」檢查,結果不符就停下來回報,不要自己想辦法繞過。遇到 🙋 標記的步驟,停下來請我處理。
給 AI 的規則
  • 不要讓密鑰出現在對話裡:N8N_ENCRYPTION_KEY、資料庫密碼一律從剪貼簿或環境變數傳進指令,不要印出來、不要貼進對話
  • 禁止的動作:執行 n8n user-management:reset(會刪掉所有帳號)、Deploy 看不懂內容的待套用變更、刪除 Zeabur 上的任何服務
  • 不要自己拼連線字串:一律使用工具印出來的完整網址
前置:🙋 交給人
  1. 🙋 註冊 Railway、升級 Pro 方案、在 Workspace Settings 把預設區域改成新加坡,再建立一個空專案
  2. 🙋 到 Zeabur 的 PostgreSQL 服務開啟對外連線,把連線字串放進環境變數 ZEABUR_DB_URL(不要貼進對話)
  3. 🙋 準備好網域的 DNS 管理權限
A. 盤點舊站

A1. 查兩邊的版本:n8n 版本 🙋 請人到舊站左下角 Help → About n8n 查看。Postgres 版本用下面的指令查:

psql "$ZEABUR_DB_URL" -Atc 'show server_version;'

接著安裝同一個大版本的 PostgreSQL 客戶端,例如 17 就是 brew install postgresql@17。這個套件不會自動加進 PATH,所以先把它加進這個終端機的 PATH,之後的 psql、pg_dump、pg_restore 才會用到這個版本:

export PATH="$(brew --prefix postgresql@17)/bin:$PATH"

✅ 確認:pg_dump --version 的大版本和 server_version 相同。

A2. 取出 encryption key:先看 Zeabur n8n 服務的 Variables 有沒有 N8N_ENCRYPTION_KEY。沒有的話,🙋 請人到 Zeabur n8n 服務的 Overview → Command 執行:

cat /home/node/.n8n/config

裡面 encryptionKey 欄位的值就是 key。🙋 由人存進密碼管理器,不經過 AI。

A3. 列出 webhook 呼叫端:在本機全文搜尋舊網域,例如 grep -rl "舊網域" ~/,再加上 🙋 人記得的外部平台(LINE、Notion automation、捷徑等),整理成一張清單。

A4. 記下舊站資料筆數,最後驗證時要比對:

psql "$ZEABUR_DB_URL" -Atc 'select count(*) from workflow_entity; select count(*) from credentials_entity; select count(*) from "user";'
B. 建立資料庫並匯入

B1. 安裝並連結 Railway CLI:

brew install railway
railway login
railway link --project 專案名稱

✅ 確認:railway --version 要是 5.27.0 以上(B4 用到的 --tunnel-only 從這個版本才有)。

B2. 建立 Postgres,對齊版本與區域:

railway add --database postgres

如果 A1 查到的版本不是 18(Railway 範本的版本),趁資料庫還是空的,把 image 換成同一個大版本:

railway service source connect --image ghcr.io/railwayapp-templates/postgres-ssl:17 --service Postgres

區域如果不是新加坡:

railway scale --service Postgres southeast-asia=1

✅ 確認:🙋 請人在 Dashboard 看 Postgres 服務已部署成功、區域是 Southeast Asia。如果原本的區域還在,用 原區域=0 移除。

B3. 匯出舊資料庫:🙋 先請人在 Zeabur 暫停 n8n 服務(PostgreSQL 保持運作),然後執行:

pg_dump -Fc --no-owner --no-acl "$ZEABUR_DB_URL" -f n8n-final.dump

✅ 確認:pg_restore -l n8n-final.dump | grep -c "TABLE DATA" 大於 0。

B4. 匯入 Railway:開一條加密通道,讓這個指令一直開著(AI 可以放在背景執行):

railway connect Postgres --tunnel-only

它會印出 Host、Port、User、Password、Database 和完整的 URL(主機是 127.0.0.1)。把印出來的 URL 放進環境變數 RAILWAY_DB_URL,然後執行:

pg_restore --no-owner --no-acl --exit-on-error -d "$RAILWAY_DB_URL" n8n-final.dump

✅ 確認:把 A4 的查詢指令換成 $RAILWAY_DB_URL 再跑一次,三個數字要和舊站一模一樣。

C. 部署 n8n

順序很重要:區域、資料庫變數、encryption key 都設好之後,才掛 volume。n8n 第一次在 volume 上啟動時,如果還沒有 key,就會自己產生一把新的寫進 volume,之後再設回舊 key 就會出現 Mismatching encryption keys,n8n 起不來。

C1. 建立服務並設定區域(版本號用 A1 查到的):

railway add --image docker.io/n8nio/n8n:2.2.5
railway scale --service n8n southeast-asia=1

服務名稱以 Railway 實際建出來的為準,以下用 n8n 代稱。

C2. 設定環境變數:${{...}} 要用單引號包起來,否則 shell 會把它當成自己的變數處理掉:

railway variable set \
  DB_TYPE=postgresdb \
  'DB_POSTGRESDB_HOST=${{Postgres.PGHOST}}' \
  'DB_POSTGRESDB_PORT=${{Postgres.PGPORT}}' \
  'DB_POSTGRESDB_DATABASE=${{Postgres.PGDATABASE}}' \
  'DB_POSTGRESDB_USER=${{Postgres.PGUSER}}' \
  'DB_POSTGRESDB_PASSWORD=${{Postgres.PGPASSWORD}}' \
  N8N_HOST=n8n.你的網域.com N8N_PROTOCOL=https N8N_PORT=5678 PORT=5678 \
  WEBHOOK_URL=https://n8n.你的網域.com/ N8N_EDITOR_BASE_URL=https://n8n.你的網域.com/ \
  N8N_PROXY_HOPS=1 GENERIC_TIMEZONE=Asia/Taipei TZ=Asia/Taipei RAILWAY_RUN_UID=0 \
  --service n8n --skip-deploys

Encryption key 從剪貼簿直接送進去,不會出現在對話裡(🙋 請人先把 key 複製到剪貼簿):

pbpaste | railway variable set N8N_ENCRYPTION_KEY --stdin --service n8n --skip-deploys

✅ 確認:railway variable list --service n8n --kv 有列出上面所有的變數名稱。只看名稱,不要把值印進對話。

C3. 掛 volume:

railway volume add --mount-path /home/node/.n8n --service n8n
railway redeploy --service n8n --yes

✅ 確認:🙋 請人在 Dashboard 看 n8n 服務是 ACTIVE、區域是 Southeast Asia。部署紀錄裡不能有 Mismatching encryption keys。如果畫面上方出現「Apply changes」,停下來交給人看 Details。

D. 網域、驗證、切換

D1. 綁定網域:

railway domain n8n.你的網域.com --port 5678 --service n8n

🙋 把指令回傳的 CNAME 和 TXT 兩筆記錄交給人去加。DNS 在 Cloudflare 而且開了 Proxy 的話,SSL/TLS 模式要選 Full。

✅ 確認:railway domain status n8n.你的網域.com 顯示已驗證,而且 curl -s https://n8n.你的網域.com/healthz 回 HTTP 200。這個端點只代表 n8n 有在運作,不代表資料庫連線正常,所以還要做 D2。

D2. 驗證:🙋 請人用舊帳密登入,打開任一個 credential 按 Test,再手動執行一個不會對外造成影響的 workflow。

D3. 切換 webhook:本機腳本和設定檔可以由 AI 依 A3 的清單逐一替換網域;外部平台 🙋 交給人改。每改一個,就到 n8n 的 Executions 確認新的執行紀錄有進來。

D4. 收尾:🙋 舊站只暫停、不刪除,關閉自動續約、申請退款都由人處理。n8n-final.dump 留著當最後一份備份。

結語:搬家這件事,我們陪你

這次 n8n 搬家,從決定搬到所有 webhook 切換完成,我們花了一天。真正花時間的不是技術本身,而是盤點散在各處的呼叫端,以及每一步都要驗證。

如果你的 n8n 或其他服務也在 Zeabur 上,需要人陪著一起搬,歡迎聯繫呼嚕實驗室。當初是我們推薦的客戶,我們會負責陪到搬完。

🎁 Railway 推薦連結

也在找新家的朋友,可以用我們的推薦連結註冊,會拿到 US$20 的 Railway 額度,可以先部署一個服務試試 🐾

👉 https://railway.com?referralCode=k6vgPv

(透明宣言:你開始付費後,我們會拿到一點推薦回饋)

返回頂端