在之前的文章裡,曾介紹過如何用ngrok申請免費網域來當作n8n的webhook。最近測試一個具備圖片OCR和描述功能的 n8n 工作流,ngrok免費額度的流量就明顯受限制了,到ngrok官網查詢,原來是超過HTTP requests per month = 2萬的限制。很幸運的,找到了另一款開源免費替代工具 zrok,除了每月5GB且無限制request之外,還提供免費的自訂子網域名的URL。(OS: 解決主要痛點的同時還送你一個便於管理的小禮物,讚~)
zrok 是什麼?
zrok 是基於
OpenZiti(一套開源零信任網路框架)所發展出來的安全共享和穿透的工具,其功能與 ngrok 類似,能把內網的服務(例如跑在
localhost:5678 的 n8n)暴露到外網上,讓外部系統(LINE、Telegram、各種
SaaS webhook)的訊息能夠打進來。另外,相對於ngrok, zrok 底層是零信任架構(Zero Trust),傳輸層預設加密、不依賴裸露的外網 IP,相對安全。
如何取得 zrok credential key 和自訂子網域 URL
在配置n8n和zork的docker架構之前,需先取得下列兩個資訊:
1. zrok credential key: 帳號憑證
2. 自訂子網域
URL: 自定義的unique-name
取得步驟如下:
a. 到zrok官網註冊並登入。
b. 登入後在
Dashboard 複製你的 zrok_credentials_key,如同下圖馬賽克處,待會要配置在n8n和zrok的容器架構中。
c. 另外,在 Dashboard 自行定義一個子網域名稱 (unique-name),前提是不得與其它既有的網域重複
,例如 your_sub_domainname。這個名稱即是網址(URL)的前綴,所以未來完整的webhook URL為https://your_sub_domainname.share.zrok.io。
如何透過
Docker 讓 zrok 的 URL 作為 n8n 的 webhook
有別於之前ngrok和n8n的配置,這一段是此次學習到核心內容,重點和架構如下:
- 利用docker network create 建置一個專用docker網段,讓 n8n 與 zrok 兩個容器互相以容器名稱來傳遞資料,同時也避免與其他容器的干擾。
- 利用容器指令將
zrok_credentials_key 憑證一次性導入本機映射的資料夾。
- 利用容器指令預約(reserve)一個公開服務並綁定自訂子網域
docker
network create 是什麼?
Docker 預設所有容器都擠在bridge這個大雜燴網段裡,容器之間雖能互通,但靠的是 IP,而且容易跟其他容器干擾。docker network create n8n-zrok-net的意思是建置一個只屬於 n8n + zrok 的專用網段,形同讓 n8n 與 zrok 都掛載到n8n-zrok-net網段,並直接用容器名稱(例如 n8n-zrok和 zrok)互相存取,不必管 IP,簡言之,就像幫兩個容器單n8n-zrok和 zrok單獨拉一條專線。
配置步驟
a. 建立 n8n 和 zrok 專用網段
sudo docker
network create n8n-zrok-net
b. 建置 .zrok 資料夾來存放憑證
zrok 的憑證與設定會存放在本機的 `.zrok` 目錄,先建好它:
mkdir -p /home/user/.zrok
c. 定義 .zrok 資料夾的 owner 權限
zrok 官方映像裡的執行身分是使用者 ziggy,其 UID/GID 為 2171,須將本機 .zrok資料夾的擁有者改成 ziggy : ziggy 或 2171:2171,才能存取資料。
sudo chown -R 2171:2171
/home/user/.zrok
d. 將 zrok_credentials_key憑證一次性導入容器
運行下列的一次性容器指令,用以將 credential key啟用(enable)指令送進本機映射的
.zrok 資料夾,同時 --rm 指令即是當該容器運行結束,即自動移除。完成後,憑證即留在本機。
sudo docker run --rm -it \
-v /home/user/.zrok:/home/ziggy/.zrok \
openziti/zrok enable your_zrok_credentials_key
e. 預約(reserve)一個公開服務,並綁定上述自訂子網域和指向 n8n
同樣運行下列的一次性容器指令,利用reserve public指令將上述自訂的子網域名
your_sub_domainname預約下來,並對應到 n8n 在網段內的網址(http://n8n-zrok:5678)。請注意,n8n-zrok即是下個步驟運行n8n主容器的名稱。簡言之,該步驟利用預約指令綁定子網域網址和內網網址的對應關係
sudo docker run --rm -it \
-v /home/user/.zrok:/home/ziggy/.zrok \
openziti/zrok reserve public \
--unique-name your_sub_domainname \
http://n8n-zrok:5678
f. 運行 n8n 主容器
經過上述配置,終於來到正式運行 n8n 主容器的步驟了,特別注意該容器名稱為n8n-zrok,與上述內網網址(http://n8n-zrok:5678)需對應。
sudo docker run -d --name n8n-zrok \
--network n8n-zrok-net \
-p 0.0.0.0:5678:5678 \
-e GENERIC_TIMEZONE=Asia/Taipei \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_SECURE_COOKIE=false \
-e WEBHOOK_URL=$WEBHOOK_URL_ZROK \
-v /home/user/docker-service/n8n_zrok/data:/home/node/.n8n \
--restart unless-stopped \
n8nio/n8n:latest
g. 運行 zrok 容器
最後運行 zrok 容器,讓連接上述預約的子網域,開始對外穿透。
sudo docker run -dt --name zrok \
--network n8n-zrok-net \
-v /home/user/.zrok:/home/ziggy/.zrok \
--restart unless-stopped \
openziti/zrok share reserved your_sub_domainname
完成上述所有步驟後,即可參考之前的文章[如何整合ngrok免費靜態網域和n8n工作流來建置AI LINE Bot?],用LINE Bot來做收發測試。另外,在zrok登入網頁中,也可以清楚看到登入帳號、ziggy分配編號、內網網址和上述自訂子網域網址的連動性,如下圖。
沒有留言:
張貼留言