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,需要搬家的人
- 會開終端機、看得懂環境變數,但不想自己顧主機的人
📋 文章目錄
一、為什麼選 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。
二、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 在亞洲目前只有新加坡機房。到服務的 Settings → Scale → Regions 選 Southeast Asia (Singapore)。Postgres 和之後的 n8n 兩個服務都要設。更省事的做法是先到 Workspace Settings 把預設區域改成新加坡,之後新建的服務就會直接建在新加坡。
⚠️ 區域要在放資料之前就選好。已經掛了 volume 的服務換區域,volume 要跟著遷移,遷移期間服務會停擺。
改完一定要讀回確認:我們這次就遇到設好新加坡、部署後卻跑在美東的狀況(詳見踩坑筆記第 1 點)。
步驟三:從 Zeabur 匯出資料庫
- 先在 Zeabur 暫停 n8n 服務(PostgreSQL 保持運作),避免匯出途中還有新的執行紀錄寫進去
- 到 Zeabur 的 PostgreSQL 服務頁,找到對外連線的 Host 與 Port,以及帳號密碼
- 在本機執行:
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變數;匯入完記得關掉,公開期間的流量也會計費
連得上之後執行:
pg_restore --no-owner --no-acl \
-d "Railway 的連線字串" \
n8n-final.dump
跑完到 Postgres 服務的 Database 分頁,確認 workflow_entity、credentials_entity、user 這幾張表都有資料。
四、步驟五~六:部署 n8n、綁自己的網域
步驟五:建立 n8n 服務
資料庫匯入完成後才建 n8n,避免 n8n 先在空資料庫上建好一套新的表。
- + Add → Docker Image,輸入固定版本號的 image,例如
docker.io/n8nio/n8n:2.2.5。不要用latest,否則每次重新部署都可能默默升級 - 掛一個 volume 到
/home/node/.n8n - 區域一樣改到新加坡(步驟二)
- 設定環境變數(下面這段)
環境變數可以在 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 官方文件提供的解法就是這個變數
步驟六:綁自己的網域
到 n8n 服務的 Settings → Networking → Public Networking → + Custom Domain,輸入例如 n8n.你的網域.com,Port 填 5678。Railway 會給你兩筆 DNS 記錄:CNAME 和 TXT 都要加,只加 CNAME 會出現 404。
如果你的 DNS 在 Cloudflare 而且開了 Proxy(橘色雲朵),SSL/TLS 模式要選 Full,不能選 Full (Strict)。
💡 為什麼一定要綁自己的網域?這次最花時間的不是搬資料,而是逐一去改散在各處的 webhook 網址。如果當初就用自己的網域,這次只要改一筆 DNS。下次不管換到哪個平台,呼叫端都不用再動。
五、步驟七~八:驗證與切換 webhook
步驟七:驗證新站
部署成功後,先在服務的 Deployments 分頁確認狀態是 ACTIVE、區域顯示 Southeast Asia,Postgres 和 n8n 兩個服務都要看。如果畫面上方出現「Apply changes」,先按 Details 看清楚內容,不認得的變更就按 Discard,不要直接 Deploy。
接著逐項檢查:
- 登入:用舊站的帳號密碼登入(資料庫整份搬,所以帳密相同)
- workflow 數量:跟舊站一致
- credentials:隨便打開一個,按 Test,能連上就代表 encryption key 正確
- 手動執行一個不會對外造成影響的 workflow
- n8n API:舊的 API key 一樣有效,只要把呼叫端的網址換掉
步驟八:切換 webhook 呼叫端
拿出準備階段的清單,逐一把舊網址改成新網域。webhook 路徑(/webhook/xxxx)不會變,只有網域會變。
每改一個就測一次:到 n8n 的 Executions 看新的執行紀錄有沒有進來。LINE 後台有「Verify」按鈕可以直接測;Notion automation 可以手動觸發一次。
六、步驟九:舊站收尾
新站穩定後再處理舊站,順序很重要:
- 暫停、不刪除:Zeabur 上的服務先全部暫停而不是刪除,萬一新站有狀況,還能重新啟動回退
- 留最後一份備份:步驟三的 dump 檔放在安全的地方
- 關閉自動續約:專用伺服器的「設定 → 自動續約」記得關掉,讓它到期自然關閉
- 申請餘額退款:Zeabur 公告餘額退款要向 Support 申請。注意不要直接使用自助退款,依 Zeabur 現行退款政策,自助退款會退成 Zeabur Credits,而不是退回原付款方式
最後,Railway 上也要有平台以外的備份。不管平台多穩,備份只放在同一個平台上都不算真正的備份。我們的做法是定期 pg_dump 到另一個儲存空間(例如 Cloudflare R2),encryption key 另外離線保存。
七、踩坑筆記與常見問題
坑 1:區域會被默默改回美東
我們明明設定了新加坡,部署後卻發現服務跑在美東(US East),volume 也一起被搬過去。之後 Dashboard 上還出現一筆「待套用」的變更,內容是把 Postgres 的區域從新加坡改成美東——只要按下 Deploy,資料庫就會被搬到美國。
解法:每次部署後到 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 上的任何服務 - 不要自己拼連線字串:一律使用工具印出來的完整網址
前置:🙋 交給人
- 🙋 註冊 Railway、升級 Pro 方案、在 Workspace Settings 把預設區域改成新加坡,再建立一個空專案
- 🙋 到 Zeabur 的 PostgreSQL 服務開啟對外連線,把連線字串放進環境變數
ZEABUR_DB_URL(不要貼進對話) - 🙋 準備好網域的 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
(透明宣言:你開始付費後,我們會拿到一點推薦回饋)


