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:
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:
# 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 .envMigrar 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:
# 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.jsonVerificar 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:
# 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';"$ 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.