#!/usr/bin/env bash # ============================================================================== # backup_db.sh — Admin Edu-Space (UniCABA) # Generador de backups de PostgreSQL y actualización de classrooms_db.sql # Uso: bash backup_db.sh # ============================================================================== set -euo pipefail RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m' ok() { echo -e "${GREEN} ✔ $*${RESET}"; } info() { echo -e "${CYAN} ▸ $*${RESET}"; } warn() { echo -e "${YELLOW} ⚠ $*${RESET}"; } err() { echo -e "${RED} ✘ $*${RESET}" >&2; exit 1; } hdr() { echo -e "\n${BOLD}${CYAN}══ $* ══${RESET}\n"; } APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKUP_DIR="${APP_DIR}/backups" TIMESTAMP="$(date +'%Y%m%d_%H%M%S')" BACKUP_FILE="${BACKUP_DIR}/classrooms_db_${TIMESTAMP}.sql" ROOT_BACKUP="${APP_DIR}/classrooms_db.sql" APP_ENV="${APP_DIR}/.env" mkdir -p "$BACKUP_DIR" hdr "Iniciando Backup de la Base de Datos" # 1. Obtener parámetros de conexión DB_NAME="classrooms_db" DB_USER="eduspace_user" DB_HOST="localhost" DB_PORT="5432" DB_PASSWORD="" if [[ -f "$APP_ENV" ]]; then set -a # shellcheck disable=SC1090 source <(grep -v '^#' "$APP_ENV" | grep '=') set +a if [[ -n "${DATABASE_URL:-}" ]]; then # Extraer credenciales desde DATABASE_URL si existe # Formato: postgresql://usuario:pass@host:port/dbname DB_USER=$(echo "$DATABASE_URL" | sed -E 's|.*://([^:]+):?([^@]*)@.*|\1|') DB_PASSWORD=$(echo "$DATABASE_URL" | sed -E 's|.*://[^:]+:([^@]*)@.*|\1|') DB_HOST=$(echo "$DATABASE_URL" | sed -E 's|.*@([^:/]+):?.*|\1|') DB_PORT=$(echo "$DATABASE_URL" | sed -E 's|.*:([0-9]+)/.*|\1|') DB_NAME=$(echo "$DATABASE_URL" | sed -E 's|.*/([^?]+).*|\1|') fi fi DB_USER="${DB_USER:-postgres}" DB_NAME="${DB_NAME:-classrooms_db}" DB_HOST="${DB_HOST:-localhost}" DB_PORT="${DB_PORT:-5432}" info "Base de datos: ${DB_NAME}" info "Usuario: ${DB_USER}" info "Host: ${DB_HOST}:${DB_PORT}" # 2. Ejecutar pg_dump info "Generando volcado SQL..." export PGPASSWORD="${DB_PASSWORD:-}" if command -v pg_dump >/dev/null 2>&1; then # Intentar como usuario configurado if pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" \ --no-owner --no-privileges --clean --if-exists > "$BACKUP_FILE" 2>/dev/null; then ok "Volcado generado con éxito usando pg_dump" elif [[ $EUID -eq 0 ]] || sudo -n true 2>/dev/null; then info "Reintentando volcado como superusuario postgres..." sudo -u postgres pg_dump -d "$DB_NAME" --no-owner --no-privileges > "$BACKUP_FILE" ok "Volcado generado como usuario postgres" else err "No se pudo realizar el backup. Verifica tus permisos y credenciales." fi else err "No se encontró la herramienta 'pg_dump'. Instala postgresql-client." fi # 3. Limpiar comandos de versiones específicas (ej: \restrict de PG 18) para máxima compatibilidad sed -i '/^\\restrict/d' "$BACKUP_FILE" 2>/dev/null || true # 4. Actualizar copia en raíz para despliegues automáticos cp "$BACKUP_FILE" "$ROOT_BACKUP" BACKUP_SIZE=$(du -h "$BACKUP_FILE" | awk '{print $1}') hdr "Resumen del Backup" ok "Archivo histórico: ${BACKUP_FILE} (${BACKUP_SIZE})" ok "Copia para deploy: ${ROOT_BACKUP} (${BACKUP_SIZE})" info "Para restaurar en otro servidor:" echo -e " ${CYAN}sudo -u postgres psql -d ${DB_NAME} < ${ROOT_BACKUP}${RESET}" echo ""