在本地 Docker 執行 n8n,並用 Cloudflare Tunnel 接收 Webhook

用 Docker 在本地執行 n8n,再透過 Cloudflare Tunnel 建立公開入口,讓外部服務觸發 Webhook。

6 分鐘閱讀
在本地 Docker 執行 n8n,並用 Cloudflare Tunnel 接收 Webhook
文章目錄

本地的 n8n 可以在 localhost:5678 正常執行,但外部服務看不到你的 localhost。這也是很多 webhook 教學最容易跳過的地方:容器啟動成功,只代表本機能開啟介面,不代表 GitHub、付款服務或其他雲端服務能把 HTTP 請求送進來。

這篇整理我在 2025 年於 Windows 實作的部署流程:用 Docker 保存 n8n 資料,再用 Cloudflare Tunnel 將公開主機名稱連到本機服務。

先分清楚:本機服務和公開 webhook

n8n 是以工作流程節點串起資料輸入、處理與輸出的自動化平台。當 webhook 節點顯示 http://localhost:5678/... 時,它只是在本機監聽。外部服務無法把請求直接送到你的私有網路,所以需要一個公開入口,再由入口把流量轉回本機。

設定 Tunnel 時,將指定的公開主機名稱連到本機 n8n,並設定入口路由與存取認證。

Docker 只負責讓 n8n 穩定地跑起來

原始實作使用 n8nio/n8n 映像與 /home/node/.n8n 掛載路徑。持久化 volume 的重點是保留 workflow、credential 加密資料、設定與執行紀錄;若只用 --rm 而沒有掛載資料,容器刪除後就會失去本機狀態。

下面使用單容器命令建立本機 n8n,並掛載資料目錄:

docker volume create n8n_data
docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -e GENERIC_TIMEZONE="Asia/Taipei" \
  -e TZ="Asia/Taipei" \
  -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
  -v n8n_data:/home/node/.n8n \
  n8nio/n8n

啟動後,先在本機確認 http://localhost:5678 可以打開並完成初始設定。若目標是長期執行,應改讀官方 Docker Compose 範例、固定映像版本、保存 encryption key、設定備份與更新流程;latest 是可變的標籤,不應當成可重現版本。

Docker 在 Windows 終端機顯示版本
在本機檢查 Docker CLI 的版本。

Cloudflare Tunnel 如何補上公開入口?

Cloudflare Tunnel 的角色是讓本機的 cloudflared 主動建立到 Cloudflare 的連線,再把公開 hostname 映射到本機服務。外部請求先到 Cloudflare,再經 tunnel 送到 http://localhost:5678;這與直接在路由器開 inbound port 不同。

Cloudflare 目前推薦多數情境使用 remotely-managed tunnel;locally-managed tunnel 仍適合特定的本地開發、測試或 legacy 設定。若沿用本文的 CLI 路徑,最小流程是:

cloudflared tunnel login
cloudflared tunnel create n8n-tunnel
cloudflared tunnel route dns n8n-tunnel webhook.example.com
cloudflared tunnel run n8n-tunnel

config.yml 需要把 tunnel ID、credentials file 和 ingress 指向本機 n8n:

tunnel: <TUNNEL-UUID>
credentials-file: C:\Users\<YOUR-USERNAME>\.cloudflared\<TUNNEL-UUID>.json

ingress:
  - hostname: webhook.example.com
    service: http://localhost:5678
  - service: http_status:404

原文曾直接連到一個帶有日期的 cloudflared Windows 執行檔。那個下載網址不應永久複製;請改從 Cloudflare Tunnel 官方下載與建立指南 取得適合平台的版本,並先執行 cloudflared --version。需要開機常駐時,再參考官方的 Windows service 指南。

原始文章說明本機服務與外部網路的關係
公開主機名稱經由 Cloudflare Tunnel 連到本機服務。

Webhook 測試網址和正式網址不是同一個

n8n 的 webhook 通常會區分測試與 production URL。測試 URL 只有在編輯器等待測試時才可用;工作流程啟用後,外部服務應使用 production URL。透過 reverse proxy 或 tunnel 時,還要讓 n8n 知道外部使用的 scheme、host 與 path,否則畫面產生的連結可能仍指向 localhost。

因此驗證順序應該是:

  1. 先在 localhost:5678 讓 workflow 能接收本機請求。
  2. 再從另一個網路位置呼叫公開 hostname,確認 tunnel 有轉發到相同 workflow。
  3. 最後檢查 n8n 顯示的 webhook URL、TLS、認證、CORS 與 payload,不要只看瀏覽器能否打開首頁。

電子報訂閱工作流程會在收到 Webhook 後檢查電子郵件格式、處理重複訂閱與請求頻率,並記錄執行結果。Tunnel 負責將外部請求送到這個工作流程。

從本機工作流程到公開 Webhook

這次完成了「Docker 本機服務 → Cloudflare Tunnel → 公開 webhook」的連線流程。Docker 保存 n8n 的工作流程與設定,Tunnel 則讓外部服務的請求能送到本機。

後續設定可參考 n8n self-hosting 文件、Docker Compose 安裝文件與 Cloudflare Tunnel routing 文件。