#!/bin/bash # MSP Monitor Dashboard - Database Restore Script # Restaura un backup de la base de datos PostgreSQL set -e # Verificar argumentos if [ -z "$1" ]; then echo "Uso: $0 " echo "" echo "Ejemplo: $0 /backups/msp_monitor_20240115_120000.sql.gz" echo "" echo "Backups disponibles:" ls -la ${BACKUP_DIR:-/backups}/msp_monitor_*.sql.gz 2>/dev/null || echo "No se encontraron backups" exit 1 fi BACKUP_FILE="$1" # Verificar que el archivo existe if [ ! -f "$BACKUP_FILE" ]; then echo "[✗] Archivo no encontrado: $BACKUP_FILE" exit 1 fi # Cargar variables de entorno if [ -f .env ]; then export $(cat .env | grep -v '^#' | xargs) fi # Valores por defecto DB_HOST="${DB_HOST:-localhost}" DB_PORT="${DB_PORT:-5432}" DB_USER="${POSTGRES_USER:-mspmonitor}" DB_NAME="${POSTGRES_DB:-msp_monitor}" DB_PASSWORD="${POSTGRES_PASSWORD:-changeme}" echo "======================================" echo " MSP Monitor - Database Restore" echo "======================================" echo "Fecha: $(date)" echo "Archivo: $BACKUP_FILE" echo "Base de datos: $DB_NAME" echo "" # Confirmar restauracion echo "ADVERTENCIA: Esta operacion eliminara todos los datos actuales." read -p "¿Desea continuar? (si/no): " CONFIRM if [ "$CONFIRM" != "si" ]; then echo "Operacion cancelada" exit 0 fi export PGPASSWORD="$DB_PASSWORD" # Crear backup de seguridad antes de restaurar echo "" echo "Creando backup de seguridad antes de restaurar..." SAFETY_BACKUP="/tmp/msp_monitor_pre_restore_$(date +%Y%m%d_%H%M%S).sql.gz" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" \ --no-owner --no-privileges --format=custom | gzip > "$SAFETY_BACKUP" echo "[✓] Backup de seguridad: $SAFETY_BACKUP" # Terminar conexiones activas echo "" echo "Terminando conexiones activas..." psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c \ "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME' AND pid <> pg_backend_pid();" \ > /dev/null 2>&1 || true # Eliminar y recrear base de datos echo "" echo "Recreando base de datos..." psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c "DROP DATABASE IF EXISTS $DB_NAME;" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c "CREATE DATABASE $DB_NAME;" echo "[✓] Base de datos recreada" # Restaurar backup echo "" echo "Restaurando backup..." if [[ "$BACKUP_FILE" == *.gz ]]; then gunzip -c "$BACKUP_FILE" | pg_restore -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" --no-owner --no-privileges else pg_restore -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" --no-owner --no-privileges "$BACKUP_FILE" fi echo "[✓] Backup restaurado" unset PGPASSWORD # Aplicar migraciones pendientes echo "" echo "Verificando migraciones..." npx prisma db push --skip-generate 2>/dev/null || echo "[!] No se pudieron aplicar migraciones automaticamente" echo "" echo "======================================" echo " Restauracion completada" echo "======================================" echo "" echo "El backup de seguridad esta en: $SAFETY_BACKUP" echo "Elimine manualmente cuando ya no lo necesite."