{"id":27100618,"url":"https://github.com/twtrubiks/n8n-turorial","last_synced_at":"2025-09-13T21:21:47.064Z","repository":{"id":285913737,"uuid":"959718781","full_name":"twtrubiks/n8n-turorial","owner":"twtrubiks","description":"n8n 自動化工具 docker 安裝以及簡介教學, 以及一些 AI  Agent 的概念","archived":false,"fork":false,"pushed_at":"2025-04-04T01:37:25.000Z","size":6,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-09T20:59:50.022Z","etag":null,"topics":["ai-agent","docker","n8n","tutorial"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twtrubiks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-04-03T08:38:21.000Z","updated_at":"2025-04-05T03:03:35.000Z","dependencies_parsed_at":"2025-04-03T10:43:21.513Z","dependency_job_id":null,"html_url":"https://github.com/twtrubiks/n8n-turorial","commit_stats":null,"previous_names":["twtrubiks/n8n-turorial"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fn8n-turorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fn8n-turorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fn8n-turorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fn8n-turorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twtrubiks","download_url":"https://codeload.github.com/twtrubiks/n8n-turorial/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248111906,"owners_count":21049577,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","docker","n8n","tutorial"],"created_at":"2025-04-06T13:20:08.878Z","updated_at":"2025-09-13T21:21:47.043Z","avatar_url":"https://github.com/twtrubiks.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# n8n 自動化工具 docker 安裝以及簡介教學 🤖\n\n* [Youtube Tutorial - n8n 自動化工具 docker 安裝以及簡介教學](https://youtu.be/uCj14FJu6EI)\n\nn8n 是個開源的視覺化工作流程自動化工具（可以自架設）,\n\n可以像組積木一樣，透過拖拉方式建立自定義的自動化流程，同時也支援透過程式碼撰寫 Python 和 JavaScript 來擴充功能。\n\n## 使用 docker 安裝 n8n\n\n這邊假設使用者已經安裝好 docker,\n\n[n8n - docker-compose](https://docs.n8n.io/hosting/installation/server-setups/docker-compose/)\n\n先建立 `.env` 檔案\n\n```cmd\nmkdir n8n-compose\ncd n8n-compose\n```\n\n```env\nDOMAIN_NAME=example.com\n\n# The subdomain to serve from\nSUBDOMAIN=n8n\n\n# The above example serve n8n at: https://n8n.example.com\n\n# Optional timezone to set which gets used by Cron and other scheduling nodes\n# New York is the default value if not set\nGENERIC_TIMEZONE=Asia/Taipei\n\n# The email address to use for the TLS/SSL certificate creation\nSSL_EMAIL=user@example.com\n```\n\n建立一個資料夾保存 n8n data\n\n```cmd\nmkdir local-files\n```\n\n`docker-compose.yml` 如下\n\n```yml\nservices:\n  traefik:\n    image: \"traefik\"\n    restart: always\n    command:\n      - \"--api=true\"\n      - \"--api.insecure=true\"\n      - \"--providers.docker=true\"\n      - \"--providers.docker.exposedbydefault=false\"\n      - \"--entrypoints.web.address=:80\"\n      - \"--entrypoints.web.http.redirections.entryPoint.to=websecure\"\n      - \"--entrypoints.web.http.redirections.entrypoint.scheme=https\"\n      - \"--entrypoints.websecure.address=:443\"\n      - \"--certificatesresolvers.mytlschallenge.acme.tlschallenge=true\"\n      - \"--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}\"\n      - \"--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json\"\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - traefik_data:/letsencrypt\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n\n  n8n:\n    image: n8nio/n8n:stable\n    restart: always\n    ports:\n      - \"127.0.0.1:5678:5678\"\n    labels:\n      - traefik.enable=true\n      - traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)\n      - traefik.http.routers.n8n.tls=true\n      - traefik.http.routers.n8n.entrypoints=web,websecure\n      - traefik.http.routers.n8n.tls.certresolver=mytlschallenge\n      - traefik.http.middlewares.n8n.headers.SSLRedirect=true\n      - traefik.http.middlewares.n8n.headers.STSSeconds=315360000\n      - traefik.http.middlewares.n8n.headers.browserXSSFilter=true\n      - traefik.http.middlewares.n8n.headers.contentTypeNosniff=true\n      - traefik.http.middlewares.n8n.headers.forceSTSHeader=true\n      - traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}\n      - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true\n      - traefik.http.middlewares.n8n.headers.STSPreload=true\n      - traefik.http.routers.n8n.middlewares=n8n@docker\n    environment:\n      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}\n      - N8N_PORT=5678\n      - N8N_PROTOCOL=https\n      - NODE_ENV=production\n      - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/\n      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}\n    volumes:\n      - n8n_data:/home/node/.n8n\n      - ./local-files:/files\n\nvolumes:\n  n8n_data:\n  traefik_data:\n```\n\n如果你在你的雲空間, 直接設定好你的 DNS, 就可以一次完成了.\n\n### 資料庫\n\n這邊補充一下, N8N 預設是使用 SQLite,\n\n也就是 `n8nio/n8n:stable` Image 裡面包含了 SQLite,\n\n用來存儲 credentials, past executions, and workflows 這類的資料.\n\n但是, 也可以使用 [Using with PostgreSQL](https://docs.n8n.io/hosting/installation/docker/#using-with-postgresql), 會有更好的效能(假如你有更大的需求量).\n\n範例可以參考 [n8n-hosting/docker-compose - Postgres](https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgres/docker-compose.yml)\n\n### 關於 Traefik 🚦\n\ntraefik 服務是一個現代化的反向代理和負載平衡器，類似於 Nginx。\n\n它特別擅長與 Docker 整合，可以自動偵測新的容器服務並為其設定路由和 SSL 憑證。\n\n如果你已經在主機上使用了 Nginx 或其他反向代理，可以考慮調整設定，移除 traefik 服務，\n\n並手動設定你的反向代理將流量轉發到 n8n 容器的 5678 埠。\n\n最後執行 `docker compose up -d` 就完成了.\n\n瀏覽你的 [http://127.0.0.1:5678](http://127.0.0.1:5678) 可以開始把玩 n8n.\n\n但要注意 🔒\n\n`n8n is only accessible using secure HTTPS, not over plain HTTP.`\n\nn8n 官方建議且許多功能（特別是 Webhook）需要在安全的 HTTPS 環境下運作。\n\n如果你在本機使用 HTTP 訪問(本機)，可能會在測試某些節點或功能時遇到問題。\n\n因此，建議最終將 n8n 部署到具有有效 HTTPS 憑證的環境中。\n\n也就是如果你不是 HTTPS, 測試起來可能會遇到一些問題, 所以我會建議直接佈署到雲空間並且處理好 HTTPS.\n\n前面說到 traefik, 我自己的雲端主機是使用 nginx 了, 所以我有再調整移除 traefik, 改用 Nginx 也是沒問題的.\n\n## 範例介紹\n\n一般來說，大型語言模型本身不具備即時上網搜尋或執行外部動作的能力。\n\n透過 n8n 中的 AI Agent 功能, 可以賦予 AI 模型額外能力,\n\n使用工具 (Tools): 例如讓 AI 能夠執行網路搜尋、讀取檔案、呼叫 API 等。\n\n規劃與執行: AI 可以根據目標，自行規劃需要使用哪些工具、按什麼順序執行，來完成更複雜的任務。\n\n![alt tag](https://i.imgur.com/Js6MeDx.png)\n\n本身 AI 不具有上網的能力, 但是當透過 AI Agent 之後, 整個功能就會變得很強大\n\n![alt tag](https://i.imgur.com/vogYlTG.png)\n\n範例 [AI_Agent_in_n8n.json](AI_Agent_in_n8n.json) 直接複製貼上即可.\n\n### 測試建議\n\n在測試 AI Agent 功能時，建議優先使用 OpenAI 的模型，因為其對於 Function Calling / Tool Using 的支援通常較為成熟，\n\n使用其他模型可能會遇到預期外的錯誤或限制, 因為我發現使用其他的 AI 會有其他的錯誤.\n\n也就是說, AI Agent 比較像 Function Calling, 和之後要介紹的 MCP 又不太一樣.\n\n## MCP Server\n\n如果要使用 MCP 中的 MCP Server Trigger (n8n Version `1.88.0` 才有).\n\n通常會使用反向代理( 我使用 Nginx ),\n\nNginx 記得一定要設定 `proxy_buffering off;` :exclamation: :exclamation: (範例如下)\n\n不然你會發現你的 MCP 一直連不上.\n\n```conf\n location / {\n    proxy_pass http://n8n:5678;\n    proxy_http_version 1.1;\n    proxy_buffering off;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"Upgrade\";\n    proxy_set_header Host $host;\n  }\n```\n\n這邊說明一下什麼是 `proxy_buffering` 的作用 🤔 這個指令控制 Nginx 是否要緩衝 (buffer) 從後端伺服器.\n\n`on` (預設值): 當 `proxy_buffering` 是 `on` 時，Nginx 會先嘗試從後端讀取 完整 的回應，\n\n將其存儲在記憶體或暫存檔中，然後再 一次性 地將這個完整的回應發送給客戶端。\n\n這樣做的好處是，如果客戶端網路慢，不會長時間佔用後端 n8n 的連線；\n\n壞處是客戶端需要等待 Nginx 接收完所有數據才能開始收到內容，且會消耗 Nginx 伺服器的記憶體/磁碟空間.\n\n`off` 當 `proxy_buffering` 是 `off` 時，\n\nNginx 會 即時地 將從後端（n8n）收到的數據塊 (chunk) 直接轉發給客戶端，\n\n不做完整的緩衝。收到多少，就轉發多少。\n\n接著說明 n8n 的 MCP Server(與 `proxy_buffering off;` 的關聯)\n\nn8n 有一些功能需要 長時間連接 並且 即時地 將數據從後端推送到前端（瀏覽器）。\n\nSSE Trigger 節點： 如果你的工作流程使用 SSE Trigger (**SSE - Server-Sent Events**) 來接收事件。\n\n為什麼需要 `proxy_buffering off;`\n\n對於像 SSE 這樣的技術，數據是 持續不斷地、一小塊一小塊地 從伺服器發送到客戶端的。\n\n如果 Nginx 使用預設的 `proxy_buffering on;`\n\n它會一直等待 n8n 發送完 所有 的 SSE 數據（對於一個持續的事件流來說，可能永遠不會結束），\n\n然後才轉發給瀏覽器。這就導致瀏覽器完全收不到即時的更新，違背了 SSE 的目的。\n\n只有設置為 `proxy_buffering off;`\n\nNginx 才能在收到 n8n 發來的一小塊 SSE 數據時，立刻轉發給瀏覽器，從而實現了 n8n 編輯器中的即時反饋效果。\n\n其他注意事項可參考 [Limitations](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.mcptrigger/#limitations)\n\n## 社群節點 🧩\n\n除了官方提供的節點之外, 社群有提供了非常多的第三方節點可以使用\n\n[community-node-package](https://www.npmjs.com/search?q=keywords%3An8n-community-node-package)\n\n可以自行選擇需要的安裝.\n\n![alt tag](https://i.imgur.com/L4hZgFT.png)\n\n之後如果我有使用我再和大家分享.\n\n## Donation\n\n文章都是我自己研究內化後原創，如果有幫助到您，也想鼓勵我的話，歡迎請我喝一杯咖啡  :laughing:\n\n綠界科技ECPAY ( 不需註冊會員 )\n\n![alt tag](https://payment.ecpay.com.tw/Upload/QRCode/201906/QRCode_672351b8-5ab3-42dd-9c7c-c24c3e6a10a0.png)\n\n[贊助者付款](http://bit.ly/2F7Jrha)\n\n歐付寶 ( 需註冊會員 )\n\n![alt tag](https://i.imgur.com/LRct9xa.png)\n\n[贊助者付款](https://payment.opay.tw/Broadcaster/Donate/9E47FDEF85ABE383A0F5FC6A218606F8)\n\n## 贊助名單\n\n[贊助名單](https://github.com/twtrubiks/Thank-you-for-donate)\n\n## License\n\nMIT license\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fn8n-turorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwtrubiks%2Fn8n-turorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fn8n-turorial/lists"}