1. 背景說明
本文的目標是透過 n8n 自動化工作流,將 NocoDB 中的工作記錄定期匯入至 Joplin 筆記。
然而,Joplin 的 Web Clipper API 預設僅監聽本機(127.0.0.1),並未對外開放任何公開端點。若直接將 API 暴露至外部網路,將帶來資安風險。因此,採用 socat 作為本機端口轉發橋樑——讓跑在 Docker 容器內的 n8n 能夠安全地存取宿主機上的 Joplin API,同時不必對外開放任何防火牆規則。

2. 使用 socat 建立連線橋樑(推薦,維持 Bridge 模式)
這是在不犧牲安全性的前提下最標準的做法。在 Ubuntu 宿主機上建立一個轉發器,將來自 Docker 網路的連線請求橋接至 Joplin 本機監聽的端口。
2.1. 安裝並測試
在 Ubuntu 宿主機上執行以下指令,安裝 socat 並進行初步測試:
sudo apt update && sudo apt install socat -y
# 臨時啟動轉發:將宿主機的 41185 端口轉發至 Joplin 監聽的 41184
socat TCP-LISTEN:41185,reuseaddr,fork TCP:127.0.0.1:41184 &
此時可在 n8n 中試打 API,確認轉發是否正常運作。
2.2. 修改 n8n 工作流程
在 n8n 的 HTTP Request 節點中,將目標 URL 改為透過轉發端口存取:
http://host.docker.internal:41185/notes/186b21936e6a4ba29e700c5ad9865ac8
host.docker.internal是 Docker 容器存取宿主機的特殊域名;端口改為 41185(socat 監聽的轉發端口)。

2.3. 設定為系統服務(永久生效)
上述臨時指令在重開機後會失效。為確保服務持續運行,將其設定為 Systemd 系統服務:
sudo nano /etc/systemd/system/joplin-proxy.service
貼入以下內容:
[Unit]
Description=Joplin API Proxy for Docker
After=network.target
[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:41185,reuseaddr,fork TCP:127.0.0.1:41184
Restart=always
User=root
[Install]
WantedBy=multi-user.target
儲存後,啟用並啟動服務:
sudo systemctl enable --now joplin-proxy.service
2.4. 配置防火牆安全策略
2.4.1. 查詢 Docker 內部網路網段
在宿主機執行以下指令,確認 Docker 預設網橋(docker0)的 IP 位址:
ip addr show docker0 | grep "inet "
通常輸出的結果會類似
inet 172.17.0.1/16 ...,這代表 Docker 容器的內部網段是172.17.0.0/16。
2.4.2. 設定 UFW 規則
不建議直接使用 sudo ufw allow 41185,因為這會對全世界開放該埠口。請依照以下步驟精確授權:
# 變數設定:請根據上方查詢結果修改 DOCKER_NET 變數
DOCKER_NET="172.17.0.0/16"
# 僅允許來自 Docker 內部網段的流量存取 41185 埠口
sudo ufw allow from $DOCKER_NET to any port 41185 comment 'Allow n8n Docker to Joplin Proxy'
# 重新載入防火牆設定
sudo ufw reload
2.4.3. 驗證防火牆狀態
執行以下指令確認規則是否生效:
sudo ufw status numbered
你應該會看到類似下方的輸出,確保 41185 埠口的來源(From)被限制在 Docker 的私有網段:
| 埠口 | 動作 | 來源 |
|---|---|---|
| 41185 | ALLOW IN | 172.17.0.0/16 |
