Um arquivo do Docker Compose sobe o n8n com Postgres e HTTPS automático pelo Caddy.
- Aponte o domínio para a máquina antes de subir.
- Defina a chave de criptografia e guarde uma cópia fora da máquina.
- Informe ao n8n o endereço público dos webhooks.
O SQLite, banco padrão do n8n, serve para testar. Para fluxos que rodam o dia inteiro, a documentação do n8n indica o Postgres, que é o banco do arquivo abaixo. Na frente fica o Caddy, que emite e renova o certificado HTTPS sozinho.
Antes de subir
Com o Docker e o Compose instalados, aponte o subdomínio, como n8n.seudominio.com.br, para o IP da máquina no DNS e deixe as portas 80 e 443 abertas. O Caddy usa as duas para conseguir o certificado, como mostra o guia do Caddy.
Crie um .env com POSTGRES_PASSWORD e N8N_ENCRYPTION_KEY, gerados com openssl rand -hex 32, e guarde uma cópia fora da máquina: é com a chave de criptografia que o n8n lê as credenciais salvas no banco.
O arquivo compose.yaml
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=n8n
volumes:
- db_data:/var/lib/postgresql/data
n8n:
image: n8nio/n8n
restart: unless-stopped
depends_on:
- postgres
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_WEBHOOK_URL=https://n8n.seudominio.com.br/
- N8N_PROXY_HOPS=1
- GENERIC_TIMEZONE=America/Sao_Paulo
volumes:
- n8n_data:/home/node/.n8n
caddy:
image: caddy:2
restart: unless-stopped
command: caddy reverse-proxy --from n8n.seudominio.com.br --to n8n:5678
ports:
- "80:80"
- "443:443"
volumes:
- caddy_data:/data
volumes:
db_data:
n8n_data:
caddy_data:
Troque n8n.seudominio.com.br pelo seu subdomínio nas duas linhas. Só o Caddy publica portas, então o n8n e o Postgres não ficam expostos à internet. O GENERIC_TIMEZONE acerta o horário dos gatilhos de agenda.
Subir e conferir
Rode docker compose up -d, abra o endereço no navegador e crie a conta de dono. Num fluxo de teste, o nó Webhook deve mostrar uma URL com https:// e o seu domínio.
Se aparecer localhost:5678, faltou o N8N_WEBHOOK_URL: atrás do Caddy, o n8n não sabe sozinho o endereço público. A documentação do n8n para proxy reverso pede essa variável junto com o N8N_PROXY_HOPS=1.
Depois do primeiro dia
Para atualizar, rode docker compose pull e depois docker compose up -d. Os dados ficam nos volumes, então não use docker compose down -v, que apaga os volumes. Quando os fluxos começarem a atrasar, veja como medir o n8n antes de trocar de máquina; se a carga crescer, o mesmo arquivo ganha Redis e workers no modo fila. Se ainda falta a máquina, veja as configurações da MetalNode.



