跳至主要內容

文章

免費自架 n8n 教學(Windows):如何用 Docker 在自己的電腦跑 n8n,且具備固定的對外網址?

Jerrie @yonglin522發布於 已編輯

這篇是我做 LINE 英文陪練小精靈 Aibel 時,自架 n8n 的完整紀錄。
照著做完,你會有:

  • 一個跑在自己電腦上的 n8n,可以無限建立 workflow
  • 一個固定不變的對外網址,讓 LINE 這類服務能呼叫你的 n8n
  • 免費!!免費!!!!

為什麼要自架?

自架n8n 雲端版
費用免費試用期過後要付費
資料存在自己的電腦存在 n8n 的伺服器
使用時間電腦要開著才能用隨時都能用
維護自己更新、自己備份官方處理

如果你是想學 n8n、做自己的小工具,自架就很夠用,而且很適合做資料可能不適合提供給雲端的工具。缺點是電腦關機或睡眠時,n8n 也會停止。

(但我這種醒著都在用筆電,電腦24小時插著充電沒在關機的人,就沒有n8n停止的問題XD,偶爾要電腦更新或是當掉的時候再重開就好ㄌ)


一、準備工作

1. 安裝 Docker Desktop

  1. 到 Docker 官網下載 Docker Desktop for Windows(在新分頁開啟)
  2. 安裝時如果詢問要不要使用 WSL 2,選擇使用
  3. 安裝完成後重新開機,打開 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),內容如下:

yaml
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: alwaysDocker 啟動時自動啟動 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

  1. 到 ngrok 官網註冊免費帳號
  2. 下載 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 改成你的網域,最後要有斜線:

yaml
      - 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 allocated5678 已經被別的程式或之前的容器占用執行 docker ps 看是哪個容器,用之前的那個就好,或先把它停掉
Webhook 網址還是 localhostWEBHOOK_URL 沒設好,或改完沒有重建容器確認 yml 的網址,再執行 docker compose up -d --force-recreate
外部服務呼叫 Webhook 得到 404workflow 還沒有發布,或 Webhook 節點被停用了在 n8n 右上角發布 workflow;節點如果是灰色的,選取後按 D 重新啟用
n8n 呼叫外部 API 出現 fetch failedDocker 裡優先走 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 視窗

七、日常使用

每次開機後要做的事:

  1. 打開 Docker Desktop(n8n 設了 restart: always,會自動啟動)
  2. 打開命令提示字元,執行 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 則留言

登入並驗證手機後就能留言。登入

留言

  1. Jerrie @yonglin522

    很高興可以幫到你!!
    如果是自用的話,只要需要使用時確認docker有開、執行 C:\ngrok\ngrok http --url=你的網域 5678就可以ㄌ!得到網域後可以放在隨手可得的地方,之後想用就直接貼><

    如果有想要關機也繼續跑、有可能會有其他人使用但電腦關機的情況,可以參考另一篇Panda大大發ㄉGCP教學~

    剛剛還有找到除了GCP另一個方式是Render + Supabase(我也還不知道那是啥...會來了解看看),看起來比GCP簡單,但記憶體跟每月額度就沒有GCP那麼多,如果有機會測試這個我會再發教學!

  2. 音妹 @mikusis

    超酷! 雖然它要一直開著電腦有點麻煩,但可以趁機了解一些專有名詞(固定網域、地端等等),然後實際去操作它,覺得學到很多

  3. 晉安 @0356

    超詳細的教學!
    先儲存起來,以備之後使用
    順帶一提,第十張圖誇張了這是

  4. 安妮 @annie_.323

    好詳細的教學!剛好任務做完後也在思考,該怎麼讓我的n8n能夠繼續使用,晚上有空也想試試,但唯一缺點是電腦得一直開著😭

  5. Jerrie @yonglin522

    有興趣的話可以試試看,我也是做這個作業才開始摸索自架,你一定也可以ㄉ!!!

  6. 輕舟小菜 @ovo_00000000

    好厲害

  7. Jerrie @yonglin522

    謝謝你ㄉ鼓勵🥹 我以後也想要學看看GCP!是另一種可以關機繼續跑的方式,但會稍微比這個複雜一點(不過有厲害ㄉ大大發了教學

  8. Jerrie @yonglin522

    謝謝!!希望能幫助到你!!有問題也可以私訊我><
    誇張是指節點ㄉ部分嗎XDD 我也覺得壯觀...看著都是新鮮的肝...