feat(backup): backup automatico do n8n SQLite (2x/dia)

Item 3 da sugestão B — proteger n8n SQLite que era single-point-of-failure.

Script backup-n8n.sh:
- Roda 2x/dia (00:30 e 12:30) via cron
- Usa sqlite3 .backup (seguro com n8n rodando)
- Compacta com gzip (~1.6MB → 100KB)
- Rotacao: mantem ultimos 30 dias
- Log em scripts/logs/backup-n8n.log

Cron jobs ativos (crontab -l):
- 0 2 * * *   backup-vault.sh (pausado antes)
- 30 0,12 * * * backup-n8n.sh (NOVO)
- 0 */2 * * * health-check.sh
- 0 8 * * *   resumo-diario.sh
- 0 14 * * *  compliance-check.sh

Teste manual validado:
- Backup criado: backup/n8n/n8n-2026-07-06_2317.db.gz (100KB)
- Log gerado em scripts/logs/backup-n8n.log
This commit is contained in:
Iris Florencio 2026-07-06 23:17:31 -03:00
parent d1760b7daf
commit 7ebe0529c5

42
scripts/backups/backup-n8n.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/bash
# ============================================================
# backup-n8n.sh — Backup do SQLite do n8n
# Executado 2x/dia (meio-dia e meia-noite) via cron
# ============================================================
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKUP_DIR="$SCRIPT_DIR/../../backup/n8n"
LOG_FILE="$SCRIPT_DIR/../logs/backup-n8n.log"
mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"
echo "==========================================" >> "$LOG_FILE"
echo "Backup n8n iniciado: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
echo "==========================================" >> "$LOG_FILE"
# Caminho do SQLite no volume Docker
N8N_DB="/var/lib/docker/volumes/m5_n8n_data/_data/database.sqlite"
# Sanidade: arquivo existe?
if [ ! -f "$N8N_DB" ]; then
echo "ERRO: $N8N_DB nao encontrado" >> "$LOG_FILE"
exit 1
fi
# Backup rotacionado: n8n-YYYY-MM-DD_HHMM.db.gz (mantem ultimos 30)
TIMESTAMP=$(date +%Y-%m-%d_%H%M)
BACKUP_FILE="$BACKUP_DIR/n8n-${TIMESTAMP}.db.gz"
# SQLite .backup e' seguro mesmo com n8n rodando
sqlite3 "$N8N_DB" ".backup '$BACKUP_DIR/n8n-temp.db'" 2>> "$LOG_FILE"
gzip -c "$BACKUP_DIR/n8n-temp.db" > "$BACKUP_FILE"
rm -f "$BACKUP_DIR/n8n-temp.db"
# Limpar backups > 30 dias
DELETED=$(find "$BACKUP_DIR" -name "n8n-*.db.gz" -mtime +30 -delete -print | wc -l)
echo "Backup criado: $BACKUP_FILE ($(du -h "$BACKUP_FILE" | cut -f1))" >> "$LOG_FILE"
echo "Backups antigos removidos: $DELETED" >> "$LOG_FILE"
echo "Total de backups retidos: $(ls -1 "$BACKUP_DIR"/n8n-*.db.gz 2>/dev/null | wc -l)" >> "$LOG_FILE"
echo "Concluido: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"