Configuração de Database
Este documento explica como configurar banco de dados para n8n em ambiente de produção, abordando escolha entre PostgreSQL e MySQL, configuração de conexões, otimização de performance, backup e recovery, migrações entre versões, e estratégias de escalabilidade que garantem armazenamento confiável e eficiente de workflows, execuções, e credenciais em implementações empresariais robustas.
Configuração PostgreSQL
Configuração Básica
-- Criar usuário e banco
CREATE USER n8n WITH PASSWORD 'SUA_SENHA_SEGURA_AQUI';
CREATE DATABASE n8n OWNER n8n;
GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n;
Configuração de Logs
-- Configuração de logs
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
Índices Recomendados
-- Índices para melhorar performance
CREATE INDEX idx_executions_workflow_id ON executions(workflow_id);
CREATE INDEX idx_executions_started_at ON executions(started_at);
CREATE INDEX idx_executions_finished_at ON executions(finished_at);
CREATE INDEX idx_executions_status ON executions(status);
-- Índice para busca por texto
CREATE INDEX idx_workflows_name ON workflows USING gin(to_tsvector('portuguese', name));
Configurações de Performance
-- Configurar estatísticas
ALTER DATABASE n8n SET default_statistics_target = 100;
ALTER DATABASE n8n SET random_page_cost = 1.1;
ALTER DATABASE n8n SET effective_io_concurrency = 200;
-- Vacuum e analyze
VACUUM ANALYZE;
Configuração MySQL
Configuração Básica
-- Criar usuário e banco
CREATE USER 'n8n'@'localhost' IDENTIFIED BY 'SUA_SENHA_SEGURA_AQUI';
GRANT ALL PRIVILEGES ON n8n.* TO 'n8n'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Índices Recomendados
-- Índices para melhorar performance
CREATE INDEX idx_executions_workflow_id ON executions(workflow_id);
CREATE INDEX idx_executions_started_at ON executions(started_at);
CREATE INDEX idx_executions_finished_at ON executions(finished_at);
CREATE INDEX idx_executions_status ON executions(status);
-- Índice para busca por texto
CREATE FULLTEXT INDEX idx_workflows_name ON workflows(name);
Configurações de Performance
-- Configurar engine
ALTER TABLE executions ENGINE=InnoDB;
ALTER TABLE workflows ENGINE=InnoDB;
-- Otimizar tabelas
OPTIMIZE TABLE executions;
OPTIMIZE TABLE workflows;
Backup e Recovery
PostgreSQL - Script de Backup
#!/bin/bash
# Configurações
BACKUP_DIR="/backups/postgres"
DB_NAME="n8n"
DB_USER="n8n"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/n8n_$DATE.sql"
# Criar backup
pg_dump -U $DB_USER -d $DB_NAME > $BACKUP_FILE
# Comprimir backup
gzip $BACKUP_FILE
# Limpar backups antigos (mais de 7 dias)
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup criado: $BACKUP_FILE.gz"
MySQL - Script de Backup
#!/bin/bash
# Configurações
BACKUP_DIR="/backups/mysql"
DB_NAME="n8n"
DB_USER="n8n"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/n8n_$DATE.sql"
# Criar backup
mysqldump -u $DB_USER -p $DB_NAME > $BACKUP_FILE
# Comprimir backup
gzip $BACKUP_FILE
# Limpar backups antigos (mais de 7 dias)
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup criado: $BACKUP_FILE.gz"
Restauração
PostgreSQL - Restaurar Backup
#!/bin/bash
# Restaurar backup
gunzip -c backup_file.sql.gz | psql -U n8n -d n8n
MySQL - Replicação Master-Slave
-- Master
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%' IDENTIFIED BY 'senha';
-- Slave
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replicator',
MASTER_PASSWORD='SUA_SENHA_MASTER_AQUI',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
Cloud Databases
AWS RDS PostgreSQL
# Configuração para AWS RDS
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=your-rds-endpoint.amazonaws.com
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=${DB_PASSWORD}
Docker Compose com Database
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
ports:
- "5678:5678"
environment:
# Configurações básicas
- N8N_PROTOCOL=https
- N8N_HOST=seudominio.com
- GENERIC_TIMEZONE=America/Sao_Paulo
# 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=${DB_PASSWORD}
# Redis
- REDIS_URL=redis://redis:6379
# Segurança
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
# Performance
- EXECUTIONS_PROCESS=main
- EXECUTIONS_MODE=regular
- EXECUTIONS_TIMEOUT=300000
# Logs
- N8N_LOG_LEVEL=info
- N8N_LOG_FORMAT=json
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
- redis
postgres:
image: postgres:15
restart: unless-stopped
environment:
- POSTGRES_DB=n8n
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
n8n_data:
postgres_data:
redis_data:
Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: n8n
spec:
replicas: 3
selector:
matchLabels:
app: n8n
template:
metadata:
labels:
app: n8n
spec:
containers:
- name: n8n
image: n8nio/n8n:latest
ports:
- containerPort: 5678
env:
- name: N8N_PROTOCOL
value: "https"
- name: N8N_HOST
value: "seudominio.com"
- name: GENERIC_TIMEZONE
value: "America/Sao_Paulo"
- name: DB_TYPE
value: "postgresdb"
- name: DB_POSTGRESDB_HOST
value: "postgres-service"
- name: DB_POSTGRESDB_DATABASE
value: "n8n"
- name: DB_POSTGRESDB_USER
valueFrom:
secretKeyRef:
name: n8n-secrets
key: db-user
- name: DB_POSTGRESDB_PASSWORD
valueFrom:
secretKeyRef:
name: n8n-secrets
key: db-password
- name: N8N_ENCRYPTION_KEY
valueFrom:
secretKeyRef:
name: n8n-secrets
key: encryption-key
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "1000m"
Monitoramento
Métricas PostgreSQL
-- Queries lentas
SELECT query, mean_time, calls, total_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
-- Uso de tabelas
SELECT schemaname, tablename, n_tup_ins, n_tup_upd, n_tup_del
FROM pg_stat_user_tables
ORDER BY n_tup_ins + n_tup_upd + n_tup_del DESC;
-- Conexões ativas
SELECT count(*) as active_connections
FROM pg_stat_activity
WHERE state = 'active';
Métricas MySQL
-- Status do servidor
SHOW STATUS LIKE 'Connections';
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Slow_queries';
-- Queries lentas
SELECT * FROM mysql.slow_log
WHERE start_time > DATE_SUB(NOW(), INTERVAL 1 HOUR)
ORDER BY query_time DESC
LIMIT 10;
Checklist de Produção
Configuração
- Database instalado e configurado
- Usuário e permissões configurados
- Conexão testada
- Índices criados
Performance
- Configurações de memória otimizadas
- Logs configurados adequadamente
- Timeouts configurados
- Estatísticas atualizadas
Monitoramento
- Scripts de monitoramento configurados
- Alertas configurados
- Métricas sendo coletadas
- Logs estruturados
Segurança
- Senha forte configurada
- Acesso restrito por IP
- SSL/TLS configurado (se necessário)
- Backup configurado
Dica Pro
Use PostgreSQL para melhor performance e recursos avançados. Configure backups automáticos e monitore o uso de recursos para otimizar a performance.
Importante
Sempre teste backups e restaurações em ambiente de desenvolvimento antes de aplicar em produção. Mantenha múltiplas cópias de backup em locais diferentes.