Pular para o conteúdo principal

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.