Docker 中的 N8N - 無法寫入 Windows Server 上的 SMB 共享

大家好!

我是論壇的新手,我在基於 Ubuntu 的 Docker 上進行了首次安裝。現在的任務是建立一個工作流程來取得資料並將其放在 Windows Share(Windows Server 2019)上。路徑已包含在 FSTAB 中,操作系統可以進行寫入存取。但遺憾的是,我無法從 N8N 獲得存取權限。

我收到的錯誤訊息是:
The file “/data/windows/Transfer/Bestell-Lagerdaten/orders.csv” is not writable.

我的 docker-compose.yml 如下所示:

n8n-2:
image: ‘docker.n8n.io/n8nio/n8n:latest’
container_name: n8n-server-n8n-2
restart: unless-stopped
user: “1000:1000” # <— 強制 n8n 使用您 CIFS 選項的確切 UID
volumes:

  • /home/n8n-2:/home/node/.n8n
  • /mnt/windows_export_n8n2:/data/windows # ← 已變更:現在直接指向主機路徑
    environment:
  • N8N_LISTEN_ADDRESS=0.0.0.0
  • N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false
  • N8N_BLOCK_ENV_ACCESS_IN_NODE=false
  • N8N_SECURE_COOKIE=false
  • WEBHOOK_URL=此處為 URL
  • N8N_HOST=此處為 URL
  • N8N_PORT=5678
  • N8N_PROTOCOL=http
  • N8N_PROXY_HOPS=1
  • DISABLE_IPV6=true
  • N8N_EMAIL_METHOD=smtp
  • N8N_SMTP_HOST=192.168.XX.9
  • N8N_SMTP_PORT=25
  • N8N_SMTP_USER=n8n@XXXXXX.com
  • N8N_SMTP_PASS=NnXXXXXX
  • N8N_SMTP_SENDER=n8n-2@XXXXX.com
  • N8N_SMTP_SSL=false
    labels:
  • “com.centurylinklabs.watchtower.enable=true”
    networks:
  • proxy-network

FSTAB 項目如下所示:

//192.168.XX.5/Daten /mnt/windows_export_n8n2 cifs username=XW,domain=XXXX.local,password=**********,uid=1000,gid=1000,forceuid,forcegid,vers=3.0,file_mode=0777,dir_mode=0777,rw,nobrl,nofail 0 0

File Share 具有理論上需要的所有共用權限和安全權限。

你們有什麼想法知道問題可能出在哪裡嗎?

提前感謝!

嗨 @StephanRo

在 n8n 2.0 中,預設設定已變更,檔案操作預設受到限制。N8N_RESTRICT_FILE_ACCESS_TO 環境變數現在預設為 ~/.n8n-files — 你必須明確允許你想使用的目錄。此外,對於 Docker,Read/Write Files 節點中的路徑是指容器的檔案系統,而不是你的主機,因此將 Windows 共享掛載為磁碟區是正確的,但我們需要告訴 n8n 允許存取它。

你可以嘗試以下做法:

n8n-2:
  image: 'docker.n8n.io/n8nio/n8n:latest'
  container_name: n8n-server-n8n-2
  restart: unless-stopped
  user: "1000:1000"
  volumes:
    - /home/n8n-2:/home/node/.n8n
    - /mnt/windows_export_n8n2:/files  # ← 改為 /files
  environment:
    N8N_LISTEN_ADDRESS=0.0.0.0
    N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false
    N8N_BLOCK_ENV_ACCESS_IN_NODE=false
    N8N_SECURE_COOKIE=false
    WEBHOOK_URL=URL was here
    N8N_HOST=URL was here
    N8N_PORT=5678
    N8N_PROTOCOL=http
    N8N_PROXY_HOPS=1
    DISABLE_IPV6=true
    N8N_EMAIL_METHOD=smtp
    N8N_SMTP_HOST=192.168.XX.9
    N8N_SMTP_PORT=25
    N8N_SMTP_USER=n8n@XXXXXX.com
    N8N_SMTP_PASS=NnXXXXXX
    N8N_SMTP_SENDER=n8n-2@XXXXX.com
    N8N_SMTP_SSL=false
    N8N_RESTRICT_FILE_ACCESS_TO="/files"  # ← 新增此項以允許存取
  labels:
    "com.centurylinklabs.watchtower.enable=true"
  networks:
    proxy-network

然後在 Read/Write Files 節點中使用 /files/your-folder/your-file.txt 作為你的路徑。

哇,這麼快就完成了,太棒了!

我怎樣才能最好地開始呢,我到底要在哪裡輸入什麼呢 :slight_smile: 抱歉,我對這個主題還不是很深入了解。

@StephanRo

你需要修改 docker-compose.yml。讓它類似於我發佈的內容

嗨 @StephanRo 歡迎!
將允許清單設定為您已經掛載的路徑,並不加引號寫入值。在 environment: 列表形式中,Compose 會將引號字符保留為值的一部分,因此 "/data/windows" 永遠不會與您的路徑相符:

    environment:
      - N8N_RESTRICT_FILE_ACCESS_TO=/data/windows

在該區塊中的每一行保持前置破折號,如果稍後需要多個資料夾,請用分號分隔。
環境變更不會到達已在執行的容器,因此請重新建立而不是重新啟動:

docker compose up -d --force-recreate n8n-2

在做太多改變之前,我會檢查一件小事:從容器內部以 n8n 執行的相同用戶身份測試確切的路徑。

例如:

docker exec -it -u 1000:1000 n8n-server-n8n-2 sh
id
ls -ld /files /files/Transfer /files/Transfer/Bestell-Lagerdaten
touch /files/Transfer/Bestell-Lagerdaten/n8n-write-test.txt

如果失敗,問題仍在 Docker 掛載/SMB/UID 級別。

如果成功,那麼掛載可能沒有問題,我會專注於 n8n 端的路徑允許清單,並確保節點使用的是容器路徑而不是主機路徑。

另外,如果 compose 程式碼片段中的任何 SMTP 值是真實的,發佈後我會輪換這些值。這是故障排除時容易忽略的事情。

感謝大家的幫助,我現在在度假,之後會立即試試看。

寫入測試成功。檔案將在該路徑中建立。

我已經調整好了。感謝你的提示!

我馬上從 N8N 測試一下。

完美。我會使用那個測試來將問題分成兩部分。

如果 touch 命令在容器內能正常運作,SMB 掛載可能沒問題,下一個要檢查的是 n8n 檔案存取允許清單以及在讀取/寫入檔案節點中使用的路徑。在這種情況下,該節點應該使用容器路徑,如 /files/…,而不是 Windows 或主機路徑。

如果 touch 命令在容器內執行失敗,那麼我會在修改工作流程之前先修正 Docker 磁碟區 / SMB 權限。這樣可以避免你在容器根本還無法寫入掛載資料夾時除錯 n8n。

非常感謝同事!完成了,現在可以寫入文件系統了。

現在我們這樣運行它:
n8n-2:
image: ‘docker.n8n.io/n8nio/n8n:latest’
container_name: n8n-server-n8n-2
restart: unless-stopped
user: “1000:1000”
volumes:

  • /home/n8n-2:/home/node/.n8n
  • /mnt/windows_export_n8n2:/data/windows
    environment:
  • N8N_LISTEN_ADDRESS=0.0.0.0
  • N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false
  • N8N_BLOCK_ENV_ACCESS_IN_NODE=false
  • N8N_SECURE_COOKIE=false
  • WEBHOOK_URL=https://n8n2..com
  • N8N_HOST=n8n2..com
  • N8N_PORT=5678
  • N8N_PROTOCOL=http
  • N8N_PROXY_HOPS=1
  • DISABLE_IPV6=true
  • N8N_EMAIL_METHOD=smtp
  • N8N_SMTP_HOST=192.1.0.9
  • N8N_SMTP_PORT=25
  • N8N_SMTP_USER=n8n@.com
  • N8N_SMTP_PASS=fewgerhrnztr
  • N8N_SMTP_SENDER=n8n-2@.com
  • N8N_SMTP_SSL=false
  • N8N_RESTRICT_FILE_ACCESS_TO=/data/windows
    labels:
  • “com.centurylinklabs.watchtower.enable=true”
    networks:
  • proxy-network

volumes:
n8n-server_n8n_data:
external: true
npm_data:
npm_letsencrypt: