#!/bin/bash
# ============================================================
# backup-n8n.sh — Backup local completo de n8n self-hosted
# ============================================================
# Qué es:      Script de backup que respalda los datos de n8n
#              (workflows, credenciales y base de datos) en un
#              archivo .tar.gz local con retención automática.
# Cuándo usarlo: Programado con cron (diario recomendado) en el
#              servidor donde corre tu n8n con Docker Compose.
# Requisitos:  - n8n corriendo en Docker (contenedor "n8n")
#              - Espacio en disco para los backups
# Cómo usarlo: 1. Ajusta las variables de CONFIGURACIÓN abajo.
#              2. Dale permisos: chmod +x backup-n8n.sh
#              3. Pruébalo manualmente: ./backup-n8n.sh
#              4. Prográmalo en cron (ejemplo al final).
# ============================================================

set -euo pipefail

# ----------------- CONFIGURACIÓN -----------------
N8N_DATA_DIR="$HOME/n8n"          # Carpeta con los datos de n8n (la que montas como volumen)
BACKUP_DIR="$HOME/n8n-backups"    # Dónde guardar los backups
CONTAINER_NAME="n8n"              # Nombre del contenedor Docker de n8n
DIAS_RETENCION=14                 # Borrar backups más viejos que N días
# --------------------------------------------------

fecha=$(date +%Y-%m-%d_%H%M)
backup_file="$BACKUP_DIR/n8n-backup-$fecha.tar.gz"

mkdir -p "$BACKUP_DIR"

# 1. Exportar workflows y credenciales desde el contenedor (formato JSON portable).
#    Esto permite restaurar en cualquier instancia de n8n, no solo en esta.
echo "→ Exportando workflows y credenciales..."
docker exec "$CONTAINER_NAME" n8n export:workflow --all --output=/tmp/workflows.json || \
  echo "  (aviso: no se pudieron exportar workflows — ¿hay alguno creado?)"
docker exec "$CONTAINER_NAME" n8n export:credentials --all --output=/tmp/credentials.json || \
  echo "  (aviso: no se pudieron exportar credenciales)"
docker cp "$CONTAINER_NAME:/tmp/workflows.json" "$N8N_DATA_DIR/workflows-export.json" 2>/dev/null || true
docker cp "$CONTAINER_NAME:/tmp/credentials.json" "$N8N_DATA_DIR/credentials-export.json" 2>/dev/null || true

# 2. Comprimir todo el directorio de datos (incluye SQLite/config + exports anteriores).
echo "→ Comprimiendo $N8N_DATA_DIR..."
tar -czf "$backup_file" -C "$(dirname "$N8N_DATA_DIR")" "$(basename "$N8N_DATA_DIR")"

# 3. Verificar que el backup se creó y no está vacío.
if [ ! -s "$backup_file" ]; then
  echo "ERROR: el backup está vacío o no se creó: $backup_file"
  exit 1
fi
tar -tzf "$backup_file" > /dev/null || { echo "ERROR: el .tar.gz está corrupto"; exit 1; }

# 4. Borrar backups viejos (retención).
find "$BACKUP_DIR" -name "n8n-backup-*.tar.gz" -mtime +"$DIAS_RETENCION" -delete

echo "✅ Backup completado: $backup_file ($(du -h "$backup_file" | cut -f1))"

# ============================================================
# Programar con cron (todos los días a las 3:00 AM):
#   crontab -e
#   0 3 * * * /ruta/completa/backup-n8n.sh >> $HOME/n8n-backups/backup.log 2>&1
#
# Restaurar un backup:
#   tar -xzf n8n-backup-FECHA.tar.gz -C ~/
#   docker compose restart n8n
#   (o importa los JSON: n8n import:workflow --input=workflows-export.json)
# ============================================================
