From 7ebe0529c51d9f8853b126f9d776b0a6d4326c7b Mon Sep 17 00:00:00 2001 From: Iris Florencio Date: Mon, 6 Jul 2026 23:17:31 -0300 Subject: [PATCH] feat(backup): backup automatico do n8n SQLite (2x/dia) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- scripts/backups/backup-n8n.sh | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 scripts/backups/backup-n8n.sh diff --git a/scripts/backups/backup-n8n.sh b/scripts/backups/backup-n8n.sh new file mode 100755 index 0000000..aa88aab --- /dev/null +++ b/scripts/backups/backup-n8n.sh @@ -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"