O que você precisa antes de começar
- Uma VPS com Ubuntu 22.04 ou 24.04 e acesso root. 2 GB de RAM bastam para começar; o guia oficial com o n8n Assistant pede 4 GB e 2 vCPU.
- Um domínio ou subdomínio, como
n8n.seudominio.com.br, com um registro A apontando para o IP da VPS. - As portas 80 e 443 liberadas no firewall, para o certificado HTTPS.
Passo 1: instale o Docker
Conecte na VPS por SSH (veja como conectar na sua VPS) e instale o Docker com o script oficial:
curl -fsSL https://get.docker.com | sh
docker compose version
O segundo comando confirma que o Docker Compose v2 veio junto. O n8n recomenda Docker para a maioria das instalações próprias.
Passo 2: crie a pasta e o arquivo .env
Crie uma pasta para o projeto e, dentro dela, o arquivo .env (por exemplo com mkdir ~/n8n && cd ~/n8n e nano .env). Cole as variáveis abaixo, trocando o domínio e a senha:
DOMINIO=n8n.seudominio.com.br
GENERIC_TIMEZONE=America/Sao_Paulo
POSTGRES_USER=n8n
POSTGRES_PASSWORD=troque-esta-senha
POSTGRES_DB=n8n
N8N_ENCRYPTION_KEY), senão as credenciais salvas não abrem.
Passo 3: o docker-compose.yml
Na mesma pasta, crie o docker-compose.yml. Ele sobe três serviços: o PostgreSQL, que o n8n recomenda para produção no lugar do SQLite padrão; o próprio n8n; e o Caddy, um servidor web que emite e renova o certificado HTTPS sozinho.
services:
postgres:
image: postgres:16
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
retries: 10
n8n:
image: n8nio/n8n
restart: always
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${DOMINIO}
N8N_PROTOCOL: https
WEBHOOK_URL: https://${DOMINIO}/
N8N_PROXY_HOPS: 1
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
TZ: ${GENERIC_TIMEZONE}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
caddy:
image: caddy:2
restart: always
ports:
- "80:80"
- "443:443"
command: caddy reverse-proxy --from ${DOMINIO} --to n8n:5678
volumes:
- caddy_data:/data
volumes:
db_data:
n8n_data:
caddy_data:
A porta 5678 do n8n não fica exposta na internet: todo acesso passa pelo Caddy, com HTTPS. O WEBHOOK_URL faz o n8n mostrar o endereço público nos webhooks, e o N8N_PROXY_HOPS avisa que há um proxy na frente.
Passo 4: suba tudo e crie o administrador
Com os dois arquivos na pasta, rode docker compose up -d. Em um ou dois minutos o Caddy emite o certificado e o n8n abre no seu domínio, pedindo para você criar a conta de administrador.
Para acompanhar, use docker compose ps e docker compose logs -f n8n.
Como atualizar o n8n sem perder nada
O n8n lança versão nova quase toda semana. No Docker, atualizar é baixar a imagem nova e recriar o contêiner: os workflows e as credenciais ficam nos volumes.
docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/backup.json e, se puder, tire um snapshot da VPS.docker compose pull.docker compose down e depois docker compose up -d.Problemas comuns
| Sintoma | Causa provável |
|---|---|
| Webhook mostra endereço localhost | WEBHOOK_URL ausente ou errada |
| Certificado HTTPS não sai | o domínio ainda não aponta para o IP ou as portas 80 e 443 estão fechadas |
| Credenciais não abrem depois de migrar | chave de criptografia diferente da original |
| Agendamentos no horário errado | GENERIC_TIMEZONE não definido |