n8n self-hosted com Docker na VPS

n8n é a plataforma de automação de workflows open-source mais poderosa do mercado, conecta centenas de serviços sem código, mas com a flexibilidade de JavaScript quando necessário. Self-hostear na VPS garante privacidade total dos seus dados de automação e elimina o custo recorrente do plano cloud.

docker-compose.yml completo para n8n

Stack completa com n8n, PostgreSQL e Redis para filas:

yaml
# docker-compose.yml
services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    environment:
      - N8N_HOST=n8n.seudominio.com.br
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.seudominio.com.br/
      - N8N_ENCRYPTION_KEY=chave-aleatoria-32-chars-aqui
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis
      - N8N_METRICS=true
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      - postgres
      - redis
    networks:
      - n8n_net

  postgres:
    image: postgres:16-alpine
    restart: always
    environment:
      POSTGRES_DB: n8n
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - n8n_net

  redis:
    image: redis:7-alpine
    restart: always
    networks:
      - n8n_net

networks:
  n8n_net:

volumes:
  n8n_data:
  postgres_data:

Configurar Nginx como proxy reverso

Expor o n8n com SSL via Nginx:

nginx
# /etc/nginx/conf.d/n8n.conf
server {
    listen 80;
    server_name n8n.seudominio.com.br;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name n8n.seudominio.com.br;

    ssl_certificate     /etc/letsencrypt/live/n8n.seudominio.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.seudominio.com.br/privkey.pem;

    client_max_body_size 50M;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300s;
    }
}

# Emitir certificado:
# sudo certbot --nginx -d n8n.seudominio.com.br

Variáveis de ambiente importantes

Configurações essenciais para produção:

bash
# .env — variáveis de ambiente para o docker-compose.yml
POSTGRES_PASSWORD=senha_postgres_forte_aqui

# Variáveis adicionais do n8n para produção:
# N8N_BASIC_AUTH_ACTIVE=true          # habilitar basic auth (legado)
# N8N_BASIC_AUTH_USER=admin
# N8N_BASIC_AUTH_PASSWORD=senha

# Para n8n >= 1.0 — autenticação nativa:
# N8N_USER_MANAGEMENT_JWT_SECRET=secret-aleatório
# Criar usuário admin via interface web na primeira inicialização

# Limites de execução:
# EXECUTIONS_TIMEOUT=3600             # timeout de 1h por execução
# EXECUTIONS_TIMEOUT_MAX=7200
# N8N_DEFAULT_LOCALE=pt_BR

# Configurar SMTP para emails do n8n:
# N8N_EMAIL_MODE=smtp
# N8N_SMTP_HOST=smtp.gmail.com
# N8N_SMTP_PORT=465
# N8N_SMTP_USER=seu@email.com
# N8N_SMTP_PASS=app_password

Backup e restauração do n8n

Estratégia de backup para dados e workflows do n8n:

bash
#!/bin/bash
# /opt/scripts/backup-n8n.sh

DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/var/backups/n8n"
mkdir -p "$BACKUP_DIR"

# 1. Backup do banco PostgreSQL
docker compose -f /opt/n8n/docker-compose.yml exec -T postgres \
  pg_dump -U n8n n8n | gzip > "$BACKUP_DIR/n8n_db_${DATE}.sql.gz"

# 2. Backup do volume n8n (credenciais, config)
docker run --rm \
  -v n8n_data:/data \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf "/backup/n8n_volume_${DATE}.tar.gz" /data

# 3. Upload para S3/B2
aws s3 cp "$BACKUP_DIR/" s3://meu-bucket/n8n/ --recursive \
  --exclude "*" --include "*${DATE}*"

# Limpar backups locais com mais de 7 dias
find "$BACKUP_DIR" -mtime +7 -delete

# Restaurar workflows via CLI do n8n:
# docker compose exec n8n n8n import:workflow --input=/workflows.json
# docker compose exec n8n n8n import:credentials --input=/credentials.json

Atualizar o n8n sem perder dados

Atualizar a versão do n8n com segurança:

bash
# 1. Fazer backup antes de atualizar (OBRIGATÓRIO)
/opt/scripts/backup-n8n.sh

# 2. Verificar notas de versão para breaking changes:
# https://docs.n8n.io/release-notes/

# 3. Atualizar a imagem e reiniciar
cd /opt/n8n
docker compose pull n8n
docker compose up -d n8n

# 4. Verificar se subiu corretamente
docker compose ps
docker compose logs n8n --tail=50

# 5. Testar alguns workflows críticos manualmente

# Reverter para versão anterior em caso de problema:
docker compose down n8n
# Editar docker-compose.yml: image: n8nio/n8n:1.x.x
docker compose up -d n8n

Não quer configurar manualmente?

Implante o n8n em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

n8n Cloud: zero manutenção, atualizações automáticas, suporte oficial, mas custo recorrente (~$20-50/mês) e dados nos servidores deles. Self-hosted: custo apenas da VPS (~$15-30/mês para uma VPS adequada), controle total dos dados, sem limites de execução além dos recursos do servidor. Para empresas com dados sensíveis ou volume alto de execuções: self-hosted é claramente vantajoso.

Para uso pessoal/pequeno time: 2 CPUs e 2 GB RAM são suficientes. Para produção com muitos workflows simultâneos: 4 CPUs e 4 GB RAM. O modo queue (com Redis) distribui execuções entre workers, você pode escalar adicionando containers n8n-worker separados para workflows pesados sem aumentar a VPS principal.

As credenciais (tokens, senhas de APIs) são criptografadas com AES-256 usando o N8N_ENCRYPTION_KEY antes de serem salvas no banco. Sem a chave correta, os dados são ilegíveis. Configure a chave no ambiente e nunca a compartilhe. Faça backup da chave junto com os dados.

O n8n cria URLs de webhook no formato https://n8n.seudominio.com.br/webhook/UUID. O Nginx deve estar configurado como proxy reverso com SSL para que esses webhooks sejam acessíveis pela internet. Certifique-se que WEBHOOK_URL e N8N_HOST estão configurados corretamente, caso contrário os links de webhook gerados serão incorretos.

docker compose up -d junto com restart: always já garante que os containers reiniciam automaticamente. Para garantir que o Docker inicia no boot: sudo systemctl enable docker. Para VPS que não usam systemd: adicione o comando docker compose up -d ao /etc/rc.local ou crie um serviço systemd para o compose.