103 lines
3.8 KiB
Bash
103 lines
3.8 KiB
Bash
#!/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_PASSWORD="${DB_PASSWORD:-password}"
|
|
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
|
|
if command -v sudo >/dev/null 2>&1; then
|
|
sudo -u postgres pg_dump -d "$DB_NAME" --no-owner --no-privileges > "$BACKUP_FILE"
|
|
elif command -v runuser >/dev/null 2>&1; then
|
|
runuser -u postgres -- pg_dump -d "$DB_NAME" --no-owner --no-privileges > "$BACKUP_FILE"
|
|
else
|
|
su - postgres -c "pg_dump -d \"$DB_NAME\" --no-owner --no-privileges" > "$BACKUP_FILE"
|
|
fi
|
|
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 ""
|