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:
    Dica
    N8N_ENCRYPTION_KEY protege as credenciais armazenadas. Gere com: openssl rand -hex 16. Guarde em lugar seguro — sem ela, as credenciais existentes ficam ilegíveis após uma migração.

    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

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

    Não quer configurar manualmente? Implante o n8n em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.

    Perguntas frequentes