Échec d'activation de licence sur n8n auto-hébergé

Décrivez le problème/l’erreur/la question

J’ai du mal à activer ma licence Registered Community sur une instance auto-hébergée. Lors de la tentative d’activation via l’interface web ou en utilisant la variable d’environnement, l’activation échoue avec une erreur de validation concernant l’empreinte digitale de l’appareil.

Cependant, l’exécution de l’outil CLI à l’intérieur du conteneur montre qu’une empreinte digitale valide est en cours de génération. Il semble y avoir une discordance où le processus web en arrière-plan/SDK passe une chaîne d’empreinte digitale vide ou tronquée à vos serveurs de licence.

Quand j’accède pour la première fois au terminal du conteneur et que j’exécute manuellement n8n license:info, une empreinte digitale complète et valide de 64 caractères est générée avec succès et visible :

\~ $ 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: 

tenantId: 

consumerId: 
deviceFingerprint: 

createdAt: 
issuedAt: 
expiresAt: 
terminatesAt: 
isEphemeral: 
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: 
entitlements: 0

Historique

  1. Je n’arrivais pas à faire fonctionner le Debug in Editor - il disait que je devais être enregistré. Je devais déjà l’être. J’ai déjà eu cette licence auparavant - je ne sais pas pourquoi cela a changé.

  2. J’ai vu ceci dans mes journaux :
    [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))

  3. J’ai TZ=America/New_York et une clé N8N_ENCRYPTION_KEY de 32 bits qui n’a pas changé. La clé de chiffrement est à la fois dans l’environnement et dans le fichier .n8n/config

  4. J’ai exécuté ceci et j’ai vu :

\~ $ 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: {}
  1. Quand j’essaie de cliquer sur le bouton dans l’email d’activation ou que je la colle, j’obtiens la même chose :
UI:
Activation key is in the wrong format

log:
[license SDK] license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters
  1. J’ai exécuté n8n license:clear puis redémarré. Maintenant, j’obtiens ceci dans le journal :
    [license SDK] Skipping renewal on init: license cert is not initialized

et voici ce que j’obtiens dans le shell

\~ $ 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: 

tenantId: 

consumerId: 
deviceFingerprint: 

createdAt: 
issuedAt: 
expiresAt: 
terminatesAt: 
isEphemeral: 
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: 
entitlements: 0
  1. J’ai essayé d’utiliser l’IP LAN au lieu de l’URL cloudflare - http://192.168.200.12:5678/settings/usage?key=03329154-96a6-4bac-89f0-xxxxxxxxxxxx . J’obtiens les mêmes erreurs

  2. Cela fonctionnait bien auparavant sur cette image docker (versions antérieures il y a des mois).

  3. J’ai aussi essayé de passer la clé directement au conteneur via N8N_LICENSE_ACTIVATION_KEY, ce qui a abouti au même échec de journal.

J’ai utilisé 3 IA différentes pour m’aider à corriger cela et nous sommes tous à court d’idées :slight_smile:

Que puis-je faire ?

Quel est le message d’erreur (le cas échéant) ?

Lorsque vous essayez d’activer via l’interface utilisateur ou en utilisant N8N_LICENSE_ACTIVATION_KEY, les journaux du conteneur affichent :
[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

Informations sur votre configuration n8n

  • version n8n : 2.26.7 (également avec les versions antérieures)
  • Base de données (par défaut : SQLite) : Postgres
  • paramètre n8n EXECUTIONS_PROCESS (par défaut : own, main) :
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) : synology docker
  • Système d’exploitation : synology

@jmaver votre exécution CLI l’a déjà renouvelé, le second license:info affiche maintenant isValid true (expire le 28 juin). l’état de la licence est stocké dans la db, donc le certificat y est corrigé mais votre processus en cours maintient toujours celui expiré qu’il a mis en cache au démarrage. redémarrez le conteneur n8n, il recharge le certificat valide depuis la db et registered + Debug in Editor reviennent. il a expiré parce que la licence communautaire doit atteindre license.n8n.io/v1 pour se renouveler environ tous les 10 jours, donc assurez-vous que les requêtes sortantes ne sont pas bloquées par un proxy ou un pare-feu.

Malheureusement, ce n’est pas le cas.

J’ai redémarré de nombreuses fois. À chaque démarrage avec la variable d’environnement d’activation, la même erreur s’affiche, la tentative d’ajout manuel du code de licence d’activation échoue toujours, et je ne peux toujours pas déboguer dans l’éditeur.

@jmaver ouais c’est un problème d’incompatibilité de device-fingerprint, ton certificat est lié à une empreinte mais l’instance en présente une différente à chaque démarrage, donc il le rejette quoi qu’il arrive peu importe combien de redémarrages, c’est aussi pour ça que license.cert ne persiste pas. supprime d’abord la variable d’environnement N8N_LICENSE_ACTIVATION_KEY, la laisser en place signifie que chaque démarrage réexécute l’activation et rencontre à nouveau l’incompatibilité au lieu de simplement charger ce qui est dans la base de données. mais puisque la liaison elle-même est cassée, le vrai déblocage c’est d’envoyer un email à help@n8n.io pour réinitialiser la clé, la clé communautaire est consommée contre l’ancienne empreinte et seulement eux peuvent la libérer pour qu’elle se relie à ton instance actuelle.

Bonjour @jmaver

Quand vous exécutez n8n license:info dans le shell, vous exécutez probablement en tant qu’utilisateur (souvent root ou l’utilisateur node par défaut) qui a un accès complet aux identifiants système utilisés pour générer l’empreinte digitale. Cependant, le processus n8n principal—qui gère l’interface Web et la clé N8N_LICENSE_ACTIVATION_KEY—ne parvient pas à résoudre cette même empreinte digitale, en envoyant une chaîne vide ou null au serveur de licences, ce qui déclenche alors l’erreur de validation « moins de 32 caractères ».

Essayez de mapper explicitement un fichier machine-id dans le conteneur pour vous assurer qu’il est cohérent et lisible.

  1. Créez un fichier sur votre hôte Synology (par exemple, dans votre dossier de configuration n8n) appelé machine-id contenant une chaîne hexadécimale aléatoire de 32 caractères.
  2. Ajoutez un mappage de volume dans vos paramètres Docker/Container Manager :
    • Fichier/Dossier : /volume1/docker/n8n/machine-id (ajustez selon votre chemin) → Chemin de montage : /etc/machine-id
  3. Redémarrez le conteneur.

Cela vous aide-t-il ?

non, ça ne semble pas avoir fait de différence. Je le vois dans /etc dans le conteneur, mais rien à ce sujet dans les logs et le même échec d’activation

Exécutez la commande suivante dans le shell du conteneur

ls -l /etc/machine-id /var/lib/dbus/machine-id

qu’affiche-t-elle ?

/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: Aucun fichier ou répertoire de ce type

Vérifiez votre N8N_ENCRYPTION_KEY. Fait-elle exactement 32 caractères de long ?

Exécutez cette commande dans le terminal de votre conteneur

ps aux | grep n8n

Qu’affiche-t-elle ?

/etc $ echo “${#N8N_ENCRYPTION_KEY}”
32

/etc $ ps aux | grep n8n
6 node 0:40 {MainThread} node /usr/local/bin/n8n start

Le détail clé ici est que la génération d’empreinte numérique de n8n vérifie à la fois /etc/machine-id ET /var/lib/dbus/machine-id - puisque ce second chemin manque dans votre conteneur, l’ID peut toujours ne pas se résoudre correctement même avec le premier mappé.

Ajoutez un second montage de volume à votre docker-compose :

- /var/lib/dbus/machine-id:/var/lib/dbus/machine-id:ro

Si vous n’avez pas ce fichier sur l’hôte, créez-le d’abord : cat /etc/machine-id | sudo tee /var/lib/dbus/machine-id. Ensuite, redémarrez le conteneur et réessayez l’activation de la licence.

@jmaver le chemin machine-id est une impasse, votre CLI construit déjà une empreinte digitale complète de 64 caractères à partir de /etc/machine-id donc la résolution fonctionne bien, ce n’est pas ça. l’empreinte digitale vide s’affiche uniquement dans la demande d’activation, c’est le vrai bug, activate n’envoie pas l’empreinte digitale que votre instance calcule clairement. et votre license:info précédente a renouvelé un certificat valide (isValid: true), donc le renouvellement fonctionne et seule l’activation est cassée, ce qui signifie que license:clear était le mauvais mouvement, il a supprimé ce bon certificat et vous a poussé sur le chemin activate cassé. réessayer l’activation ou la clé env ne vous aidera pas maintenant. la récupération la plus facile est de restaurer la ligne license.cert dans la table settings à partir d’un snapshot de base de données pris avant le clear. pas de snapshot, alors c’est un bug d’activation clairement reproductible, envoyez cette sortie license:info à help@n8n.io pour qu’ils la réinitialisent en fonction de votre empreinte digitale.

~ $ 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

mêmes résultats. voici la version de débogage du journal, bien que cela semble ne rien ajouter :


- 2026-06-22T19:29:18.132Z | debug | [license SDK] initializing for deviceFingerprint n8n-j {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.137Z | info | [license SDK] Skipping renewal on init: license cert is not initialized {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.138Z | debug | License initialized {"scopes":["license"],"file":"license.js","function":"init"}

- 2026-06-22T19:29:18.141Z | debug | Attempting license activation {"file":"base-command.js","function":"initLicense"}

- 2026-06-22T19:29:18.335Z | warn | [license SDK] license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.574Z | error | Could not activate license {"error":{"name":"Error","message":"license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters","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 right, both files are there now and it still fails, so machine-id is fully ruled out. but look at that debug line, the server inits with deviceFingerprint “n8n-j…” which is short, thats the under-32-char value getting rejected, not the 64-char hash your CLI builds. so the running process is being handed a truncated fingerprint from somewhere instead of computing it. whats the containers hostname, and are there any leftover N8N_LICENSE_* or fingerprint-related entries in your compose/config from the earlier attempts? that short n8n-j string is almost certainly coming from one of those.

Exécutez ceci dans votre terminal

su - node -c "n8n license:info"

Qu’affiche-t-il ?

sudo docker exec -it n8n n8n license:info

## 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

Voici ma composition :

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:
# Public URLs / base config
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

# Comportement principal
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

# Corriger les paquets manquants
N8N_REINSTALL_MISSING_PACKAGES: "true"

# Autoriser les nœuds Code à accéder aux variables d'environnement (à votre préférence)
N8N_BLOCK_ENV_ACCESS_IN_NODE: "false"

# Mode file d'attente désactivé
EXECUTIONS_MODE: regular
N8N_CONCURRENCY_PRODUCTION_LIMIT: 5

# Exécuteurs de tâches externes (le courtier se trouve ici)
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"

# Télémétrie / diagnostics
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"

# Base de données
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

correction à ma dernière réponse, j’avais le mécanisme mal compris donc ignore la partie hostname. l’empreinte de licence de n8n est l’instanceId (du source, deviceFingerprint: () => instanceId), pas le hostname. votre CLI affiche un instanceId valide de 64 caractères (a11f905a…), mais la demande d’activation est rejetée parce qu’elle envoie un ID inférieur à 32 caractères, donc le chemin d’activation ne détecte pas un instanceId valide même s’il en existe clairement un.

je n’ai pas de cause profonde vérifiée pour savoir pourquoi il n’apparaît raccourci que dans le flux d’activation. mais puisque votre license:info précédent a déjà renouvelé un certificat valide, le chemin le plus fiable est de restaurer cette ligne license.cert à partir d’une sauvegarde de base de données prise avant d’avoir exécuté license:clear, ou de faire en sorte que le support n8n la reseed, plutôt que de faire d’autres changements de machine-id ou hostname.

D’accord, merci – je vais leur envoyer un email

Salut @jmaver, je l’ai repéré dans ton compose, tu as :

N8N_INSTANCE_ID: n8n-j

Ce ne sont que 5 caractères. Le SDK de licence de n8n dérive le deviceFingerprint directement de l’ID d’instance, et le serveur de licence nécessite un minimum de 32 caractères. Donc n8n-j est ce qui est envoyé comme empreinte, ce qui explique exactement pourquoi tu obtiens l’erreur « must NOT have fewer than 32 characters ».

Solution : Supprime N8N_INSTANCE_ID entièrement (n8n générera automatiquement un UUID valide), ou remplace-le par un UUID approprié :

N8N_INSTANCE_ID: n8n-j-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Après l’avoir modifié, supprime N8N_LICENSE_ACTIVATION_KEY temporairement, redémarre, exécute n8n license:info pour confirmer que la nouvelle empreinte fait 64 caractères, puis rajoute la clé d’activation et redémarre une fois de plus.

Cela devrait résoudre le problème sans avoir besoin de contacter le support.