Falha na ativação da licença no n8n auto-hospedado

Descreva o problema/erro/pergunta

Estou tendo dificuldade para ativar minha licença Registered Community em uma instância auto-hospedada. Ao tentar ativar pela interface web ou usando a variável de ambiente, a ativação falha com um erro de validação relacionado à impressão digital do dispositivo.

No entanto, ao executar a ferramenta CLI dentro do contêiner, vejo que uma impressão digital válida está sendo gerada. Parece haver uma discrepância onde o processo web em background/SDK está passando uma string de impressão digital vazia ou truncada aos seus servidores de licenciamento.

Quando acesso o terminal do contêiner pela primeira vez e executo manualmente n8n license:info, uma impressão digital completa e válida de 64 caracteres é gerada com sucesso e visível:

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

Histórico

  1. Não consegui fazer o Debug no Editor funcionar - dizia que eu precisava estar registrado. Eu já deveria estar. Estive no passado - não faço ideia por que isso mudou.

  2. Vi isto nos meus logs:
    [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. Tenho TZ=America/New_York e uma chave N8N_ENCRYPTION_KEY de 32 bits que não mudou. A chave de criptografia está tanto no ambiente quanto no arquivo .n8n/config

  4. Executei isto e 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. Quando tento clicar no botão no email de ativação ou colo, recebo a mesma coisa:
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. Fiz n8n license:clear e depois reiniciei. Agora recebo isto no log:
    [license SDK] Skipping renewal on init: license cert is not initialized

e isto é o que recebo no 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. Tentei usar o IP da LAN em vez da URL do Cloudflare - http://192.168.200.12:5678/settings/usage?key=03329154-96a6-4bac-89f0-xxxxxxxxxxxx . Dá os mesmos erros

  2. Isto costumava funcionar bem nesta imagem docker (builds anteriores meses atrás).

  3. Também tentei passar a chave diretamente para o contêiner via N8N_LICENSE_ACTIVATION_KEY, o que resultou na mesma falha no log.

Usei 3 IAs diferentes para ajudar a corrigir isto e estamos todos sem ideias :slight_smile:

o que posso fazer?

Qual é a mensagem de erro (se houver)?

Ao tentar ativar pela UI ou usando N8N_LICENSE_ACTIVATION_KEY, os logs do contêiner mostram:
[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

Informações sobre sua configuração de n8n

  • Versão n8n: 2.26.7 (também ocorre com versões anteriores)
  • Banco de dados (padrão: SQLite): Postgres
  • Configuração N8N_EXECUTIONS_PROCESS (padrão: own, main):
  • Executando n8n via (Docker, npm, n8n cloud, aplicativo de desktop): synology docker
  • Sistema operacional: synology

@jmaver sua execução CLI já renovou isso, o segundo license:info agora mostra isValid true (expira 28 de jun). o estado da licença está armazenado no db, então o cert está corrigido lá, mas seu processo em execução ainda está mantendo o expirado que foi cacheado no boot. reinicie o container n8n, ele recarrega o cert válido do db e registered + Debug in Editor voltam. expirou porque a licença community tem que alcançar license.n8n.io/v1 para renovar aproximadamente a cada 10 dias, então certifique-se de que o outbound não está sendo bloqueado por um proxy ou firewall.

Infelizmente, não é.

Já reiniciei várias vezes. Toda inicialização com a variável de ambiente de ativação mostra o mesmo erro, tentar adicionar manualmente o código de licença de ativação ainda falha e ainda não consigo fazer Debug no Editor.

@jmaver yeah isso é o problema de incompatibilidade de impressão digital do dispositivo, seu certificado está vinculado a uma impressão digital, mas a instância apresenta uma diferente a cada inicialização, então continua rejeitando não importa quantas vezes você reinicie, e é por isso também que license.cert não será mantido. remova primeiro a variável de ambiente N8N_LICENSE_ACTIVATION_KEY, deixá-la significa que a cada inicialização re-executa a ativação e re-acessa a incompatibilidade em vez de apenas carregar o que está no db. mas já que a própria vinculação está quebrada, a verdadeira solução é enviar um e-mail para help@n8n.io para redefinir a chave, a chave comunitária é consumida contra a impressão digital antiga e apenas eles podem liberá-la para que se revinculem à sua instância atual.

Oi @jmaver

Quando você executa n8n license:info no shell, provavelmente está sendo executado como um usuário (geralmente root ou o usuário padrão do node) que tem acesso total aos identificadores do sistema usados para gerar a impressão digital. No entanto, o processo principal do n8n—que manipula a Web UI e a N8N_LICENSE_ACTIVATION_KEY—está falhando ao resolver essa mesma impressão digital, enviando uma string vazia ou null para o servidor de licenciamento, o que dispara o erro de validação “menos de 32 caracteres”.

Tente mapear explicitamente um arquivo machine-id no container para garantir que seja consistente e legível.

  1. Crie um arquivo no seu host Synology (por exemplo, na sua pasta de configuração do n8n) chamado machine-id com uma string hexadecimal aleatória de 32 caracteres dentro dele.
  2. Adicione um mapeamento de volume nas configurações do seu Docker/Container Manager:
    • Arquivo/Pasta: /volume1/docker/n8n/machine-id (ajuste para seu caminho) → Caminho de montagem: /etc/machine-id
  3. Reinicie o container.

Isso ajuda?

não, isso não parece ter feito diferença. Vejo isso em /etc no container, mas nada sobre isso nos logs e a mesma falha de ativação

Execute o seguinte comando no shell do contêiner

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

O que ele mostra?

/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: Arquivo ou diretório não encontrado

Verifique sua N8N_ENCRYPTION_KEY. Ela tem exatamente 32 caracteres?

Execute este comando no terminal do seu container

ps aux | grep n8n

O que ele mostra?

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

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

O detalhe chave aqui é que a geração de fingerprint do n8n verifica tanto /etc/machine-id QUANTO /var/lib/dbus/machine-id - como esse segundo caminho está faltando no seu contêiner, o ID pode ainda não resolver corretamente mesmo com o primeiro mapeado.

Adicione um segundo volume mount ao seu docker-compose:

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

Se você não tiver esse arquivo no host, crie-o primeiro: cat /etc/machine-id | sudo tee /var/lib/dbus/machine-id. Depois reinicie o contêiner e tente novamente a ativação da licença.

@jmaver o caminho machine-id é um beco sem saída, seu CLI já constrói um fingerprint completo de 64 caracteres a partir de /etc/machine-id, então a resolução funciona corretamente, não é isso. o fingerprint vazio só aparece na solicitação de ativação, esse é o bug real, activate não está enviando o fingerprint que sua instância claramente calcula. e seu license:info anterior renovou um certificado válido (isValid: true), então a renovação funciona e apenas a ativação está quebrada, o que significa que license:clear foi a ação errada, ela apagou esse bom certificado e o empurrou para o caminho activate quebrado. retentar a ativação ou a chave env não ajudará agora. a recuperação mais fácil é restaurar a linha license.cert na tabela settings a partir de um snapshot do banco de dados obtido antes do clear. sem snapshot, então este é um bug de ativação reproduzível e limpo, envie esse output de license:info para help@n8n.io para que eles o re-seed contra seu 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

mesmos resultados. aqui está a versão de debug do log, não que pareça adicionar 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] Pulando renovação na inicialização: certificado de licença não foi inicializado {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

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

- 2026-06-22T19:29:18.141Z | debug | Tentando ativar licença {"file":"base-command.js","function":"initLicense"}

- 2026-06-22T19:29:18.335Z | warn | [license SDK] falha na ativação da licença: request/body/deviceFingerprint deve ter no mínimo 32 caracteres {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.574Z | error | Não foi possível ativar a licença {"error":{"name":"Error","message":"falha na ativação da licença: request/body/deviceFingerprint deve ter no mínimo 32 caracteres","stack":"Error: falha na ativação da licença: request/body/deviceFingerprint deve ter no mínimo 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_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 certo, ambos os arquivos estão presentes agora e mesmo assim falha, então machine-id está completamente descartado. mas veja aquela linha de debug, o servidor inicia com deviceFingerprint “n8n-j…” que é curto, esse é o valor com menos de 32 caracteres sendo rejeitado, não o hash de 64 caracteres que sua CLI constrói. então o processo em execução está recebendo uma impressão digital truncada de algum lugar em vez de computá-la. qual é o hostname do container, e há entradas N8N_LICENSE_* ou relacionadas a fingerprint restantes na sua compose/config das tentativas anteriores? aquela string n8n-j curta quase certamente está vindo de uma delas.

Execute isto no seu terminal

su - node -c "n8n license:info"

O que ele mostra?

sudo docker exec -it n8n n8n license:info

## CONFIGURAÇÃO DO CONSUMIDOR ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## CERTIFICADO DE LICENÇA ##
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

Aqui está meu 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:
# URLs públicas / configuração base
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

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

# corrigir pacotes ausentes
N8N_REINSTALL_MISSING_PACKAGES: "true"

# Permitir que nós de código acessem variáveis de ambiente (sua preferência)
N8N_BLOCK_ENV_ACCESS_IN_NODE: "false"

# Modo de fila desativado
EXECUTIONS_MODE: regular
N8N_CONCURRENCY_PRODUCTION_LIMIT: 5

# Executores de tarefas externos (o broker fica aqui)
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"

# Telemetria / 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"

# Banco de dados
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

correção da minha resposta anterior, eu tinha o mecanismo errado então ignore a parte do hostname. o fingerprint de licença do n8n é o instanceId (do source, deviceFingerprint: () => instanceId), não o hostname. seu CLI mostra um instanceId válido de 64 caracteres (a11f905a…), mas a solicitação de ativação está sendo rejeitada por enviar um com menos de 32 caracteres, então o caminho de ativação não está pegando um instanceId válido mesmo que um claramente exista.

não tenho uma causa raiz verificada para por que ele apenas aparece curto no fluxo de ativação. mas já que seu license:info anterior já renovou um certificado válido, o caminho mais confiável é restaurar aquela linha license.cert de um snapshot de banco de dados tirado antes de você rodar license:clear, ou ter o suporte do n8n semear novamente, em vez de mais mudanças de machine-id ou hostname.

ok, obrigado - vou enviar um email para eles

Opa @jmaver, encontrei no seu compose, você tem:

N8N_INSTANCE_ID: n8n-j

Isso tem apenas 5 caracteres. O SDK de licença do n8n deriva o deviceFingerprint diretamente do ID da instância, e o servidor de licenciamento requer um mínimo de 32 caracteres. Então n8n-j é o que está sendo enviado como fingerprint, o que é exatamente por que você está recebendo o erro “must NOT have fewer than 32 characters”.

Solução: Ou remova N8N_INSTANCE_ID completamente (n8n vai gerar automaticamente um UUID válido), ou substitua-o por um UUID apropriado:

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

Depois de mudar, remova N8N_LICENSE_ACTIVATION_KEY temporariamente, reinicie, execute n8n license:info para confirmar que o novo fingerprint tem 64 caracteres, depois adicione a chave de ativação novamente e reinicie mais uma vez.

Isso deve resolver o problema sem precisar entrar em contato com o suporte.