#!/bin/bash # ============================================================================= # MiChangarrito - Script de Backup # ============================================================================= # Crea backups de la base de datos PostgreSQL # USO: # ./backup.sh # Backup completo # ./backup.sh --restore FILE # Restaurar desde archivo # ============================================================================= set -e # Colores RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # Variables SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" BACKUP_DIR="$PROJECT_DIR/backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) RESTORE_FILE="" # Cargar variables de entorno if [ -f "$PROJECT_DIR/.env" ]; then source "$PROJECT_DIR/.env" fi DB_NAME="${DB_DATABASE:-michangarrito_dev}" DB_USER="${DB_USERNAME:-michangarrito_dev}" DB_PASSWORD="${DB_PASSWORD:-MCh_dev_2025_secure}" # Parsear argumentos while [[ $# -gt 0 ]]; do case $1 in --restore) RESTORE_FILE="$2" shift 2 ;; --help|-h) echo "Uso: $0 [--restore FILE]" echo " --restore FILE Restaurar desde archivo de backup" exit 0 ;; *) shift ;; esac done # Crear directorio de backups mkdir -p "$BACKUP_DIR" # Banner echo "" echo -e "${CYAN}╔══════════════════════════════════════════════════════════════════╗${NC}" echo -e "${CYAN}║ MICHANGARRITO - GESTIÓN DE BACKUPS ║${NC}" echo -e "${CYAN}╚══════════════════════════════════════════════════════════════════╝${NC}" echo "" # Restaurar si se especificó archivo if [ -n "$RESTORE_FILE" ]; then if [ ! -f "$RESTORE_FILE" ]; then echo -e "${RED}Error: Archivo no encontrado: $RESTORE_FILE${NC}" exit 1 fi echo -e "${YELLOW}⚠ ADVERTENCIA: Esto sobrescribirá la base de datos actual${NC}" read -p "¿Continuar? (s/N): " confirm if [[ ! "$confirm" =~ ^[sS]$ ]]; then echo -e "${RED}Operación cancelada${NC}" exit 0 fi echo -e "${YELLOW}Restaurando desde: $RESTORE_FILE${NC}" # Determinar si es .gz o .sql if [[ "$RESTORE_FILE" == *.gz ]]; then gunzip -c "$RESTORE_FILE" | docker-compose exec -T postgres psql -U "$DB_USER" -d "$DB_NAME" else docker-compose exec -T postgres psql -U "$DB_USER" -d "$DB_NAME" < "$RESTORE_FILE" fi echo -e "${GREEN}✓ Base de datos restaurada${NC}" exit 0 fi # Crear backup BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql" BACKUP_FILE_GZ="${BACKUP_FILE}.gz" echo -e "${YELLOW}Creando backup de la base de datos...${NC}" echo " Base de datos: $DB_NAME" echo " Archivo: $BACKUP_FILE_GZ" echo "" # Ejecutar pg_dump docker-compose exec -T postgres pg_dump -U "$DB_USER" -d "$DB_NAME" --no-owner --no-acl > "$BACKUP_FILE" # Comprimir gzip "$BACKUP_FILE" # Mostrar información del backup BACKUP_SIZE=$(ls -lh "$BACKUP_FILE_GZ" | awk '{print $5}') echo -e "${GREEN}✓ Backup creado exitosamente${NC}" echo " Archivo: $BACKUP_FILE_GZ" echo " Tamaño: $BACKUP_SIZE" # Limpiar backups antiguos (mantener últimos 7) echo "" echo -e "${YELLOW}Limpiando backups antiguos (manteniendo últimos 7)...${NC}" cd "$BACKUP_DIR" ls -t *.gz 2>/dev/null | tail -n +8 | xargs -r rm -f BACKUP_COUNT=$(ls -1 *.gz 2>/dev/null | wc -l) echo -e "${GREEN}✓ Backups actuales: $BACKUP_COUNT${NC}" echo "" echo -e "${GREEN}Backup completado${NC}" echo ""