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.

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:

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

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

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';"

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

Sim. Configure DB_POSTGRESDB_HOST com o IP ou hostname do PostgreSQL existente e crie um banco e usuário dedicados para o n8n. Garanta que o usuário tenha permissões de CREATE TABLE no banco do n8n, o próprio n8n cria as tabelas na primeira inicialização.

Verifique as variáveis de ambiente do container: docker inspect <nome-do-container> | grep DB_TYPE. Se DB_TYPE não aparecer, o n8n está usando SQLite. Nos logs da inicialização, o n8n também menciona o banco conectado.

Em idle, o n8n mantém 2–5 conexões. Em carga com muitos workflows paralelos, pode abrir 10–20 conexões. O PostgreSQL 16 suporta 100 conexões por padrão (max_connections=100). Para mais, aumente max_connections no postgresql.conf ou adicione PgBouncer.

Não necessariamente. Se você tem menos de 20 execuções simultâneas e workflows que não gravam dados pesados, o SQLite padrão funciona bem. A mudança para PostgreSQL é necessária quando aparece o erro database is locked ou quando o volume de execuções paralelas cresce.

Use pg_dump: docker compose exec postgres pg_dump -U n8n -d n8n > backup.sql. Para automação com cron, veja o artigo de backup do n8n que cobre o script completo com retenção de 7 dias.