Error de activación de licencia en n8n autohospedado

Describa el problema/error/pregunta

Tengo problemas para activar mi licencia de Comunidad Registrada en una instancia autohospedada. Al intentar activar a través de la interfaz web o usando la variable de entorno, la activación falla con un error de validación relacionado con la huella dactilar del dispositivo.

Sin embargo, al ejecutar la herramienta CLI dentro del contenedor se muestra que se está generando una huella dactilar válida. Parece haber una discrepancia donde el proceso web de fondo/SDK está pasando una cadena de huella dactilar vacía o truncada a sus servidores de licencias.

Cuando accedo por primera vez a la terminal del contenedor y ejecuto manualmente n8n license:info, se genera y es visible una huella dactilar completa y válida de 64 caracteres:

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

Historial

  1. No logré que Debug en Editor funcionara - decía que necesitaba estar registrado. Ya debería estarlo. Lo he estado en el pasado - no sé por qué cambió.

  2. Vi esto en mis registros:
    [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. Tengo TZ=America/New_York y una N8N_ENCRYPTION_KEY de 32 bits que no ha cambiado. La clave de cifrado está tanto en el entorno como en el archivo .n8n/config

  4. Ejecuté esto y vi:

\~ $ 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. Cuando intento hacer clic en el botón en el correo de activación o pegarlo, obtengo lo mismo:
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. Ejecuté n8n license:clear y luego reinicié. Ahora obtengo esto en el registro:
    [license SDK] Skipping renewal on init: license cert is not initialized

y esto es lo que obtengo en el 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: 
<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
  1. He intentado usar la IP de la LAN en lugar de la URL de cloudflare - http://192.168.200.12:5678/settings/usage?key=03329154-96a6-4bac-89f0-xxxxxxxxxxxx . Me da los mismos errores

  2. Esto solía funcionar bien en esta imagen de docker (compilaciones anteriores hace meses).

  3. También he intentado pasar la clave directamente al contenedor a través de N8N_LICENSE_ACTIVATION_KEY, lo que resultó en el mismo fallo de registro.

He usado 3 IAs diferentes para ayudar a arreglar esto y todos nos hemos quedado sin ideas :slight_smile:

¿qué puedo hacer?

¿Cuál es el mensaje de error (si lo hay)?

Al intentar activar a través de la interfaz de usuario o usando N8N_LICENSE_ACTIVATION_KEY, los registros del contenedor muestran:
[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

Información sobre tu configuración de n8n

  • versión de n8n: 2.26.7 (también ocurre con versiones anteriores)
  • Base de datos (por defecto: SQLite): Postgres
  • Configuración de n8n EXECUTIONS_PROCESS (por defecto: own, main):
  • Ejecutar n8n a través de (Docker, npm, n8n cloud, aplicación de escritorio): synology docker
  • Sistema operativo: synology

@jmaver tu ejecución de CLI ya lo renovó, el segundo license:info ahora muestra isValid true (vence el 28 de junio). el estado de la licencia se almacena en la db, así que el certificado está fijo ahí pero tu proceso en ejecución aún tiene el caducado que cacheó al arrancar. reinicia el contenedor n8n, recarga el certificado válido de la db y registered + Debug in Editor vuelven. venció porque la licencia comunitaria tiene que alcanzar license.n8n.io/v1 para renovarse aproximadamente cada 10 días, así que asegúrate de que el tráfico saliente no esté siendo bloqueado por un proxy o firewall.

Por desgracia, no es así.

He reiniciado muchas veces. Cada arranque con la variable de entorno de activación muestra el mismo error, intentar añadir manualmente el código de licencia de activación sigue fallando, y todavía no puedo depurar en el Editor.

@jmaver sí, esto es un problema de incompatibilidad de huella digital del dispositivo. Tu certificado está vinculado a una huella digital, pero la instancia presenta una diferente en cada arranque, por lo que lo rechaza sin importar cuántos reinicios hagas. Por eso tampoco funciona license.cert. Primero elimina la variable de entorno N8N_LICENSE_ACTIVATION_KEY, porque mantenerla activa significa que en cada arranque se re-ejecuta la activación y se vuelve a encontrar con la incompatibilidad en lugar de solo cargar lo que está en la base de datos. Pero como el enlace en sí está roto, la verdadera solución es enviar un correo a help@n8n.io para que reinicien la clave. La clave de comunidad se ha consumido contra la huella digital anterior y solo ellos pueden liberarla para que se vuelva a vincular con tu instancia actual.

Hola @jmaver

Cuando ejecutas n8n license:info en el shell, probablemente lo estés ejecutando como un usuario (a menudo root o el usuario predeterminado de node) que tiene acceso completo a los identificadores del sistema utilizados para generar la huella digital. Sin embargo, el proceso principal de n8n —que maneja la interfaz web y la N8N_LICENSE_ACTIVATION_KEY— no logra resolver esa misma huella digital, enviando una cadena vacía o nula al servidor de licencias, lo que desencadena el error de validación “menos de 32 caracteres”.

Intenta asignar explícitamente un archivo machine-id al contenedor para garantizar que sea consistente y legible.

  1. Crea un archivo en tu host Synology (por ejemplo, en tu carpeta de configuración de n8n) llamado machine-id con una cadena hexadecimal aleatoria de 32 caracteres dentro.
  2. Añade un mapeo de volumen en la configuración de Docker/Container Manager:
    • Archivo/Carpeta: /volume1/docker/n8n/machine-id (ajusta a tu ruta) → Ruta de montaje: /etc/machine-id
  3. Reinicia el contenedor.

¿Te ayuda eso?

no, eso no parece haber hecho ninguna diferencia. Lo veo en /etc en el contenedor, pero nada al respecto en los registros y el mismo fallo de activación

Ejecuta el siguiente comando en el shell del contenedor

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

¿Qué muestra?

/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

Verifica tu N8N_ENCRYPTION_KEY. ¿Tiene exactamente 32 caracteres de largo?

Ejecuta este comando en la terminal de tu contenedor

ps aux | grep n8n

¿Qué muestra?

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

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

El detalle clave aquí es que la generación de huellas dactilares de n8n verifica tanto /etc/machine-id COMO /var/lib/dbus/machine-id - ya que esa segunda ruta falta en tu contenedor, el ID podría no resolverse correctamente incluso con la primera asignada.

Agrega un segundo montaje de volumen a tu docker-compose:

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

Si no tienes ese archivo en el host, créalo primero: cat /etc/machine-id | sudo tee /var/lib/dbus/machine-id. Luego reinicia el contenedor e intenta nuevamente la activación de licencia.

@jmaver la ruta machine-id es un callejón sin salida, tu CLI ya genera un fingerprint completo de 64 caracteres a partir de /etc/machine-id así que la resolución funciona bien, eso no es. el fingerprint vacío solo aparece en la solicitud de activación, ese es el verdadero bug, activate no está enviando el fingerprint que tu instancia claramente calcula. y tu license:info anterior renovó un certificado válido (isValid: true), así que la renovación funciona y solo la activación está rota, lo que significa que license:clear fue el movimiento equivocado, borró ese certificado bueno y te empujó al camino de activate roto. reintentar la activación o la clave env no ayudará ahora. la recuperación más fácil es restaurar la fila license.cert en la tabla settings desde una instantánea de base de datos tomada antes de la limpieza. sin instantánea, entonces este es un bug de activación limpio reproducible, envía ese resultado de license:info a help@n8n.io para que lo re-siembren contra tu fingerprint.

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

los mismos resultados. aquí está la versión de depuración del registro, aunque no parece que añada nada:


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

- 2026-06-22T19:29:18.137Z | info | [license SDK] Omitiendo renovación en inicialización: el certificado de licencia no está inicializado {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

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

- 2026-06-22T19:29:18.141Z | debug | Intentando activación de licencia {"file":"base-command.js","function":"initLicense"}

- 2026-06-22T19:29:18.335Z | warn | [license SDK] error en la activación de licencia: request/body/deviceFingerprint no debe tener menos de 32 caracteres {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.574Z | error | No se pudo activar la licencia {"error":{"name":"Error","message":"error en la activación de licencia: request/body/deviceFingerprint no debe tener menos de 32 caracteres","stack":"Error: error en la activación de licencia: request/body/deviceFingerprint no debe tener menos de 32 caracteres\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/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 correcto, ambos archivos están ahí ahora y aún falla, así que machine-id está completamente descartado. pero mira esa línea de depuración, el servidor se inicializa con deviceFingerprint “n8n-j…” que es corto, ese es el valor de menos de 32 caracteres que se rechaza, no el hash de 64 caracteres que tu CLI genera. así que el proceso en ejecución recibe una huella digital truncada de algún lugar en lugar de calcularla. ¿cuál es el nombre de host del contenedor, y hay alguna entrada N8N_LICENSE_* o relacionada con huella digital sobrante en tu compose/config de los intentos anteriores? ese string n8n-j corto casi con seguridad proviene de uno de esos.

Ejecuta esto en tu terminal

su - node -c "n8n license:info"

¿Qué muestra?

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

Aquí está mi 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:
# 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

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

# Reparar paquetes faltantes
N8N_REINSTALL_MISSING_PACKAGES: "true"

# Permitir que los nodos Code accedan a variables de entorno (tu preferencia)
N8N_BLOCK_ENV_ACCESS_IN_NODE: "false"

# Modo de cola desactivado
EXECUTIONS_MODE: regular
N8N_CONCURRENCY_PRODUCTION_LIMIT: 5

# Ejecutores de tareas externos (el broker reside aquí)
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"

# Telemetría / diagnósticos
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 datos
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

corrección a mi respuesta anterior, tenía mal el mecanismo, así que ignora la parte del hostname. la fingerprint de la licencia de n8n es el instanceId (del código fuente, deviceFingerprint: () => instanceId), no el hostname. tu CLI muestra un instanceId válido de 64 caracteres (a11f905a…), pero la solicitud de activación está siendo rechazada porque envía uno de menos de 32 caracteres, así que la ruta de activate no está reconociendo un instanceId válido aunque claramente existe.

no tengo una causa raíz verificada de por qué solo resulta corto en el flujo de activate. pero dado que tu anterior license:info ya renovó un certificado válido, la ruta más confiable es restaurar esa fila license.cert desde una snapshot de la base de datos tomada antes de que ejecutaras license:clear, o hacer que el soporte de n8n lo regenere, en lugar de hacer más cambios en machine-id u hostname.

Ok, gracias, les enviaré un email

Hola @jmaver, lo encontré en tu compose, tienes:

N8N_INSTANCE_ID: n8n-j

Eso son solo 5 caracteres. El SDK de licencias de n8n deriva el deviceFingerprint directamente del ID de instancia, y el servidor de licencias requiere un mínimo de 32 caracteres. Así que n8n-j es lo que se envía como fingerprint, que es exactamente por qué estás recibiendo el error “must NOT have fewer than 32 characters”.

Solución: O bien elimina N8N_INSTANCE_ID completamente (n8n generará automáticamente un UUID válido), o reemplázalo con un UUID apropiado:

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

Después de cambiar esto, elimina N8N_LICENSE_ACTIVATION_KEY temporalmente, reinicia, ejecuta n8n license:info para confirmar que el nuevo fingerprint tiene 64 caracteres, luego vuelve a agregar la clave de activación y reinicia una vez más.

Esto debería resolverlo sin necesidad de contactar con soporte.