n8n Docker 安裝完整教學:5 分鐘本機跑起來,再升級 VPS 正式環境
n8n Docker 安裝完整教學,從本機試玩到 VPS 正式部署,含環境變數、備份升級與錯誤排除。
開頭導言
要安裝 n8n,Docker 是最穩定的選擇。官方映像是 docker.n8n.io/n8nio/n8n,預設埠為 5678。只想試玩可先看第一段;若要長期自架,或 webhook 需要由外部觸發,直接看第二段。這篇補上許多中文教學常漏掉的三件事:N8N_ENCRYPTION_KEY、WEBHOOK_URL,以及升級前的備份與回滾。
1|先確認:你該用哪一種安裝法?
三條路的成本與適用情境
| 方案 | 月成本 | 維運責任 | 適合誰 |
|---|---|---|---|
| n8n Cloud Starter | 約 €24/月(含 2,500 executions) | 零 | 執行量小、不想碰伺服器 |
| 自架 Docker(Community Edition) | 軟體免費,只有機器成本(常見 VPS 約 US$5–7/月) | 自己管 | 執行量大、要無限 workflow |
| 代管型 n8n(如 PikaPods 等外部平台) | 約 US$3.7–7/月 | 低 | 想省 VPS 設定但仍要自己的實例 |
以上皆為外部服務或市場行情,非本站提供的服務。
什麼時候該從「本機試玩」升級成「VPS 正式版」
出現以下三個訊號時:workflow 要定時跑、需要外部 webhook 觸發、開始有第二個人共用。
2|5 分鐘本機版:一行 docker run 跑起來
前置需求
Docker Desktop(macOS / Windows)或 Docker Engine(Linux)、5678 埠未被占用。
三行指令(可直接複製)
docker volume create n8n_data
docker run -it —rm —name n8n -p 5678:5678
-v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n
開 http://localhost:5678 建管理員帳號即可。指令細節可對照 n8n 官方 Docker 自架文件。
⚠️ 最高頻新手災難:沒掛 volume=重開全部消失
資料實際落在容器內 /home/node/.n8n,workflow、憑證、SQLite 都在裡面。--rm 加上沒掛 volume 就等於刪檔。備份時要備份這個 volume。
3|正式版:Docker Compose + PostgreSQL 部署到 VPS
為什麼正式環境要換掉 SQLite
單人試玩用 SQLite 已足夠;多人、執行量大、需要穩定並發時則改用 Postgres。可參考以下判斷點:同時有 5 個以上 workflow 在跑、webhook 每分鐘超過 10 次,或需要多使用者權限管理。
docker-compose.yml 範例(n8n + PostgreSQL 兩個 service)
services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: n8n POSTGRES_PASSWORD_FILE: /run/secrets/db_password POSTGRES_DB: n8n volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: [“CMD-SHELL”, “pg_isready -U n8n”] interval: 10s timeout: 5s retries: 5
n8n: image: docker.n8n.io/n8nio/n8n:1.96.2 restart: unless-stopped ports: - “127.0.0.1:5678:5678” environment: N8N_ENCRYPTION_KEY_FILE: /run/secrets/n8n_encryption_key DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_PORT: 5432 DB_POSTGRESDB_USER: n8n DB_POSTGRESDB_PASSWORD_FILE: /run/secrets/db_password DB_POSTGRESDB_DATABASE: n8n N8N_HOST: n8n.example.com WEBHOOK_URL: https://n8n.example.com N8N_PROTOCOL: https depends_on: postgres: condition: service_healthy volumes: - n8n_data:/home/node/.n8n
volumes: pgdata: n8n_data:
生產預設要素:
- 釘死版本標籤(如
1.96.2),不要用:latest——升級才可控、才回滾得了 restart: unless-stopped:主機重開自動拉回- Postgres healthcheck,n8n 用
depends_on等資料庫就緒 - 埠只綁
127.0.0.1:5678,對外由反向代理處理 - 密碼用
_FILE後綴走 Docker Secrets,不要把密碼裸寫進 compose
綁網域與 HTTPS(反向代理)
Caddy 自動憑證最省事,Nginx 生態最廣,Traefik 適合已有容器叢集。重點是代理必須把 Host 與 X-Forwarded-* 正確傳進去,否則 webhook 網址會歪掉。
4|上線前必設的 4 個環境變數
完整清單見 n8n 環境變數官方參考。
N8N_ENCRYPTION_KEY:弄丟=所有已存憑證全部解不開
必須自己固定一組並備份,不要讓它每次重建容器時自動生成。產生方式:openssl rand -hex 32。
WEBHOOK_URL / N8N_HOST:沒設,webhook 節點會給你 localhost 網址
這是「流程在編輯器裡按了會動、外部服務打不進來」的原因。本機測試可改用 tunnel(如 n8n start --tunnel)。
DB_TYPE=postgresdb 與 DB_POSTGRESDB_*
連線參數對照如上 compose 範例。切換後原本 SQLite 的資料不會自動搬過去,需手動匯出再匯入。
⚠️ n8n 只在啟動時讀一次 env
改了 .env 或 compose 卻沒重啟容器,設定完全不會生效,很多人會在這裡浪費一小時。
5|備份、升級與回滾
升級三步
docker compose pull docker compose down docker compose up -d
升級前一定要做的事
先備份 volume 與 Postgres、查 release note(資料庫 schema 可能遷移)、確認加密金鑰有留檔。
回滾怎麼做
把 image tag 改回舊版本並還原備份——前提是有備份。schema 已遷移過的情況下,沒有備份就回不去。
6|常見錯誤排查表
| 症狀 | 原因 | 解法 |
|---|---|---|
| 重啟後 workflow 全不見 | 沒掛 volume | 用 named volume n8n_data:/home/node/.n8n |
EACCES: permission denied | bind mount 宿主目錄擁有者不是容器內 node(1000) | sudo chown -R 1000:1000 <dir> + chmod -R 755,或改用 named volume |
| 開不了 5678 | 埠被占用/防火牆/只綁了 127.0.0.1 但沒設代理 | lsof -i :5678 查占用;檢查防火牆規則 |
| 憑證全部失效 | 加密金鑰換掉了 | 確認 N8N_ENCRYPTION_KEY 與上次一致 |
| webhook 外部觸發不了 | WEBHOOK_URL/N8N_HOST 沒對上實際網域,或反向代理用自簽憑證 | 檢查環境變數與代理設定 |
| 容器反覆重啟/exit 137 | 記憶體不足 | VPS 規格太小,建議至少 1GB RAM |
7|裝好了,然後呢?
安裝只花 10 分鐘;「不知道要建什麼流程」才是多數人裝完後就放著長灰塵的原因。
n8nstart.cc 整理了 1700+ 現成 n8n 工作流模板,從 AI 自動回信、訂單通知、表單串 Google Sheet 到多步驟行銷自動化,直接匯入就能用,省去從空白畫布開始的階段。更多自架與流程設計文章見部落格。
常見問答
Q1:用 Docker 安裝 n8n,資料會不會不見?
只要掛上 n8n_data:/home/node/.n8n 就不會。備份就是備份這個 volume,用 docker run --rm -v n8n_data:/data -v $(pwd):/backup alpine tar czf /backup/n8n_backup.tar.gz -C /data . 即可。
Q2:出現 EACCES: permission denied 怎麼辦?
這是 bind mount 權限問題。chown -R 1000:1000,或改用 named volume 直接避開。
Q3:怎麼更新到新版 n8n?
pull → down → up -d,更新前先備份並看 release note。
Q4:Webhook 為什麼外部觸發不了?
WEBHOOK_URL / N8N_HOST 未設或與實際網域不符。確認反向代理正確傳遞 Host header。
Q5:該用 SQLite 還是 PostgreSQL?
試玩用預設 SQLite;多人、量大、要穩定並發就上 Postgres。
Q6:自架划算還是買 n8n Cloud?
自架月成本約 US$5–7,但要自己維運;Cloud Starter 約 €24/月,含 2,500 executions。量大選自架,省心選 Cloud。