n8n/Artigo

    Como conectar o n8n ao PostgreSQL em produção

    O n8n usa SQLite por padrão — funciona para testes, mas SQLite não suporta múltiplas conexões simultâneas e trava quando workflows paralelos tentam gravar ao mesmo tempo. Para produção, configure PostgreSQL: ele suporta concorrência, permite backup com pg_dump e não bloqueia execuções paralelas.

    Por que mudar de SQLite para PostgreSQL

    O SQLite usa lock de arquivo — quando dois workflows tentam gravar ao mesmo tempo, um deles aguarda o outro terminar. Em ambientes com muitas execuções simultâneas, isso gera fila e timeout. PostgreSQL usa lock de linha, suporta centenas de conexões concorrentes e é o banco recomendado pela documentação do n8n para produção.

    Dica
    Se você executa menos de 20 workflows simultâneos e não tem picos de carga, SQLite pode ser suficiente. A migração para PostgreSQL é necessária quando os logs mostram database is locked ou quando os workflows começam a falhar por timeout de banco.

    docker-compose.yml completo: n8n + PostgreSQL

    A configuração abaixo inclui o PostgreSQL com healthcheck, o n8n aguardando o banco estar pronto e as variáveis obrigatórias para conexão:

    yaml
    services:
      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
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U n8n"]
          interval: 5s
          timeout: 5s
          retries: 5
    
      n8n:
        image: n8nio/n8n:latest
        restart: always
        ports:
          - "5678:5678"
        depends_on:
          postgres:
            condition: service_healthy
        environment:
          # Banco de dados
          - DB_TYPE=postgresdb
          - DB_POSTGRESDB_HOST=postgres
          - DB_POSTGRESDB_PORT=5432
          - DB_POSTGRESDB_DATABASE=n8n
          - DB_POSTGRESDB_USER=n8n
          - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
          # Segurança
          - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
          # Webhook (necessário se usar domínio)
          - WEBHOOK_URL=https://n8n.seudominio.com.br/
        volumes:
          - n8n_data:/home/node/.n8n
    
    volumes:
      postgres_data:
      n8n_data:
    Atenção
    Use um arquivo .env para as senhas — nunca coloque valores reais diretamente no docker-compose.yml se o repositório for compartilhado. Crie um .env com POSTGRES_PASSWORD e N8N_ENCRYPTION_KEY.

    Criar o arquivo .env com as credenciais

    Gere uma chave de encriptação aleatória e defina a senha do banco no arquivo .env na mesma pasta do docker-compose.yml:

    bash
    # Gerar chave de encriptação segura (32 bytes em base64)
    openssl rand -base64 32
    
    # Criar o arquivo .env
    cat > .env <<EOF
    POSTGRES_PASSWORD=sua_senha_segura_aqui
    N8N_ENCRYPTION_KEY=chave_gerada_acima
    EOF
    
    chmod 600 .env
    Dica
    N8N_ENCRYPTION_KEY encripta as credenciais de APIs armazenadas no n8n. Se você perder essa chave ou mudá-la, as credenciais existentes ficam inacessíveis.

    Migrar dados existentes do SQLite para PostgreSQL

    Se você já tem workflows no n8n com SQLite e quer migrar para PostgreSQL sem perder dados, use a função de export/import nativa do n8n:

    bash
    # 1. Exportar workflows e credenciais do n8n atual (SQLite)
    docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows.json
    docker compose exec n8n n8n export:credentials --all --output=/home/node/.n8n/credentials.json
    
    # 2. Copiar os arquivos para o host
    docker compose cp n8n:/home/node/.n8n/workflows.json ./
    docker compose cp n8n:/home/node/.n8n/credentials.json ./
    
    # 3. Subir o novo stack com PostgreSQL configurado
    # (edite o docker-compose.yml, depois:)
    docker compose down
    docker compose up -d
    
    # 4. Importar os dados no novo n8n com PostgreSQL
    docker compose cp workflows.json n8n:/home/node/.n8n/
    docker compose cp credentials.json n8n:/home/node/.n8n/
    docker compose exec n8n n8n import:workflow --input=/home/node/.n8n/workflows.json
    docker compose exec n8n n8n import:credentials --input=/home/node/.n8n/credentials.json
    Atenção
    As credenciais exportadas são encriptadas com a N8N_ENCRYPTION_KEY atual. Use a mesma chave no novo setup para que as credenciais sejam importadas corretamente.

    Verificar a conexão e monitorar o banco

    Após subir o stack, confirme que o n8n está usando PostgreSQL e monitore as conexões abertas:

    bash
    # Ver logs do n8n na inicialização (deve mencionar PostgreSQL)
    docker compose logs n8n --tail=30
    
    # Verificar conexões abertas no PostgreSQL
    docker compose exec postgres   psql -U n8n -d n8n -c "SELECT count(*) FROM pg_stat_activity WHERE datname='n8n';"
    Dica
    O n8n abre tipicamente 2–5 conexões no PostgreSQL em idle. Em carga, pode chegar a 10–20 conexões. Se precisar de muitas conexões simultâneas, adicione PgBouncer como connection pooler.

    $ 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

    Conteúdos relacionados

    [VERIFICAR antes de publicar]

    • 1. Confirme o nome das variáveis DB_POSTGRESDB_* na versão atual do n8n em docs.n8n.io/hosting/configuration/environment-variables.
    • 2. Confirme que o comando n8n export:workflow --all ainda é válido — pode ter mudado em versões recentes.
    • 3. Confirme que N8N_ENCRYPTION_KEY ainda é o nome correto da variável de encriptação.