把工作流自架在 NAS:先把安全與維護一起規劃好。

n8n 是可自架的 source-available 工作流自動化工具,可串接多種服務。本文用 Docker Compose 在 Synology NAS 安裝 n8n,完成 HTTPS、秘密管理與常見自動化範例。

如果你有在用 Zapier 或 Make(前身 Integromat),你知道這類工具的價值:把不同服務串在一起,讓它們自動交換資料、觸發動作。雲端方案的價格、執行額度與功能會隨方案調整,不能只用單一月費比較。

n8n 是這個領域的可自架替代方案,採 source-available/Sustainable Use License。你可以把 Community Edition 部署在自己的伺服器上,省下雲端訂閱費,但仍要負責 NAS、網域、備份、更新、監控與外部 API 的費用及風險;自架不等於所有功能或執行成本都無限制。

這篇帶你把 n8n 裝在 Synology NAS 的 Docker 裡,設定好 HTTPS 對外存取,然後示範幾個實用的自動化場景。

n8n 自動化工作流架構:NAS 上的 n8n 串接外部服務

n8n 是什麼

n8n(唸做 "n-eight-n")是一個基於節點(Node)的視覺化工作流自動化工具。你用拖拉的方式連接不同的「節點」,每個節點代表一個服務或操作(收 Gmail、呼叫 API、寫入試算表、發 Telegram 訊息),節點之間傳遞資料,形成自動化工作流。

n8n 的特點:

  • 支援多種服務整合(Google Workspace、GitHub、Slack、Discord、Notion、LINE、Telegram 等;實際清單與版本以官方文件為準)
  • HTTP Request 節點:可以呼叫任何 REST API,無官方整合也能用
  • Webhook 節點:當外部服務觸發時執行工作流
  • 排程執行:定時跑任務
  • 條件分支、迴圈:支援複雜邏輯
  • 本機 AI 節點:可串接 OpenAI、Ollama 做 AI 處理

自架版本可滿足許多個人工作流需求,但功能、授權與方案差異要以 n8n 當期文件為準。雲端版則把基礎設施、更新與部分治理能力交給 n8n 管理。


前置需求

  • Synology NAS 已安裝 Container Manager(DSM 7.2+)
  • 已設定好對外域名(DDNS 或自訂域名)
  • 已安裝 Nginx Proxy Manager 或其他反向代理(用於 HTTPS)

還沒設定反向代理?可以先看 Synology Nginx Proxy Manager 完整教學


Docker Compose 設定

建立資料夾

在 NAS 的 File Station 建立以下目錄結構:

/docker/n8n/

docker-compose.yml

透過 Container Manager → 專案 → 新增,貼入以下 Compose:

version: "3.8"

services:
  n8n:
    image: n8nio/n8n:latest  # 生產環境建議改成已驗證的固定版本
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://n8n.yourdomain.com/
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - GENERIC_TIMEZONE=Asia/Taipei
      - TZ=Asia/Taipei
    volumes:
      - /docker/n8n:/home/node/.n8n

n8n.yourdomain.com 換成你實際的域名。

安全提醒: 若使用反向代理,請限制 5678 的直接外部存取,只讓代理與必要的內網來源連線;N8N_ENCRYPTION_KEY 應放在受保護的 .env 或 secret,不要提交到公開 Git。

環境變數說明:

變數 說明
N8N_HOST n8n 對外的域名
N8N_PROTOCOL 設為 https(透過反向代理)
WEBHOOK_URL Webhook 的完整 URL 前綴,需和對外域名一致
GENERIC_TIMEZONE 工作流排程的時區

在 Compose 專案目錄另放受限權限的 .env,例如:

N8N_ENCRYPTION_KEY=請產生一組長且隨機的值
DB_POSTGRESDB_PASSWORD=請使用另一組長且隨機的值

.env 不要提交到 Git,也不要把密碼貼在截圖或公開教學中;請把它納入加密備份,並把加密金鑰與備份復原流程一併保存。若遺失 N8N_ENCRYPTION_KEY,已儲存的憑證可能無法正常解密。


設定 Nginx Proxy Manager

n8n 預設跑在 Port 5678,用 HTTP。透過 Nginx Proxy Manager 加上 HTTPS:

  1. 進入 NPM → Proxy Hosts → Add Proxy Host
  2. Domain Names:填入 n8n.yourdomain.com
  3. Forward Hostname:NAS 的 IP(例如 192.168.1.100
  4. Forward Port5678
  5. SSL 頁籤:選擇 Let's Encrypt 憑證,勾選 Force SSL

設定完成後,透過 https://n8n.yourdomain.com 就能存取 n8n。


初次設定

  1. 開啟 https://n8n.yourdomain.com
  2. 建立管理員帳號(Email + 密碼)
  3. 進入主介面,看到 Workflows 頁面就完成了

建立第一個工作流

範例 1:每天早上發 Telegram 天氣報告

這個工作流每天早上 8 點,呼叫天氣 API,把今日天氣發到你的 Telegram。

節點:

  1. Schedule Trigger:設定 Cron 0 8 * * *(每天 08:00)
  2. HTTP Request:呼叫 Open-Meteo API(免費,不需 API Key) - URL:https://api.open-meteo.com/v1/forecast?latitude=25.04&longitude=121.51&current_weather=true
  3. Telegram:傳送訊息到你的 Telegram Bot

Telegram 節點設定: - 先在 Telegram 找 @BotFather 建立 Bot,拿到 Token - 在 n8n 建立 Telegram Credential(貼上 Token) - Chat ID 可以透過 @userinfobot 取得

範例 2:GitHub 有新 Issue 時通知 Discord

節點:

  1. Webhook:建立一個 Webhook URL
  2. 在 GitHub Repository → Settings → Webhooks,把 URL 貼進去,選 Issues 事件
  3. Discord:傳送格式化訊息到指定頻道

這樣每次有人開新 Issue,Discord 就會即時收到通知。

範例 3:每週自動整理 Gmail 標籤

節點:

  1. Schedule Trigger:每週一 09:00
  2. Gmail:搜尋 7 天前的郵件(older_than:7d label:inbox
  3. Gmail:加上 Archived 標籤並移出收件匣

設定 Gmail OAuth2 Credential 後,n8n 可以完整操作你的 Gmail。


進階設定

外部資料庫(PostgreSQL)

預設 n8n 用 SQLite 儲存工作流和執行記錄。如果工作流很多、執行頻繁,建議改用 PostgreSQL:

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.yourdomain.com/
      - GENERIC_TIMEZONE=Asia/Taipei
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD}
    volumes:
      - /docker/n8n:/home/node/.n8n
    depends_on:
      - postgres

  postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=n8n
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD}
    volumes:
      - /docker/n8n-db:/var/lib/postgresql/data

備份

n8n 的工作流設定都在 /home/node/.n8n(對應 NAS 上的 /docker/n8n)。記得把這個目錄加入 Hyper Backup 的備份範圍。


常見問題

Q:n8n 的 Webhook 在內網能用嗎? 可以,內網服務可以直接呼叫內網 IP + Port(http://192.168.1.100:5678/webhook/xxx)。如果需要外部服務觸發(例如 GitHub),就需要對外的 HTTPS 域名。

Q:n8n 更新怎麼做?

# 先確認升級說明,再拉取已決定要驗證的版本
docker pull n8nio/n8n:latest
docker-compose down && docker-compose up -d

或在 Container Manager 的專案裡「停止 → 拉取最新映像 → 啟動」。

Q:工作流執行紀錄保留多久? 預設保留所有執行記錄(SQLite 可能變很大)。可以在 n8n 設定 → Executions → 設定自動刪除天數(建議 30 天)。

Q:自架版免費嗎? Community Edition 可自架使用,但「免費」不代表沒有基礎設施、維護、備份、網域或第三方 API 成本;功能、授權與企業治理能力也可能和 Cloud/付費方案不同,請以 n8n 官方方案與授權說明為準。


小結

n8n 在 NAS 上跑起來之後,你就有了一個 24 小時在線的自動化引擎,可以替你做各種重複性任務:整理郵件、監控服務、串接 API、發通知、定時備份通知……

和 Zapier/Make 相比,n8n 的上手門檻稍高(需要懂一點 JSON 和 API),但自架能提供較高的部署控制權;實際吞吐量仍受 NAS 資源、工作流設計、外部服務配額與方案限制影響。

如果你的 NAS 上已經在跑其他 Docker 服務,加一個 n8n 把它們串起來,整體能發揮的效益會大很多。


官方文件與限制

正式對外提供 Webhook 前,請先確認反向代理、HTTPS、管理員帳號與 2FA、備份、N8N_ENCRYPTION_KEY、資料庫密碼,以及工作流中第三方憑證的最小權限。


🔗 延伸閱讀

這篇有幫助嗎? 把工作流自架在 NAS:先把安全與維護一起規劃好。