"Conexão perdida com o servidor" no editor + erro WebSocket "Invalid origin" atrás do reverse proxy Plesk

Oi pessoal,

Estou rodando n8n self-hosted via Docker Compose atrás do Plesk (Ubuntu 20.04,
Plesk Obsidian 18.0.78), com nginx como proxy reverso na frente do Docker.

Configuração:

  • Imagem oficial do n8n no Docker (n8nio/n8n)
  • Proxy reverso: nginx do Plesk (fazendo proxy para Apache, depois para o container
    Docker na porta 5678)
  • Domínio: subdomínio com SSL próprio (Let’s Encrypt via Plesk)

Variáveis de ambiente já configuradas:
N8N_HOST=bot.publicides.com
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://bot.publicides.com/
N8N_SECURE_COOKIE=false
N8N_TRUST_PROXY=true
N8N_PROXY_HOPS=2
N8N_PUSH_BACKEND=sse
N8N_EDITOR_BASE_URL=https://bot.publicides.com/

Diretivas adicionais do Nginx já adicionadas:
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_set_header Host $host;
proxy_pass_request_headers on;

Problema:
Qualquer ação no editor ao vivo (Executar nós anteriores, Testar este trigger, até
apenasabrir a aba Execuções) falha com “Problema ao executar workflow —
Conexão perdida com o servidor” na interface.

Os logs do Docker mostram este erro se repetindo:

Origin header does NOT match the expected origin. (Origin: “undefined”
-\ “N/A”, Expected: “undefined” -\ “undefined”, Protocol: “undefined”)
ResponseError: Invalid origin!
at Push.handleRequest (/usr/local/lib/node_modules/n8n/src/push/index.ts:157:10)
at /usr/local/lib/node_modules/n8n/src/push/index.ts:112:17
at Layer.handleRequest (…router/lib/layer.js:152:17)

at /usr/local/lib/node_modules/n8n/src/auth/auth.service.ts:158:18

O que já descarteei:

  • Os recursos do servidor estão bem (RAM ~72% usada mas com bastante margem, CPU
    baixa, uso de disco baixo)
  • Não é problema de navegador/cache — mesmo erro em modo incógnito, navegador
    diferente, dispositivo diferente e dados móveis em vez de WiFi
  • O container do Docker está ativo e saudável (docker ps confirma “Up”)
  • Webhooks funcionam perfeitamente — um POST curl manual para a URL do webhook de
    produção retorna {“message”:“Webhook call received”} e o workflow executa
    corretamente de ponta a ponta (confirmado pela Planilha Google de destino sendo
    atualizada)
  • O domínio NÃO é proxied através do Cloudflare (DNS apenas / nuvem cinzenta)

Portanto, a execução do workflow via webhook funciona perfeitamente — apenas a
conexão push de WebSocket/SSE do editor ao vivo falha, aparentemente rejeitada
por uma incompatibilidade de header Origin em algum lugar entre o nginx e o
serviço de autenticação do n8n.

Alguém já enfrentou este erro específico de “Invalid origin” em push com a
configuraçãonginx do Plesk? Existe uma variável env adicional ou diretiva nginx
necessária para encaminhar/definir corretamente o header Origin para o endpoint
de push?

Obrigado antecipadamente!

Oi @Alcides_Home_360_Bel, bem-vindo!
n8n 1.87+ adicionou uma verificação rigorosa de Origin no endpoint de push (/rest/push), e seu log mostrando Origin, Expected e Protocol todos como “undefined” significa que o cabeçalho Origin está sendo removido antes de chegar ao n8n, então a verificação rejeita a conexão push enquanto webhooks, que não têm essa verificação, continuam funcionando. Alternâncias de ambiente como N8N_DISABLE_ORIGIN_CHECK são amplamente relatadas como não funcionando uma vez que o cabeçalho já se foi, então a solução real é injetar o cabeçalho Origin, com o esquema, no salto de proxy mais próximo do n8n.
Em sua cadeia Plesk esse salto é Apache, não o nginx frontal. Outro usuário do Plesk definiu Origin apenas nas diretivas nginx e ainda viu “Origin: undefined” porque a camada Apache no meio remove. Então defina nas diretivas Apache (Websites & Domains, Apache & nginx Settings, Additional Apache directives) com mod_headers:
Veja isto:

Use https://bot.publicides.com como o valor, e adicione também RequestHeader set X-Forwarded-Proto "https", já que seu log mostra Protocol undefined também. Manter N8N_PUSH_BACKEND=sse funciona bem; a verificação se aplica a SSE e WebSocket igualmente, então SSE sozinho não a ignora.
Se você preferir não tocar no Apache, desmarque “Proxy mode” nas mesmas Apache & nginx Settings para que nginx faça proxy direto para o container, então seu bloco nginx existente mais proxy_set_header Origin https://bot.publicides.com; chega diretamente ao n8n.