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:
parent
d1760b7daf
commit
7ebe0529c5
42
scripts/backups/backup-n8n.sh
Executable file
42
scripts/backups/backup-n8n.sh
Executable 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"
|
||||||
Loading…
Reference in New Issue
Block a user