Introduction

n8n 是一個開源的工作流自動化平台,基於 Sustainable Use License 和 n8n Enterprise License 許可證。幫助使用者透過視覺化的方式設計與執行各種自動化工作流,實現無代碼或低代碼的自動化解決方案。特別在當下,隨著人工智慧技術與生成式人工智慧的快速發展,透過工作流將人工智慧應用於各種場景中,不論是單純的文字處理如筆記、摘要、翻譯,或是更複雜的 AI Agent 應用、RAG(Retrieval-Augmented Generation)等,n8n 都能提供相當靈活的解決方案。
而工作流自動化已有非常多競爭者,像是 Zapier、Make、Nango、Merge、Celigo 甚至是企業較常用的 Microsoft Power Automate 等等,這些平台也都提供相當廣泛、全面且強大的功能,能夠幫助使用者輕鬆地串接各種應用程式與服務以及各有其特色。
如 Microsoft Power Automate 主要可與 Microsoft Power Platform 進行整合,且可以更容易的實現桌面應用程式的自動化。但是其 HTTP request 的功能限制需要高級許可證才能使用,這一限制對於許多資源受限的個人開發者來說,可能會造成不便。因此儘管個人擁有此權限但考量未來個人使用平台轉換的可能性,暫不考慮使用。
而與常見的 Zapier、Make 等平台相比,n8n 的優勢在於其開源的特性以及其成本效益。儘管學期曲線(通常)較高,特別在於如 Google 帳戶、社群媒體等服務的授權與串接過程。但其提供自架設的社群版本選項,以及豐富的社群支援,讓使用者能夠更靈活的掌握、設計與管理自己的工作流。因此,對於個人、小型團隊與小型企業來說,n8n 是一個相當不錯的選擇。

相關資源

而在實際使用之前,或是還不清楚工作流自動化的使用情境與應用的朋友們,可以先參考以下資源:

  • n8n 官方網站:提供 n8n 的詳細資訊、價格、功能與企業使用案例。
  • n8n 官方工作流分享平台:提供 n8n 使用者分享的工作流範例,讓使用者可以快速找到適合自己的工作流。
  • r/n8n Reddit:n8n 的 Reddit 社群,提供使用者交流與討論的空間。

安裝

此章節將介紹如何使用 Docker 在本地端安裝社群版本的 n8n,參考 n8n 官方說明
使用 Docker 安裝 n8n 優勢在於可將 n8n 獨立於其他應用程式運行,確保 n8n 的運行環境與依賴項目不會受到其他應用程式或作業系統的相容性影響,並且在升級、轉移與備份時更為方便。未來會再對於 Docker 的使用進行更詳細的說明。於此先假設環境中已經安裝好 Docker。
安裝方式有二種,分別為使用 Docker 與 Docker Compose。對於嘗試使用者,建議可先使用 Docker 進行安裝與試驗,而 Docker Compose 則更適合用於生產環境、伺服器或是需要多個容器協同工作的情況。個人使用一台舊電腦作為 HomeLab,並且使用 Docker Compose 進行安裝與管理。

使用 Docker 安裝 n8n

  1. 於終端機中執行以下指令:
    docker volume create n8n_data
     
    docker run -it --rm \
    	--name n8n \
    	-p 5678:5678 \
    	-e GENERIC_TIMEZONE="Asia/Taipei" \
    	-e TZ="Asia/Taipei" \
    	-v n8n_data:/home/node/.n8n \
    	docker.n8n.io/n8nio/n8n
  2. 開啟瀏覽器,輸入 http://localhost:5678,即可進入 n8n 的使用介面。
  3. 進入使用介面後,會要求使用者設定 n8n 的使用者名稱、信箱與密碼。
  4. 設定完成後,社群版目前免費提供許可證可終身解鎖部分付費功能,包含工作流歷史紀錄、工作流編輯器偵錯與自訂節點功能。

使用 Docker Compose 安裝 n8n

可參考 n8n GitHub 官方說明,其中包含整合 Caddy、PostgreSQL、kubernetes 等的範例。

而個人由於其他應用程式亦使用 Docker Compose 進行管理,因此也將 n8n 整合至 Docker Compose 中。目前亦使用 Cloudflare Tunnel 服務,轉發至 n8n 的 Webhook URL。以下為個人應用範例僅供參考:

name: n8n
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --protocol auto run
    environment:
      - TUNNEL_TOKEN=${CLOUDFLARED_TUNNEL_TOKEN}
    networks:
      - n8n-network
 
  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    environment:
      - WEBHOOK_URL=${CLOUDFLARED_N8N_URL}
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=n8n-db
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
      - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
      - GENERIC_TIMEZONE=Asia/Taipei
      - TZ=Asia/Taipei
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_RUNNERS_ENABLED=true
      - N8N_RUNNERS_MODE=external
      - N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
      - N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_TOKEN}
      - N8N_NATIVE_PYTHON_RUNNER=true
    ports:
      - 5678:5678
    links:
      - n8n-db
    volumes:
      - n8n_storage:/home/node/.n8n
      - ./local-files:/files
    depends_on:
      n8n-db:
        condition: service_healthy
    networks:
      - n8n-network
 
  n8n-db:
    image: postgres:16
    restart: unless-stopped
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
      - POSTGRES_NON_ROOT_USER
      - POSTGRES_NON_ROOT_PASSWORD
    volumes:
      - db_storage:/var/lib/postgresql/data
      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - n8n-network
 
  task-runners:
    image: n8nio/runners
    container_name: n8n-runners
    environment:
      - N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
      - N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_TOKEN}
    depends_on:
      - n8n
    networks:
      - n8n-network
 
volumes:
  db_storage:
 
networks:
  n8n-network:
    driver: bridge
圖 1. n8n 安裝完成初次啟動。

更新 n8n

而在 docker compose 中,更新 n8n 版本相當簡單(n8n 版本更新頻率滿高的,有持續穩定更新也是個人青睞的原因之一)。只需執行以下指令即可:

docker compose pull # 拉取最新的 n8n 映像檔
docker compose down # 停止並移除現有的 n8n 容器
docker compose up -d # 重新啟動 n8n,這時會使用最新的映像檔
docker image prune # 刪除未使用的舊映像檔,釋放磁碟空間

使用 n8n

個人用途: 使用 n8n 建立 Line 助理

緣起

雖然 ChatGPT、Gemini 等常用的生成式人工智慧模型都已經提供了應用程式供用戶使用,近期也有 OpenClaw 提供 Agent 的功能。
但是像是我這種行動數據沒有吃到飽的使用者來說,安裝這些應用程式時都會做一些對話同步、歷史紀錄等功能,導致流量的增加。
而一般情況下又不需要 OpenClaw 這麼複雜的功能,單純想要有人幫我查詢一些資訊、幫我做一些簡單的任務,或是幫我整理一些資料等等。
因此我想說不如自己來做一個簡單的 Line 助理。

實作

  1. 事前準備:
    • 先準備 Line 官方帳號,並且申請 Messaging API 的權限,取得 Channel Access Token 與 Channel Secret。相關方法可參考 Line Developers 網頁
    • 由於 n8n 的官方 Line 節點目前僅剩下發送通知功能,本人使用 n8n-nodes-linewebhook 這個第三方套件來實現 Line Webhook 的功能。
      • 於 Settings Community Nodes 中搜尋 n8n-nodes-linewebhook,並且安裝。
  2. n8n 工作流-觸發器
    1. 使用 Line Webhook 節點,設定為 POST 方法,並且複製 Webhook URL。
    2. 將剛剛複製的 Webhook URL 貼到 Line Developers 的 Messaging API 設定中。
  3. n8n 工作流-動作
    1. Line Webhook 節點有許多種類的輸出,因為是自己使用,我只有使用 text 的輸出,其他的像是圖片、影片、音訊等等都沒有使用(畢竟流量有限)。
    2. Line Webhook 節點的 text 輸出後面,接上 AI Agent 節點,並連結要使用的模型、設定好相關的參數。
    3. AI Agent 節點內的 Prompt (User Message) 使用 text 的輸出({{ $json.event.message.text }}),並且在 Prompt 中加入一些系統訊息來告訴模型這是一個 Line 助理,並且要幫我做什麼樣的任務。
    4. MCP Client 配置:
      1. 因為我的目的是要讓模型幫我查詢一些資訊,因此在 AI Agent 節點內的工具(Tools)中,我使用了 MCP Client Tool 節點。
      2. 加上 MCP Client Tool 節點後,也要在其他地方建立一個 MCP Server 節點,並且設定好相關的參數,讓 MCP Client Tool 節點可以連接到 MCP Server 節點。
      3. MCP Server 節點內,可以設定一些工具(Tools),像是 SerpAPIDate & TimeCalculator 等等,讓模型可以使用這些工具來幫我查詢資訊、計算。
      • 有些工具沒有內建的節點可以使用,這時就可以使用 HTTP RequestCode 節點來實現工具的功能,並且在 MCP Server 節點內設定好相關的參數,讓模型可以使用這些工具。像是我自己使用 Code 節點來實現股票資訊的查詢工具,讓模型可以幫我查詢股票的相關資訊。
  4. n8n 工作流-回覆
    1. AI Agent 節點的輸出接上 Line Message 節點的 Create Text Message 功能,這樣模型的回覆就會變成 Line 的回覆格式了。
    2. 最後,Create Text Message 節點的輸出再接一個 Line Message 節點,功能設定為 send message(發送通知),這樣就可以將模型的回覆發送到 Line 上了。
      • send message 的設定中,記得要將 To 的參數設定為從一開始的 Line Webhook 節點的 replyToken 輸出。或是 userId 輸出,這樣就可以確保模型的回覆會發送到正確的 Line 使用者了。如果是使用 replyToken 的話,則回覆會以回覆的方式發送(有時效性);如果是使用 userId 的話,則回覆會以推播的方式發送。