文章
免費自架 n8n 教學(Windows):如何用 Docker 在自己的電腦跑 n8n,且具備固定的對外網址?
Jerrie @yonglin522發布於 已編輯
這篇是我做 LINE 英文陪練小精靈 Aibel 時,自架 n8n 的完整紀錄。
照著做完,你會有:
- 一個跑在自己電腦上的 n8n,可以無限建立 workflow
- 一個固定不變的對外網址,讓 LINE 這類服務能呼叫你的 n8n
- 免費!!免費!!!!
為什麼要自架?
| 自架 | n8n 雲端版 | |
|---|---|---|
| 費用 | 免費 | 試用期過後要付費 |
| 資料 | 存在自己的電腦 | 存在 n8n 的伺服器 |
| 使用時間 | 電腦要開著才能用 | 隨時都能用 |
| 維護 | 自己更新、自己備份 | 官方處理 |
如果你是想學 n8n、做自己的小工具,自架就很夠用,而且很適合做資料可能不適合提供給雲端的工具。缺點是電腦關機或睡眠時,n8n 也會停止。
(但我這種醒著都在用筆電,電腦24小時插著充電沒在關機的人,就沒有n8n停止的問題XD,偶爾要電腦更新或是當掉的時候再重開就好ㄌ)
一、準備工作
1. 安裝 Docker Desktop
- 到 Docker 官網下載 Docker Desktop for Windows(在新分頁開啟)
- 安裝時如果詢問要不要使用 WSL 2,選擇使用
- 安裝完成後重新開機,打開 Docker Desktop,等左下角顯示 Engine running
【截圖 1:Docker Desktop 主畫面,左下角顯示 Engine running】
確認安裝成功:打開「命令提示字元」(在開始選單搜尋 cmd),輸入:
docker --version有顯示版本號就代表成功。
2. 建立 n8n 的資料夾
在 C 槽建一個資料夾 C:\n8n,之後的設定檔都放在這裡。
二、寫 docker-compose.yml
💡小提示:你可以先打在windows 記事本裡面,再另存新檔成.yml,記得選「*所有檔案」才不會存成.txt文字檔
在 C:\n8n 裡新增一個檔案,檔名是 docker-compose.yml(注意副檔名是 .yml,不是 .txt),內容如下:
services:
n8n:
image: n8nio/n8n
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
- WEBHOOK_URL=https://你的網域/
- GENERIC_TIMEZONE=Asia/Taipei
- TZ=Asia/Taipei
- NODE_OPTIONS=--dns-result-order=ipv4first
volumes:
- n8n_storage:/home/node/.n8n
volumes:
n8n_storage:WEBHOOK_URL 先不用管,第四步拿到 ngrok 網域後再回來填。
每一行的用途:
| 設定 | 用途 |
|---|---|
image: n8nio/n8n | 使用 n8n 官方的映像檔 |
restart: always | Docker 啟動時自動啟動 n8n,當機時也會自動重開 |
ports: 127.0.0.1:5678:5678 | 只讓自己的電腦連得到 5678 這個 port;對外連線一律交給 ngrok |
WEBHOOK_URL | 告訴 n8n 它的對外網址,Webhook 節點才會顯示正確的網址 |
GENERIC_TIMEZONE、TZ | 設定成台灣時間,排程和 Wait 節點的時間才會對 |
NODE_OPTIONS=--dns-result-order=ipv4first | 讓 n8n 優先用 IPv4 連線。不加的話,呼叫外部 API 時可能偶爾出現 fetch failed 或 connection refused |
volumes: n8n_storage | 把 workflow、帳號、資料表存在 Docker 的資料區,重建容器也不會不見 |
⚠️注意!
.yml檔對縮排很嚴格,只能用空白,不能用 Tab。複製後如果啟動失敗,先檢查縮排。
【截圖 2:C:\n8n 資料夾裡的 docker-compose.yml】
三、啟動 n8n
在命令提示字元輸入:
cd C:\n8n
docker compose up -d第一次會下載映像檔,需要等一下。完成後打開瀏覽器,進入:
http://localhost:5678第一次進去會請你建立擁有者帳號,填好 Email 和密碼就完成了。
【截圖 3:n8n 建立帳號畫面】
登入後點一下左邊欄的房子就會進到主頁囉
【截圖 4:n8n 登入後的主畫面】
四、讓外面連得到:ngrok 固定網域
現在 n8n 只有你自己的電腦連得到。LINE 這類服務要呼叫你的 n8n,就需要一個對外的網址,ngrok 就是負責這件事:它會給你一個網址,把連到這個網址的請求轉到你電腦的 5678 port。
1. 註冊並下載 ngrok
- 到 ngrok 官網註冊免費帳號
- 下載 Windows 版,解壓縮後把
ngrok.exe放到C:\ngrok
(自己建一個ngrok資料夾放在C槽)
2. 設定 authtoken
在 ngrok 後台找到 Your Authtoken,複製後在命令提示字元輸入:
C:\ngrok\ngrok config add-authtoken 你的authtoken【截圖 5:ngrok 後台的 Your Authtoken 頁面】
⚠️ 我自己踩過的坑:註冊時如果有設定兩步驟驗證(MFA),畫面上也會出現一串金鑰,那不是 authtoken。貼錯會連不上。另外,authtoken 和 MFA 金鑰都不要截圖外流!!!萬一外流了,記得到後台重新產生。
3. 找到你的免費固定網域
在 ngrok 後台的 Domains 頁面,可以看到一個免費的固定網域,長得像 xxxx-xxxx-xxxx.ngrok-free.dev。
【截圖 6:ngrok 後台 Domains 頁面】
💡 網路上很多文章說「免費版 ngrok 每次重開網址都會變,要一直更新」,那是舊的情況。現在免費帳號就有一個固定網域,重開也不會變,設定一次就好。
參考資料:點我(在新分頁開啟)
4. 啟動 ngrok
C:\ngrok\ngrok http --url=你的網域 5678看到 Forwarding 那一行顯示 https://你的網域 -> http://localhost:5678,就代表成功了。
【截圖 7:ngrok 啟動後的畫面,Forwarding 那一行】
⚠️ 這個命令提示字元視窗不能關,關掉 ngrok 就停了。
五、把網域告訴 n8n
回到 docker-compose.yml,把 WEBHOOK_URL 改成你的網域,最後要有斜線:
- WEBHOOK_URL=https://你的網域/存檔後,在 C:\n8n 執行:
docker compose up -d --force-recreate--force-recreate 會用新的設定重建容器。因為資料存在 volume 裡,workflow 和帳號都不會不見。
確認設定成功
在 n8n 新增一個 workflow,加一個 Webhook 節點,看 Production URL 是不是以你的 ngrok 網域開頭。
【截圖 8:Webhook 節點的 Production URL 顯示 ngrok 網域】
是的話,自架就完成了!!:D
阿對,補充一下,網址最後的路徑可以在 Path 欄位自己改(原本會是一串亂碼),例如我改成 line,方便辨認是給 LINE 用的。
六、常見問題
| 狀況 | 原因 | 解法 |
|---|---|---|
啟動時出現 port is already allocated | 5678 已經被別的程式或之前的容器占用 | 執行 docker ps 看是哪個容器,用之前的那個就好,或先把它停掉 |
Webhook 網址還是 localhost | WEBHOOK_URL 沒設好,或改完沒有重建容器 | 確認 yml 的網址,再執行 docker compose up -d --force-recreate |
| 外部服務呼叫 Webhook 得到 404 | workflow 還沒有發布,或 Webhook 節點被停用了 | 在 n8n 右上角發布 workflow;節點如果是灰色的,選取後按 D 重新啟用 |
n8n 呼叫外部 API 出現 fetch failed | Docker 裡優先走 IPv6 連線 | 確認 yml 有 NODE_OPTIONS=--dns-result-order=ipv4first |
| 偶爾出現 connection refused | 網路短暫不穩 | 在節點的 Settings 打開 Retry On Fail;很頻繁的話,執行 docker compose restart |
| ngrok 顯示 ERRNGROK… 或連不上 | authtoken 貼錯,或已經有另一個 ngrok 在跑 | 重新執行 config add-authtoken;關掉其他 ngrok 視窗 |
七、日常使用
每次開機後要做的事:
- 打開 Docker Desktop(n8n 設了
restart: always,會自動啟動) - 打開命令提示字元,執行
C:\ngrok\ngrok http --url=你的網域 5678
養成備份或是版控的習慣:
- 備份:在 n8n 的 workflow 右上角 ⋯ → Export JSON,就能匯出 workflow 的 JSON,匯入則是用Import JSON。大改之前先匯出一份,改壞了可以匯入還原~
如果有真的找不到的問題,把JSON直接丟給AI看也是個不錯ㄉ選擇,這樣就可以讓他知道你整個workflow在幹嘛、怎麼設定、哪裡可能有問題。匯出的 JSON 是不包含帳號密碼和 API 金鑰的,可以放心存!但如果是用截圖問AI,記得碼掉 token、網域、金鑰、個資
【截圖 9:Webhook 節點的 Production URL 顯示 ngrok 網域】
- 版控:版本控制的意思,每一次按Publish其實都是一個版本,你可以針對每一次重要更新都Publish一次並且取個名辨識該次的更新內容,如果想要還原就可以到上方三個點 -> Version History - >Publish Timeline -> 點你想回復的版本 -> 點旁邊的Action -> Restore version
【截圖 10:版控示意圖】
15 個愛心8 則留言
登入並驗證手機後就能留言。登入