From 0cea3dca4471211500b4abef97c8468a3a2718ed Mon Sep 17 00:00:00 2001 From: Carlos Tello Date: Fri, 4 Sep 2026 23:02:02 -0300 Subject: [PATCH] feat: hacer install.sh 100% automatico y desatendido usando config activa de PostgreSQL (.env) --- .env.example | 2 +- CHANGELOG_SESSION.md | 5 +++- backup_db.sh | 1 + install.sh | 56 ++++++++++++++++++++------------------------ 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/.env.example b/.env.example index ca9acf2..7b5dfdb 100644 --- a/.env.example +++ b/.env.example @@ -4,7 +4,7 @@ # ============================================================================== # Entorno Flask -FLASK_APP=app.py +FLASK_APP=wsgi.py FLASK_ENV=production # Seguridad: Clave secreta para sesiones y protección CSRF diff --git a/CHANGELOG_SESSION.md b/CHANGELOG_SESSION.md index 88d2d28..8f8131a 100644 --- a/CHANGELOG_SESSION.md +++ b/CHANGELOG_SESSION.md @@ -364,10 +364,13 @@ * **Contenido Respaldado:** 25 aulas físicas y virtuales, 206 comisiones, 206 asignaturas, 412 reservas, 24 carreras, 12 tipos de hitos, matrices de permisos RBAC y usuarios administradores. * **Compatibilidad Multi-Versión:** Se sanitizó la directiva `\restrict` específica de PostgreSQL 18 para garantizar compatibilidad nativa con PostgreSQL 14, 15, 16, 17 y 18. * **Actualización del Instalador del Sistema para Proxmox LXC ([install.sh](file:///c:/Workspace/admin-edu-space/install.sh)):** + * **Ejecución 100% Automatizada (Zero-Touch):** Se eliminaron todos los prompts interactivos (`read -rp`), permitiendo que el script corra de inicio a fin de forma totalmente desatendida. + * **Copia de Configuración Activa del Sistema:** Se configuraron como valores por defecto los parámetros reales del sistema en ejecución (`DATABASE_URL=postgresql://postgres:password@localhost:5432/classrooms_db`, usuario `postgres`, base `classrooms_db` y contraseña `password`), garantizando paridad exacta con el entorno local. + * **Compatibilidad Dual de Usuarios:** Configuración tanto del superusuario `postgres` como de `eduspace_user` con los mismos privilegios para compatibilidad inmediata ante cualquier variación de `.env`. * **Optimización Proxmox LXC:** Compatible con contenedores Debian 11/12 y Ubuntu 20.04/22.04/24.04 en Proxmox VE. * **Migración Automática de Directorio:** Si el repositorio se clona en `/root`, se traslada automáticamente a `/opt/admin-edu-space` para garantizar permisos de ejecución del usuario del servicio (`eduspace`). * **Despliegue del Motor PostgreSQL Nativo:** Instalación desatendida del motor en el LXC, inicialización dinámica del servicio y bucle de healthcheck de conexión. - * **Restauración Automatizada y Permisos:** Detección automática de `classrooms_db.sql`, recreación limpia, asignación de permisos `GRANT ALL` en el esquema `public`, todas las tablas y secuencias al usuario `eduspace_user`. + * **Restauración Automatizada y Permisos:** Detección automática de `classrooms_db.sql`, recreación limpia, asignación de permisos `GRANT ALL` en el esquema `public`, todas las tablas y secuencias a `postgres` y `eduspace_user`. * **Entorno Virtual Nativo (`venv`):** Configuración en `/opt/admin-edu-space/venv` con dependencias del sistema y `gunicorn`. * **Servicio Systemd de Producción:** Configuración y activación de `admin-edu-space.service` en el puerto 5000. * **Ejecución Idempotente:** Integración de `init_db.py` tras la restauración para validar la coherencia del esquema y roles. diff --git a/backup_db.sh b/backup_db.sh index 7af9939..461d486 100644 --- a/backup_db.sh +++ b/backup_db.sh @@ -51,6 +51,7 @@ if [[ -f "$APP_ENV" ]]; then 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}" diff --git a/install.sh b/install.sh index f72e02f..c1aa757 100644 --- a/install.sh +++ b/install.sh @@ -129,31 +129,22 @@ fi # ─── 5. Configurar Variables de Entorno (.env) ───────────────────────────────── hdr "5. Configurando variables de entorno (.env)" +# Configuración idéntica al entorno del sistema activo (100% automático sin interacción) DB_NAME="classrooms_db" -DB_USER="eduspace_user" -DEFAULT_DB_PASS="eduspace2024" +DB_USER="postgres" +DB_PASSWORD="password" if [[ -f "$APP_ENV" ]]; then - ok ".env ya existe — se conserva la configuración existente" + ok ".env ya existe — se preserva la configuración actual" set -a # shellcheck disable=SC1090 source <(grep -v '^#' "$APP_ENV" | grep '=') set +a DB_USER="${DB_USERNAME:-$DB_USER}" - DB_PASSWORD="${DB_PASSWORD:-$DEFAULT_DB_PASS}" + DB_PASSWORD="${DB_PASSWORD:-password}" DB_NAME=$(echo "${DATABASE_URL:-}" | sed -E 's|.*/([^?]+).*|\1|') DB_NAME="${DB_NAME:-classrooms_db}" else - echo "" - echo -e " ${BOLD}Credenciales para la base de datos PostgreSQL:${RESET}" - if [ -n "${NON_INTERACTIVE:-}" ] || [ ! -t 0 ]; then - DB_PASSWORD="$DEFAULT_DB_PASS" - info "Modo no interactivo: usando contraseña por defecto." - else - read -rp " Contraseña para el usuario '${DB_USER}' [default: ${DEFAULT_DB_PASS}]: " DB_PASS_INPUT - DB_PASSWORD="${DB_PASS_INPUT:-$DEFAULT_DB_PASS}" - fi - SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(32))') cat > "$APP_ENV" </dev/null 2>&1 \ - || sudo -u postgres psql -c "ALTER USER ${DB_USER} WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \ +# Asignar contraseña al usuario postgres +sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 || true + +# Crear usuario eduspace_user con la misma contraseña como alternativa +sudo -u postgres psql -c "CREATE USER eduspace_user WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \ + || sudo -u postgres psql -c "ALTER USER eduspace_user WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \ || true -sudo -u postgres psql -c "CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};" >/dev/null 2>&1 \ +# Crear base de datos +sudo -u postgres psql -c "CREATE DATABASE ${DB_NAME} OWNER postgres;" >/dev/null 2>&1 \ || info "La base de datos '${DB_NAME}' ya existía." -sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} TO ${DB_USER};" >/dev/null 2>&1 || true -sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO ${DB_USER};" >/dev/null 2>&1 || true +sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} TO postgres, eduspace_user;" >/dev/null 2>&1 || true +sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO postgres, eduspace_user;" >/dev/null 2>&1 || true -ok "Usuario '${DB_USER}' y base de datos '${DB_NAME}' configurados" +ok "Motor PostgreSQL configurado (usuario: ${DB_USER}, base: ${DB_NAME})" # ─── 7. Crear Entorno Virtual e Instalar Dependencias ────────────────────────── hdr "7. Creando virtualenv e instalando dependencias Python" @@ -223,7 +219,7 @@ if [[ -f "$SQL_BACKUP_FILE" ]]; then # Recrear base de datos limpia para carga sin colisiones sudo -u postgres psql -c "DROP DATABASE IF EXISTS ${DB_NAME};" > /dev/null 2>&1 || true - sudo -u postgres psql -c "CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};" > /dev/null 2>&1 + sudo -u postgres psql -c "CREATE DATABASE ${DB_NAME} OWNER postgres;" > /dev/null 2>&1 # Restaurar backup filtrando directivas específicas de PG18 si existiesen if sed '/^\\restrict/d' "$SQL_BACKUP_FILE" | sudo -u postgres psql -d "${DB_NAME}" > /dev/null 2>&1; then @@ -233,12 +229,12 @@ if [[ -f "$SQL_BACKUP_FILE" ]]; then fi # Otorgar propiedad y permisos absolutos sobre todas las tablas y secuencias al usuario de la app - info "Garantizando permisos y secuencias para '${DB_USER}'..." - sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO ${DB_USER};" > /dev/null 2>&1 || true - sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ${DB_USER};" > /dev/null 2>&1 || true - sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ${DB_USER};" > /dev/null 2>&1 || true - sudo -u postgres psql -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ${DB_USER};" > /dev/null 2>&1 || true - sudo -u postgres psql -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ${DB_USER};" > /dev/null 2>&1 || true + info "Garantizando permisos y secuencias para ${DB_USER} y eduspace_user..." + sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO postgres, eduspace_user;" > /dev/null 2>&1 || true + sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO postgres, eduspace_user;" > /dev/null 2>&1 || true + sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO postgres, eduspace_user;" > /dev/null 2>&1 || true + sudo -u postgres psql -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO postgres, eduspace_user;" > /dev/null 2>&1 || true + sudo -u postgres psql -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres, eduspace_user;" > /dev/null 2>&1 || true # Ejecutar init_db.py de forma idempotente para verificar roles y migraciones incrementales info "Validando coherencia de modelos con init_db.py..."