下面是整趟 n8n on Linode + Cloudflare Tunnel 部署旅程完整總整理
包含每一步、每個踩雷點、每個修法。
Linode 上部署:
-
Docker + Docker Compose
-
n8n with persistent volume
-
Cloudflare Tunnel (免開 port、HTTPS、domain)
-
安全保護(BasicAuth)
最終網址 : https://n8n.stackpenguin.com (根據你自己的網域)
系統前置
SSH 進 Linode → 更新
1sudo apt update && sudo apt upgrade -y1sudo apt update && sudo apt upgrade -y安裝 Docker & Compose(先確認再裝)
檢查 Docker
1docker --version1docker --version沒有就安裝
1curl -fsSL https://get.docker.com | sudo bash2sudo usermod -aG docker $USER1curl -fsSL https://get.docker.com | sudo bash2sudo usermod -aG docker $USER檢查 Compose
1docker-compose --version1docker-compose --version沒有就安裝
1sudo apt install docker-compose -y1sudo apt install docker-compose -y建立 n8n 工作資料夾
1mkdir -p ~/n8n2cd ~/n8n1mkdir -p ~/n8n2cd ~/n8n建立 docker-compose.yml
一開始你用 docker run,後來換 compose(正確)
1version: "3.3"2<div></div>3services:4 n8n:5 image: docker.n8n.io/n8nio/n8n6 container_name: n8n7 environment:8 - GENERIC_TIMEZONE=Asia/Taipei9 - TZ=Asia/Taipei10 - N8N_PORT=567811 - N8N_HOST=n8n.stackpenguin.com12 - N8N_EDITOR_BASE_URL=https://n8n.stackpenguin.com13<div></div>14 # secure login15 - N8N_BASIC_AUTH_ACTIVE=true16 - N8N_BASIC_AUTH_USER=orcajunkai17 - N8N_BASIC_AUTH_PASSWORD=<你的密碼>18<div></div>19 ports:20 - "5678:5678"21 volumes:22 - ./data:/home/node/.n8n23 restart: unless-stopped1version: "3.3"2
3services:4 n8n:5 image: docker.n8n.io/n8nio/n8n6 container_name: n8n7 environment:8 - GENERIC_TIMEZONE=Asia/Taipei9 - TZ=Asia/Taipei10 - N8N_PORT=567811 - N8N_HOST=n8n.stackpenguin.com12 - N8N_EDITOR_BASE_URL=https://n8n.stackpenguin.com13
14 # secure login15 - N8N_BASIC_AUTH_ACTIVE=true16 - N8N_BASIC_AUTH_USER=orcajunkai17 - N8N_BASIC_AUTH_PASSWORD=<你的密碼>18
19 ports:20 - "5678:5678"21 volumes:22 - ./data:/home/node/.n8n23 restart: unless-stopped⚠️ 關鍵:不能放
N8N_PROTOCOL=https(那會 crash)
記得要將防火牆設定允許
1orcajunkai@localhost:~$ sudo ufw allow 56782Rule added3Rule added (v6)4orcajunkai@localhost:~$ sudo ufw reload5Firewall reloaded1orcajunkai@localhost:~$ sudo ufw allow 56782Rule added3Rule added (v6)4orcajunkai@localhost:~$ sudo ufw reload5Firewall reloaded啟動 n8n
1docker-compose up -d2docker ps3curl http://localhost:56781docker-compose up -d2docker ps3curl http://localhost:5678Cloudflare Tunnel 登入
安裝 cloudflared
1wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb2sudo dpkg -i cloudflared-linux-amd64.deb1wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb2sudo dpkg -i cloudflared-linux-amd64.deb登入
1cloudflared tunnel login1cloudflared tunnel login
建 tunnel
1cloudflared tunnel create n8n1cloudflared tunnel create n8n取得 UUID
建 DNS mapping
1cloudflared tunnel route dns n8n n8n.stackpenguin.com1cloudflared tunnel route dns n8n n8n.stackpenguin.com建 Cloudflare config
1sudo nano /etc/cloudflared/config.yml1sudo nano /etc/cloudflared/config.yml貼:
1tunnel: <UUID>2credentials-file: /home/orcajunkai/.cloudflared/<UUID>.json3<div></div>4ingress:5 - hostname: n8n.stackpenguin.com6 service: http://localhost:56787 - service: http_status:4041tunnel: <UUID>2credentials-file: /home/orcajunkai/.cloudflared/<UUID>.json3
4ingress:5 - hostname: n8n.stackpenguin.com6 service: http://localhost:56787 - service: http_status:404啟動 Tunnel
1sudo cloudflared service install2sudo systemctl enable cloudflared3sudo systemctl start cloudflared4systemctl status cloudflared1sudo cloudflared service install2sudo systemctl enable cloudflared3sudo systemctl start cloudflared4systemctl status cloudflared遇到的問題 & 解決
| Issue | 解析 | 解法 |
|---|---|---|
| 反引號 ` 在 Ubuntu 不能用 | Windows copy 的 shell | Linux 用 \ 換行 |
| Tunnel 502 | config path / hostname / protocol 錯 | 修 config.yml |
UUID.json not found | <UUID> 沒替換 | 改成真 UUID |
curl localhost:5678 failed | n8n crash | remove HTTPS env |
EACCES /home/node/.n8n/config | volume 權限不對 | chown 1000:1000 data/ |
| container restart loop | wrong env / permissions | Fix compose & folder perms |
| Everyone can access n8n | 公開服務 | 啟 basic auth env |
最後驗證
1orcajunkai@localhost:~/n8n$ curl http://localhost:56782<!DOCTYPE html>3<html lang="en">4<head>5<meta charset="utf-8">6<title>Error</title>7</head>8<body>9<pre>Cannot GET /</pre>10</body>11</html>1orcajunkai@localhost:~/n8n$ curl http://localhost:56782<!DOCTYPE html>3<html lang="en">4<head>5<meta charset="utf-8">6<title>Error</title>7</head>8<body>9<pre>Cannot GET /</pre>10</body>11</html>Browser:https://n8n.stackpenguin.com (自己的網域)
跳出 BasicAuth → Login → 看到 n8n UI ✅

Cloudflared 運作原理
你想知道為啥:
1https://n8n.stackpenguin.com2
3可以指到你 Linode 上的 n8n4而且你 沒有開 5678 port、也沒有裝 Nginx/Certbot5卻 magically 有 HTTPS + domain?🔥 Cloudflare Tunnel 的核心概念
平常網站流程是:
1User → Domain → Public IP → Server → App (n8n)但 Cloudflare Tunnel 是:
1User → Cloudflare → Tunnel → Your Server → n8n你的 server 變成主動連 Cloudflare,不是 Cloudflare 來找你
這樣:
-
不用開 Port 80/443/5678
-
不用裝 Nginx
-
不用 SSL cert
-
網路封死也能連
超安全又 chill 這就是為什麼 tunnel 是超熱門 DevOps meta hack
那「綁定網址」到底做了什麼?
你做了兩件事:
1. Cloudflare DNS 建立 Route
這條指令:
1cloudflared tunnel route dns n8n n8n.stackpenguin.com1cloudflared tunnel route dns n8n n8n.stackpenguin.com意思:
讓 n8n.stackpenguin.com 指向這條 Cloudflare Tunnel
Cloudflare 幫你塞一條 CNAME 到 DNS:
1n8n.stackpenguin.com → <Cloudflare Tunnel endpoint>2
3不是指向你的 Linode IP4是指向 Cloudflare 的 secure gateway2. Tunnel config 說「這 domain 對應這 app」
你的 /etc/cloudflared/config.yml
1ingress:2 - hostname: n8n.stackpenguin.com3 service: http://localhost:56781ingress:2 - hostname: n8n.stackpenguin.com3 service: http://localhost:5678意思:
有人打
n8n.stackpenguin.com
→ Cloudflare 收 request
→ 丟給 Tunnel
→ Tunnel 轉給你 Linode
→ 你的 n8n 回應
完全不露 IP
完全不需要開 Port
完全不需要 TLS 憑證
一句話版本
Cloudflare Tunnel 把你 server 變成:
末端加密節點
Cloudflare 當你的「外部大門 + HTTPS + Firewall」
你 server 只是「內部房間」
所以 https://n8n.stackpenguin.com 是 Cloudflare 給 HTTPS
不是你自己做 HTTPS
骨架圖(秒懂)
1🌍 User Browser2 ↓ https://n8n.stackpenguin.com3Cloudflare Edge (SSL / Firewall / CDN)4 ↓ Tunnel (Secure connection)5Linode VM6 ↓ localhost:56787n8n dashboard1🌍 User Browser2 ↓ https://n8n.stackpenguin.com3Cloudflare Edge (SSL / Firewall / CDN)4 ↓ Tunnel (Secure connection)5Linode VM6 ↓ localhost:56787n8n dashboard現在有什麼?
已經跑在:
💠 Cloudflare Zero Trust Tunnel
💠 隱藏原始 IP
💠 強制 HTTPS
💠 密碼保護 (Basic Auth)
💠 沒開任何 external port(最安全)
你走的不是傳統 Web Hosting
你走的是 Zero Trust Architecture
部分資訊可能已經過時