Início › Guias › n8n-self-hosted
Guia

Como rodar n8n em Docker Compose com Postgres e HTTPS (sem dor de cabeça)

Atualizado em 2026-09-24 · por Redação Automação Hoje
Profissional configurando n8n em Docker Compose com Postgres e HTTPS em um notebook
Resposta rápida: Para rodar o n8n em Docker Compose com Postgres e HTTPS, você precisa: volumes persistentes (n8n e Postgres), variáveis corretas de URL (N8N_HOST/WEBHOOK_URL), proxy reverso com TLS (Traefik/Nginx) e uma porta pública acessível para webhooks. O resto é disciplina: logs, backup e atualização controlada.
· espaço publicitário ·
Em resumo
  • Use Postgres em produção; SQLite é só para testes rápidos
  • Persistência é obrigatória: volume do /home/node/.n8n e do /var/lib/postgresql/data
  • HTTPS muda tudo: configure WEBHOOK_URL e N8N_HOST para evitar links errados
  • Se webhooks falham, quase sempre é DNS/porta/URL externa ou header do proxy
  • Backups simples (dump do Postgres + volume do n8n) já evitam tragédia
  1. 1) Prepare domínio, DNS e portas

    Aponte um subdomínio (ex.: n8n.seudominio.com.br) para o IP do seu servidor. Garanta que as portas 80 e 443 estejam liberadas (firewall e provedor). Se você não puder expor 443, webhooks vão virar loteria — dá para contornar com túnel, mas aí foge do “padrão robusto”.

  2. 2) Escolha o modelo de HTTPS (Traefik ou Nginx)

    Traefik é prático em Docker (descobre containers por labels e emite TLS automaticamente). Nginx funciona muito bem também, mas exige mais arquivo de configuração. O importante: o n8n deve receber os headers corretos (X-Forwarded-Proto/Host) para gerar URLs externas certinhas.

  3. 3) Crie um docker-compose.yml com n8n + Postgres

    Suba dois serviços: postgres e n8n. Configure POSTGRES_USER/POSTGRES_PASSWORD/POSTGRES_DB, a string de conexão do n8n e volumes persistentes. Em produção, fixe versões de imagem (não use “latest” sem teste).

  4. 4) Configure variáveis que impactam webhooks e links

    Defina N8N_HOST como seu domínio, N8N_PORT como a porta interna (normalmente 5678), N8N_PROTOCOL como https e WEBHOOK_URL como a URL pública completa (https://...). Isso evita que o n8n gere webhook com http, hostname interno ou porta errada.

  5. 5) Suba, valide e só então conecte integrações

    Rode docker compose up -d, verifique logs e acesse a interface via HTTPS. Antes de sair criando automações, valide um webhook simples (um workflow com Webhook Trigger e resposta). Se falhar, corrija rede/URL/proxy primeiro — depois tudo flui.

  6. 6) Faça backup e ajuste retenção de logs

    Combine dump do Postgres (diário) com backup do volume do n8n (onde ficam chaves, credenciais criptografadas e configs). Sobre logs: mantenha o suficiente para depurar (dias/semanas, depende do seu volume), mas sem explodir disco.

Estrutura recomendada (o que precisa existir para dar certo)

O n8n self-hosted “funciona” de muitos jeitos, mas só fica confiável quando você fecha quatro pontos: banco decente (Postgres), persistência real (volumes), URL externa coerente (WEBHOOK_URL/N8N_HOST) e um proxy reverso bem configurado.

Se você já sofreu com webhook que “às vezes chega, às vezes não”, a causa costuma ser uma combinação de URL externa errada, SSL mal resolvido ou portas bloqueadas.

  • Domínio apontando para o servidor (DNS A/AAAA).
  • Portas 80/443 acessíveis de fora (ou alternativa equivalente).
  • Proxy reverso com certificado TLS válido.
  • Postgres com volume persistente.
  • n8n com volume persistente e variáveis de URL ajustadas.

Tabela rápida: variáveis que mais derrubam webhooks

Você pode ter o Compose “em pé” e mesmo assim quebrar a parte mais importante: receber eventos. A tabela abaixo cobre o que eu mais vejo dar errado quando a URL pública não bate com o que o n8n anuncia para o mundo.

Variável/ConfigPara quê serveSinal clássico de erro
WEBHOOK_URLURL pública base usada nos webhooksIntegração reclama de callback inválido ou aponta para http/porta estranha
N8N_HOST / N8N_PROTOCOLHost/protocolo usados em links e callbacksLinks internos gerados com domínio interno do container ou sem https
Proxy headers (X-Forwarded-Proto/Host)Faz o app entender que está atrás de HTTPSLoop de redirect, mistura de http/https, sessão instável
Persistência do volume do n8nMantém chaves, configs e credenciaisA cada restart “some” configuração, login, credenciais ou tokens
Persistência do PostgresMantém dados do bancoWorkflows/execuções desaparecem após recriar containers

Traefik vs Nginx: como escolher sem brigar com o futuro

Se seu n8n vai conviver com outros serviços em Docker (ex.: um banco, um app interno, um painel), Traefik costuma encaixar melhor pelo modelo de discovery por labels.

Nginx é ótimo quando você quer controle manual e já tem um padrão de configuração na empresa. O “melhor” é o que sua operação consegue manter: renovação de certificado, mudanças de rota e debug de header.

  • Escolha Traefik se: você quer menos arquivo e mais automação no proxy, e vai hospedar vários containers.
  • Escolha Nginx se: sua equipe já padronizou Nginx e prefere configurar tudo explicitamente.
  • Independentemente do proxy: confirme que o n8n está enxergando https na ponta (via headers).

Checklist de produção (antes de declarar vitória)

O n8n é fácil de subir e fácil de quebrar com pequenos detalhes. Eu costumo validar com este checklist — porque depois que você liga integrações (pagamento, CRM, WhatsApp, e-commerce), retrabalho custa caro.

  • Acesso por HTTPS sem aviso de certificado.
  • Workflow de Webhook Trigger responde 200 para uma requisição externa.
  • Reiniciar containers NÃO apaga credenciais e configs (teste na prática).
  • Disco com folga (logs e execuções crescem; o quanto depende do seu uso).
  • Backup testado: você consegue restaurar em outro servidor (ensaio rápido).

Perguntas frequentes

Preciso mesmo de Postgres ou dá para usar SQLite?
Dá para usar SQLite para teste e PoC, mas em produção Postgres é o caminho mais seguro. SQLite é arquivo único: funciona, mas tende a sofrer mais com concorrência, crescimento de dados e cenários de recuperação. Se você está pensando em webhooks e operação contínua, Postgres reduz a chance de dor de cabeça.
Por que meus webhooks do n8n ficam com URL errada (http ou hostname interno)?
Quase sempre é falta (ou erro) em WEBHOOK_URL/N8N_HOST/N8N_PROTOCOL, ou o proxy reverso não está repassando headers como X-Forwarded-Proto e X-Forwarded-Host. O n8n precisa saber qual é a URL pública real para gerar callbacks corretos.
Posso colocar o n8n atrás de Cloudflare?
Pode, e costuma funcionar bem, desde que você mantenha o HTTPS consistente e não quebre WebSocket/headers se estiver usando recursos que dependem disso. O ponto é o mesmo: a URL pública deve bater com o que o n8n anuncia (e o proxy deve repassar os headers corretos).
O que eu devo backup: banco, volume do n8n ou os dois?
Os dois. O Postgres guarda dados de workflows, execuções e configurações; o volume do n8n guarda arquivos e informações essenciais (incluindo material relacionado a credenciais/instalação). Um sem o outro pode até subir o sistema, mas você descobre o prejuízo quando tenta recuperar credenciais e integrações.

Leia também