n8n 變數n8n 環境變數n8n envn8n 設定n8n 教學

N8N 變數與環境設定:讓同一條工作流在開發與正式環境都跑得動

搞懂 n8n 變數、環境變數與 env 設定,讓同一條工作流不用改節點就能在開發、測試、正式三套環境切換。本文拆解四種存值方式、env 注入時機與常見踩雷,照著設定一次到位。

N8NMarket 2026年6月16日

n8n 變數是把可變值(API 端點、金鑰、開關)抽離工作流節點、改由環境注入的機制,透過環境變數與設定分層,解決同一條流程在開發、測試、正式環境間搬移時得逐節點改值的痛點。

把 n8n 工作流從自己電腦搬到正式機,最常見的災難不是邏輯錯,而是「忘了改某個寫死的網址」。測試環境的 webhook 打到正式資料庫、正式金鑰留在開發機的節點裡,這類問題每個自架 n8n 的人都踩過。解法不是更小心,而是讓值根本不要寫進節點。這篇把 n8n 的四種存值方式講清楚,並給一套能直接套用的環境分層設定。

目錄

n8n 有哪幾種存值方式 {#存值方式}

n8n 裡能存「會變動的值」的地方有四個,用途完全不同,混用就是混亂的開始。

1. Credentials(憑證)

放金鑰、token、資料庫密碼。n8n 會加密儲存,節點透過下拉選單引用,不會把明文寫進工作流 JSON。憑證的設定細節見 n8n 憑證設定:OAuth 與 API Key 完整教學,安全注意事項見 n8n 憑證安全指南

2. 環境變數(Environment Variables)

由作業系統或容器注入給 n8n 行程的值。n8n 本身的設定(資料庫連線、加密金鑰、執行模式)走這層,工作流內也能用 $env 讀取。這是跨環境切換的核心,下一段細講。

3. Variables(n8n 內建變數功能)

n8n 付費版與自架版提供的鍵值表,存「會在多條工作流共用、但不是機密」的值,例如公司 Slack 頻道 ID、共用資料夾路徑。節點裡用 $vars.channelId 取用。

4. 工作流內的 Set / Edit Fields 節點

存「只在這條流程內用一次」的中繼值。這類值不該跨環境,寫在節點裡反而清楚。Set 節點用法見 n8n Set 與 Merge 資料節點

選擇原則很簡單:機密走 Credentials,跨環境會變的走 env,跨流程共用的非機密走 Variables,單流程一次性的走 Set 節點。

環境變數(env)怎麼設定與注入 {#環境變數}

環境變數(env)怎麼設定與注入 {環境變數}

環境變數是讓「同一份工作流」在不同機器表現不同的關鍵。重點在於:值不在工作流裡,而在執行 n8n 的那台機器的環境裡。

Docker Compose 注入

自架 n8n 大多用 Docker。在 docker-compose.yml 裡用 environment 區塊注入:

services:
  n8n:
    image: n8nio/n8n:latest
    environment:
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=${DB_HOST}
      - WEBHOOK_URL=${WEBHOOK_URL}
      - GENERIC_TIMEZONE=Asia/Taipei
      - API_BASE_URL=${API_BASE_URL}
    env_file:
      - .env

真正的值放在同層 .env 檔,不進版控(.env 要寫進 .gitignore):

# .env(開發機)
N8N_ENCRYPTION_KEY=dev-key-xxxxx
DB_HOST=localhost
WEBHOOK_URL=https://dev.example.com/
API_BASE_URL=https://api-staging.example.com

正式機放另一份 .env,內容是正式金鑰與正式端點。工作流 JSON 完全相同,搬過去就能跑。Compose 的完整結構見 n8n Docker Compose 設定詳解

工作流裡讀 env

節點的表達式欄位用 $env 取值:

// HTTP Request 節點的 URL 欄位
{{ $env.API_BASE_URL }}/v1/orders

開發機解析成 staging API,正式機解析成正式 API,節點本身一字不用改。表達式語法見 n8n 表達式速查表

自架才放得開

$env 預設只在自架版完整開放;n8n Cloud 基於多租戶安全會限制讀取主機環境變數。如果你重度依賴 env 分層,自架是比較順的選擇,兩者差異見 n8n 自架 vs Cloud 比較。這個「把設定與程式碼分離」的原則不是 n8n 獨創,而是 The Twelve-Factor App 早就提出的軟體設定準則。

用 Variables 功能存共用值 {#variables}

Variables 適合「多條工作流都會用到、改一次全部生效、但不是機密」的值。

設定路徑在 n8n 後台的 Variables 頁面,新增鍵值對,例如:

KeyValue用途
slackAlertChannelC0123ABC警報通知頻道
defaultLocalezh-TW預設語系
retryLimit3共用重試次數

工作流裡用 $vars 讀取:

{{ $vars.slackAlertChannel }}

和 env 的差別:env 由主機注入、適合「每個環境不同」的值;Variables 存在 n8n 資料庫裡、適合「跨流程共用且環境間大致相同」的值。把 Slack 頻道 ID 用 Variables 管,往後換頻道改一處即可,不必翻遍每條工作流。官方對 Variables 的說明見 n8n 官方文件 Variables 章節

三套環境的實戰分層設定 {#環境分層}

三套環境的實戰分層設定 {環境分層}

開發、測試、正式三套環境,建議的分層長這樣:

  1. 同一份工作流 JSON — 透過匯出匯入或 Git 同步,三套環境跑完全一樣的流程定義。
  2. 三份 .env — 每台機器一份,差異只在端點與金鑰。
  3. Credentials 各環境獨立建立 — 開發機建 staging 憑證、正式機建正式憑證,憑證名稱保持一致(例如都叫 Main Postgres),工作流引用名稱不變、實際連線不同。
  4. Webhook URL 由 WEBHOOK_URL 控制 — 確保開發機產生的 webhook 網址指向開發機,不會誤觸正式回呼。

實務流程:在開發機做完工作流 → 匯出 JSON → 進測試環境驗證 → 確認無誤再上正式。整個過程不改任何節點值,只靠各環境的 env 與同名憑證承接差異。子流程拆分能讓這套搬移更乾淨,見 n8n Sub-workflow 可重用設計

常見踩雷與排查 {#踩雷}

改了 .env 卻沒生效:環境變數只在 n8n 行程啟動時讀一次。改完一定要重啟容器(docker compose up -d --force-recreate),熱改無效。

$env 讀到 undefined:先確認該變數真的有注入到容器。進容器內 printenv | grep API_BASE_URL 確認;常見原因是變數寫在 .env 但 compose 的 environment 區塊沒對應引用,或 env_file 路徑錯。

加密金鑰換了,憑證全解不開N8N_ENCRYPTION_KEY 是用來加解密所有 Credentials 的。換機器時若沒帶上同一把金鑰,舊憑證會全部失效。搬遷前務必先固定這把金鑰,相關備份流程見 n8n 備份與升級 SOP

把金鑰寫進 Set 節點:金鑰一律走 Credentials,寫進 Set 節點會被存進工作流 JSON 明文,匯出時外洩。更多錯誤排查見 n8n 常見錯誤 Top 10

常見問題 FAQ {#faq}

n8n 的 $env$vars 差在哪?

$env 讀的是執行 n8n 的主機環境變數,適合每個環境(開發/正式)不同的值;$vars 讀的是 n8n 內建 Variables 功能存在資料庫的值,適合跨工作流共用、環境間大致相同的非機密設定。

n8n Cloud 可以用環境變數嗎?

n8n Cloud 基於多租戶安全,限制工作流讀取主機環境變數。需要完整 env 分層能力時,自架版較合適。

改了環境變數要重啟嗎?

要。環境變數在 n8n 行程啟動時讀取一次,改完 .env 後必須重啟容器才會生效。

金鑰應該放 env 還是 Credentials?

放 Credentials。n8n 會加密儲存憑證、且不寫進工作流 JSON;env 雖然不進節點,但 .env 檔仍是明文,金鑰交給 Credentials 管理較安全。


把值抽離節點,是讓 n8n 工作流從「玩具」變成「可維運系統」的分水嶺。先把 Credentials、env、Variables 三層分清楚,再為三套環境各備一份 .env,往後搬移工作流就只是匯入 JSON 而已。

想持續拿到這類 n8n 實戰設定技巧,可以追蹤 N8NMarket 每週 n8n 精選