#!/bin/bash
# ============================================================
# backup-n8n-drive.sh — Backup de n8n con copia a Google Drive
# ============================================================
# Qué es:      Igual que backup-n8n.sh, pero además sube el
#              .tar.gz a Google Drive usando rclone. Así tu
#              backup sobrevive aunque el servidor muera.
# Cuándo usarlo: Programado con cron en el servidor de n8n,
#              como respaldo externo (regla 3-2-1).
# Requisitos:  - n8n corriendo en Docker (contenedor "n8n")
#              - rclone instalado y configurado:
#                  sudo apt install rclone
#                  rclone config   (tipo: Google Drive, nombre: gdrive)
# Cómo usarlo: 1. Ajusta las variables de CONFIGURACIÓN abajo.
#              2. chmod +x backup-n8n-drive.sh
#              3. Pruébalo: ./backup-n8n-drive.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
CONTAINER_NAME="n8n"              # Nombre del contenedor Docker
RCLONE_REMOTE="gdrive"            # Nombre del remote configurado en rclone
DRIVE_FOLDER="n8n-backups"        # Carpeta destino en Google Drive
DIAS_RETENCION_DRIVE=30           # Borrar de Drive backups más viejos que N días
# --------------------------------------------------

# Validar que rclone existe y el remote está configurado.
if ! command -v rclone &> /dev/null; then
  echo "ERROR: rclone no está instalado. Instálalo: sudo apt install rclone"
  exit 1
fi
if ! rclone listremotes | grep -q "^${RCLONE_REMOTE}:$"; then
  echo "ERROR: el remote '$RCLONE_REMOTE' no existe. Configúralo con: rclone config"
  exit 1
fi

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

# 1. Exportar workflows y credenciales (formato JSON portable).
echo "→ Exportando workflows y credenciales..."
docker exec "$CONTAINER_NAME" n8n export:workflow --all --output=/tmp/workflows.json || true
docker exec "$CONTAINER_NAME" n8n export:credentials --all --output=/tmp/credentials.json || true
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 y verificar.
echo "→ Comprimiendo $N8N_DATA_DIR..."
tar -czf "$backup_file" -C "$(dirname "$N8N_DATA_DIR")" "$(basename "$N8N_DATA_DIR")"
tar -tzf "$backup_file" > /dev/null || { echo "ERROR: el .tar.gz está corrupto"; exit 1; }

# 3. Subir a Google Drive.
echo "→ Subiendo a $RCLONE_REMOTE:$DRIVE_FOLDER/ ..."
if ! rclone copy "$backup_file" "$RCLONE_REMOTE:$DRIVE_FOLDER/"; then
  echo "ERROR: falló la copia a Google Drive. Verifica: rclone config"
  rm -f "$backup_file"
  exit 1
fi

# 4. Retención en Drive y limpieza local.
rclone delete "$RCLONE_REMOTE:$DRIVE_FOLDER/" --min-age "${DIAS_RETENCION_DRIVE}d" || true
rm -f "$backup_file"

echo "✅ Backup subido: n8n-backup-$fecha.tar.gz → $RCLONE_REMOTE:$DRIVE_FOLDER/"

# ============================================================
# Programar con cron (todos los días a las 3:30 AM):
#   crontab -e
#   30 3 * * * /ruta/completa/backup-n8n-drive.sh >> $HOME/n8n-backup-drive.log 2>&1
#
# Ver backups en Drive:   rclone ls gdrive:n8n-backups/
# Descargar uno:          rclone copy gdrive:n8n-backups/ARCHIVO.tar.gz .
# ============================================================
