描述問題/錯誤/疑問
我在自託管執行個體上啟動已註冊的社群授權時遇到困難。當嘗試透過網頁 UI 或使用環境變數啟動時,啟動失敗並出現與裝置指紋相關的驗證錯誤。
不過,在容器內執行 CLI 工具時顯示正在產生有效的指紋。似乎存在不一致的情況,其中背景網頁程序/SDK 傳遞空白或截斷的指紋字串給授權伺服器。
當我首次進入容器的終端機並手動執行 n8n license:info 時,會成功產生並顯示完整的有效 64 字元指紋:
\~ $ n8n license:info
Puppeteer node: Container detected via .dockerenv file
\[license SDK\] Skipping renewal on init: license cert is not initialized
## CONSUMER CONFIG ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## LICENSE CERT ##
version: <n/a>
tenantId: <n/a> (!)
consumerId: <n/a>
deviceFingerprint: <n/a> (!)
createdAt: <n/a>
issuedAt: <n/a>
expiresAt: <n/a>
terminatesAt: <n/a>
isEphemeral: <n/a>
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: <n/a>
entitlements: 0
歷史
-
我無法讓編輯器中的偵錯正常運作 - 它表示我需要註冊。我應該已經有了。過去我一直都有 - 不知道為什麼這改變了。
-
我在日誌中看到:
[license SDK] cert is invalid because it has expired: (autorenewalsEnabled: true, expiredAt: Sat May 09 2026 15:29:44 GMT-0400 (Eastern Daylight Time), issuedAt: Wed Apr 29 2026 15:29:44 GMT-0400 (Eastern Daylight Time))
-
我確實有 TZ=America/New_York 和一個 32 位元 N8N_ENCRYPTION_KEY,它沒有變更。加密密鑰同時在環境變數和 .n8n/config 檔案中
-
我執行了這個命令並看到:
\~ $ n8n license:info
Puppeteer node: Container detected via .dockerenv file
[license SDK] attempting license renewal
[license SDK] license successfully renewed
## CONSUMER CONFIG ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## LICENSE CERT ##
version: 2
tenantId: 1
consumerId: 84ac80cc-574f-4841-b0f3-2df3c875080f
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
createdAt: Fri May 09 2025 18:15:12 GMT-0400 (Eastern Daylight Time)
issuedAt: Thu Jun 18 2026 15:51:04 GMT-0400 (Eastern Daylight Time)
expiresAt: Sun Jun 28 2026 15:51:04 GMT-0400 (Eastern Daylight Time)
terminatesAt: Tue May 03 2050 18:15:12 GMT-0400 (Eastern Daylight Time)
isEphemeral: false
isValid: true
isRenewalDue: false
detachedEntitlementsCount: 0
entitlements: 1
--
## ENTITLEMENT 1 ##
id: 7a862864-5aab-4dac-a6fe-e1ea891a6459
productId: 031ebde1-0ebe-47b8-802a-29c084a2a4c3
validFrom: Fri May 09 2025 18:15:12 GMT-0400 (Eastern Daylight Time)
validTo: Sat May 05 2040 18:15:12 GMT-0400 (Eastern Daylight Time)
features: {"planName":"Registered Community","feat:folders":true,"feat:debugInEditor":true,"feat:workflowHistory":true,"feat:insights:viewSummary":true,"feat:workflowHistoryPrune":true,"quota:workflowHistoryPrune":24,"feat:advancedExecutionFilters":true,"quota:evaluations:maxWorkflows":1,"quota:insights:retention:maxAgeDays":180,"quota:insights:retention:pruneIntervalDays":24}
featureOverrides: {}
- 當我嘗試點擊啟動電子郵件中的按鈕或貼上它時,我得到了相同的結果:
使用者介面:
Activation key is in the wrong format
日誌:
[license SDK] license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters
- 我執行了 n8n license:clear,然後重新啟動。現在我在日誌中收到:
[license SDK] Skipping renewal on init: license cert is not initialized
這是我在殼層中看到的內容
\~ $ n8n license:info
Puppeteer node: Container detected via .dockerenv file
\[license SDK\] Skipping renewal on init: license cert is not initialized
## CONSUMER CONFIG ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## LICENSE CERT ##
version: <n/a>
tenantId: <n/a> (!)
consumerId: <n/a>
deviceFingerprint: <n/a> (!)
createdAt: <n/a>
issuedAt: <n/a>
expiresAt: <n/a>
terminatesAt: <n/a>
isEphemeral: <n/a>
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: <n/a>
entitlements: 0
-
我嘗試使用區域網路 IP 而不是 Cloudflare URL - http://192.168.200.12:5678/settings/usage?key=03329154-96a6-4bac-89f0-xxxxxxxxxxxx。給了我相同的錯誤
-
這在這個 Docker 映像上過去可以正常運作(幾個月前的先前版本)。
-
我也嘗試過透過 N8N_LICENSE_ACTIVATION_KEY 直接將金鑰傳遞給容器,導致了相同的日誌失敗。
我已經使用 3 個不同的 AI 來幫助修復此問題,我們都已經沒有想法了 
我可以做什麼?
錯誤訊息是什麼(如果有的話)?
當嘗試透過 UI 或使用 N8N_LICENSE_ACTIVATION_KEY 啟動時,容器日誌顯示:
[license SDK] Skipping renewal on init: license cert is not initialized
[license SDK] license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters
Could not activate license
關於您的 n8n 設定的資訊
- n8n 版本: 2.26.7(也發生在較早版本)
- 資料庫(預設值:SQLite): Postgres
- n8n EXECUTIONS_PROCESS 設定(預設值:own、main):
- 透過以下方式執行 n8n(Docker、npm、n8n cloud、桌面應用程式):synology docker
- 作業系統:synology
@jmaver 你的 CLI run 已經續約了,第二個 license:info 現在顯示 isValid true(有效期至 6 月 28 日)。license 狀態存儲在數據庫中,所以證書在那邊已經修復,但你運行的進程仍然持有在啟動時緩存的過期証書。重新啟動 n8n 容器,它會從數據庫重新加載有效的證書,registered 和 Debug in Editor 就會恢復。之所以過期是因為 community license 必須每大約 10 天聯繫一次 license.n8n.io/v1 進行續約,所以請確保代理或防火牆沒有阻止出站連接。
可惜並不是。
我已經重啟過許多次。每次使用啟用環境變數開機都顯示相同的錯誤,嘗試手動新增啟用授權代碼仍然失敗,我仍然無法在編輯器中進行偵錯。
@jmaver 沒錯,這是裝置指紋不匹配的問題,你的憑證綁定到一個指紋,但實例在每次啟動時呈現不同的指紋,所以無論重啟多少次都會持續拒絕,這也是為什麼 license.cert 無法保留。先移除 N8N_LICENSE_ACTIVATION_KEY 環境變數,保留它會導致每次啟動都重新執行啟動過程,並重新遇到不匹配問題,而不是只是從資料庫載入現有的。但由於綁定本身已損壞,真正的解決方法是寄信到 help@n8n.io 要求重設金鑰,社群金鑰被消耗在舊指紋上,只有他們能釋放它,這樣才能重新綁定到你目前的實例。
嗨 @jmaver
當你在 shell 中執行 n8n license:info 時,你很可能以具有完整系統標識符存取權限的使用者(通常是 root 或預設的 node 使用者)身份執行。然而,主要的 n8n 程序——處理 Web UI 和 N8N_LICENSE_ACTIVATION_KEY 的程序——無法解析相同的指紋識別,向授權伺服器傳送空字符串或 null 值,進而觸發「少於 32 個字符」的驗證錯誤。
嘗試明確地將 machine-id 檔案對應到容器中,以確保其一致且可讀。
- 在你的 Synology 主機上建立一個檔案(例如,在你的 n8n 設定資料夾中)名為
machine-id,其中包含一個隨機的 32 字符十六進位字串。
- 在 Docker/Container Manager 設定中新增磁碟區對應:
- 檔案/資料夾:
/volume1/docker/n8n/machine-id(調整為你的路徑)→掛載路徑: /etc/machine-id
- 重新啟動容器。
這樣有幫助嗎?
不,那似乎沒有產生任何差別。我在容器的 /etc 中看得到它,但日誌中完全沒有相關信息,啟動失敗的情況一樣
在容器殼層中執行以下命令
ls -l /etc/machine-id /var/lib/dbus/machine-id
它會顯示什麼?
/etc $ ls -al /etc/machine-id
-rwxr-xr-x 1 1024 100 32 Jun 22 11:57 /etc/machine-id
/etc $ ls -l /etc/machine-id /var/lib/dbus/machine-id
ls: /var/lib/dbus/machine-id: No such file or directory
檢查您的 N8N_ENCRYPTION_KEY。它是否恰好 32 個字符長?
在您的容器終端中執行此命令
ps aux | grep n8n
它顯示什麼?
/etc $ echo “${#N8N_ENCRYPTION_KEY}”
32
/etc $ ps aux | grep n8n
6 node 0:40 {MainThread} node /usr/local/bin/n8n start
關鍵細節是 n8n 的指紋生成檢查 /etc/machine-id 和 /var/lib/dbus/machine-id 兩者 - 由於容器中缺少第二個路徑,即使對應了第一個路徑,ID 仍可能無法正確解析。
在 docker-compose 中新增第二個磁碟區掛載:
- /var/lib/dbus/machine-id:/var/lib/dbus/machine-id:ro
如果主機上沒有該檔案,請先建立它:cat /etc/machine-id | sudo tee /var/lib/dbus/machine-id。然後重新啟動容器並重試授權啟用。
@jmaver machine-id 路徑是死胡同,你的 CLI 已經從 /etc/machine-id 構建了完整的 64 字元指紋,所以解析工作良好,問題不在那裡。空指紋只出現在啟動請求中,那才是真正的錯誤,啟動沒有發送你的實例清楚計算的指紋。你之前的 license:info 更新了一個有效憑證 (isValid: true),所以更新有效,只有啟動損壞,這意味著 license:clear 是錯誤的舉動,它刪除了那個良好的憑證並把你推到損壞的啟動路徑上。重試啟動或環境變數現在無法幫助。最簡單的恢復方法是從清空之前擷取的資料庫快照中還原設定表中的 license.cert 列。沒有快照的話,那麼這是一個乾淨可復現的啟動錯誤,把那個 license:info 輸出發送到 help@n8n.io,以便他們根據你的指紋重新設置它。
~ $ ls -l /etc/machine-id /var/lib/dbus/machine-id
-rwxr-xr-x 1 1024 100 32 Jun 22 11:57 /etc/machine-id
-rwxr-xr-x 1 1024 100 32 Jun 22 11:57 /var/lib/dbus/machine-id
結果相同。以下是調試版本的日誌,儘管看起來沒有添加任何內容:
- 2026-06-22T19:29:18.132Z | debug | [license SDK] 為 deviceFingerprint n8n-j 初始化 {"scopes":["license"],"file":"LicenseManager.js","function":"log"}
- 2026-06-22T19:29:18.137Z | info | [license SDK] 在初始化時跳過續約:許可證尚未初始化 {"scopes":["license"],"file":"LicenseManager.js","function":"log"}
- 2026-06-22T19:29:18.138Z | debug | 許可證已初始化 {"scopes":["license"],"file":"license.js","function":"init"}
- 2026-06-22T19:29:18.141Z | debug | 嘗試許可證激活 {"file":"base-command.js","function":"initLicense"}
- 2026-06-22T19:29:18.335Z | warn | [license SDK] 許可證激活失敗:request/body/deviceFingerprint 字符數不能少於 32 個 {"scopes":["license"],"file":"LicenseManager.js","function":"log"}
- 2026-06-22T19:29:18.574Z | error | 無法激活許可證 {"error":{"name":"Error","message":"許可證激活失敗:request/body/deviceFingerprint 字符數不能少於 32 個","stack":"Error: license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters\n at v.activate (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n_io+license-sdk@2.25.0/node_modules/@n8n_io/license-sdk/src/LicenseManager.ts:461:17)\n at processTicksAndRejections (node:internal/process/task_queues:104:5)\n at License.activate (/usr/local/lib/node_modules/n8n/src/license.ts:208:3)\n at Start.initLicense (/usr/local/lib/node_modules/n8n/src/commands/base-command.ts:318:5)\n at Start.init (/usr/local/lib/node_modules/n8n/src/commands/start.ts:239:3)\n at CommandRegistry.execute (/usr/local/lib/node_modules/n8n/src/command-registry.ts:82:4)\n at /usr/local/lib/node_modules/n8n/bin/n8n:63:2"},"file":"base-command.js","function":"initLicense"}
@jmaver 對,兩個檔案現在都在了,但還是失敗,所以 machine-id 可以完全排除。但看看那行偵錯訊息,伺服器初始化時的 deviceFingerprint 是「n8n-j…」,這很短,是那個少於 32 字元的值被拒絕了,不是你的 CLI 建置的 64 字元雜湊值。所以執行中的流程被傳入了一個截斷的指紋,而不是計算它。容器的主機名稱是什麼,你的 compose/config 中是否還有之前嘗試留下的 N8N_LICENSE_* 或指紋相關的項目?那個短短的 n8n-j 字串幾乎肯定是來自其中之一。
在您的終端機中執行此命令
su - node -c "n8n license:info"
它顯示什麼?
sudo docker exec -it n8n n8n license:info
## 消費者配置 ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## 授權憑證 ##
version: <n/a>
tenantId: <n/a> (!)
consumerId: <n/a>
deviceFingerprint: <n/a> (!)
createdAt: <n/a>
issuedAt: <n/a>
expiresAt: <n/a>
terminatesAt: <n/a>
isEphemeral: <n/a>
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: <n/a>
entitlements: 0
這是我的 compose:
name: n8n
services:
n8n:
image: n8n-with-puppeteer:${N8N_VERSION}
build:
context: git@gitea:jmaver/docker-stacks.git#main
dockerfile: stacks/n8n/setup/n8n-with-puppeteer-dockerfile
args:
N8N_VERSION: "${N8N_VERSION}"
container_name: n8n
volumes:
- /volume1/docker/n8n/data:/home/node/.n8n
- /volume1/docker/n8n/machine-id:/etc/machine-id
- /volume1/docker/n8n/machine-id:/var/lib/dbus/machine-id:ro
environment:
# 公開 URL / 基本配置
DOMAIN_NAME: [xxxx.com](http://xxxx.com)
SUBDOMAIN: n8n-j
N8N_HOST: [n8n-j.xxxx.com](http://n8n-j.xxxx.com)
N8N_PORT: 5678
N8N_PROTOCOL: http
N8N_EDITOR_BASE_URL: [https://n8n-j.xxxx.com/](https://n8n-j.xxxx.com/)
WEBHOOK_URL: [https://n8n-j.xxxx.com/](https://n8n-j.xxxx.com/)
GENERIC_TIMEZONE: America/New_York
TZ: America/New_York
PGID: 100
PUID: 1030
# 核心行為
N8N_INSTANCE_ID: n8n-j
N8N_LOG_LEVEL: debug
N8N_PROXY_HOPS: 1
N8N_SECURE_COOKIE: false
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: true
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY:?set in env}
N8N_LICENSE_ACTIVATION_KEY: ${N8N_LICENSE_ACTIVATION_KEY:?set in env}
N8N_LICENSE_AUTO_RENEW_ENABLED: true
N8N_PAYLOAD_SIZE_MAX: 64
# 修復遺失的套件
N8N_REINSTALL_MISSING_PACKAGES: "true"
# 允許代碼節點存取環境變數(由你決定)
N8N_BLOCK_ENV_ACCESS_IN_NODE: "false"
# 隊列模式關閉
EXECUTIONS_MODE: regular
N8N_CONCURRENCY_PRODUCTION_LIMIT: 5
# 外部任務運行器(broker 在此)
N8N_RUNNERS_MODE: external
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN:?set in env}
N8N_RUNNERS_TASK_REQUEST_TIMEOUT: 300
N8N_NATIVE_PYTHON_RUNNER: "false"
N8N_NATIVE_JAVASCRIPT_RUNNER: "false"
# 遙測 / 診斷
N8N_DIAGNOSTICS_ENABLED: "false"
N8N_DIAGNOSTICS_ENABLE_HEALTHCHECK: "false"
N8N_VERSION_NOTIFICATIONS_ENABLED: "false"
N8N_TEMPLATES_ENABLED: "false"
EXTERNAL_FRONTEND_HOOKS_URLS: ""
N8N_DIAGNOSTICS_CONFIG_FRONTEND: ""
N8N_DIAGNOSTICS_CONFIG_BACKEND: ""
N8N_ONBOARDING_FLOW_DISABLED: "true"
# 資料庫
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: xxxx
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB:?set in env}
DB_POSTGRESDB_USER: ${POSTGRES_USER:?set in env}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD:?set in env}
# Puppeteer / Chromium
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: "true"
PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium
ports:
- '5678:5678'
networks:
- infra
command: [ "start" ]
restart: unless-stopped
healthcheck:
test: [ "CMD-SHELL", "wget -q --spider [http://127.0.0.1:5678/healthz](http://127.0.0.1:5678/healthz) || exit 1" ]
interval: 60s
timeout: 5s
retries: 5
start_period: 60s
cap_add:
- SYS_ADMIN
cpu_shares: 1800
mem_limit: 4g
shm_size: 3gb
security_opt:
- seccomp:unconfined
更正我之前的回覆,我搞錯了機制,所以請忽略主機名的部分。n8n 的授權指紋是 instanceId(來自來源,deviceFingerprint: () => instanceId),而不是主機名。你的 CLI 顯示了一個有效的 64 字元 instanceId(a11f905a…),但啟動請求因為發送了一個少於 32 字元的 instanceId 而被拒絕,所以啟動路徑並沒有識別到有效的 instanceId,儘管一個明確存在。
我沒有找到為什麼它只在啟動流程中出現不足的根本原因。但由於你之前的 license:info 已經更新了一個有效的憑證,最可靠的路徑是從執行 license:clear 之前拍攝的資料庫快照中恢復 license.cert 列,或者讓 n8n 支援團隊重新植入它,而不是進行更多的 machine-id 或主機名變更。
嘿 @jmaver,我在你的 compose 中發現了一個問題,你有:
N8N_INSTANCE_ID: n8n-j
那只有 5 個字元。n8n 的授權 SDK 直接從實例 ID 衍生 deviceFingerprint,而授權伺服器需要至少 32 個字元。所以 n8n-j 是作為指紋發送的內容,這正是你收到「must NOT have fewer than 32 characters」錯誤的原因。
修復方法:要麼完全移除 N8N_INSTANCE_ID(n8n 會自動產生有效的 UUID),要麼用一個適當的 UUID 取代它:
N8N_INSTANCE_ID: n8n-j-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
修改後,暫時移除 N8N_LICENSE_ACTIVATION_KEY,重新啟動,執行 n8n license:info 以確認新的指紋是 64 個字元,然後重新新增啟用金鑰並再次重新啟動。
這應該能解決問題,無需聯絡支援。