feat: actualizar install.sh para Proxmox LXC con venv, snapshot classrooms_db.sql, backup_db.sh y fix linter en occupancy
This commit is contained in:
+144
-114
@@ -1,13 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# ==============================================================================
|
||||
# install.sh — Admin Edu-Space (UniCABA)
|
||||
# Instalador automatizado para Debian 12 (LXC / Bare Metal)
|
||||
# Instalador automatizado para Proxmox VE (LXC) / Debian 12 / Ubuntu (entorno venv)
|
||||
# Uso: sudo bash install.sh
|
||||
# ==============================================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# ─── Colores ───────────────────────────────────────────────────────────────────
|
||||
# ─── Colores y Helpers ─────────────────────────────────────────────────────────
|
||||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m'
|
||||
|
||||
@@ -17,8 +17,7 @@ warn() { echo -e "${YELLOW} ⚠ $*${RESET}"; }
|
||||
err() { echo -e "${RED} ✘ $*${RESET}" >&2; exit 1; }
|
||||
hdr() { echo -e "\n${BOLD}${CYAN}══ $* ══${RESET}\n"; }
|
||||
|
||||
# ─── Variables ─────────────────────────────────────────────────────────────────
|
||||
# APP_DIR resuelto desde la ubicación del script (no del CWD)
|
||||
# ─── Variables Principales ─────────────────────────────────────────────────────
|
||||
APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
VENV_DIR="${APP_DIR}/venv"
|
||||
APP_ENV="${APP_DIR}/.env"
|
||||
@@ -27,9 +26,10 @@ APP_USER="eduspace"
|
||||
PYTHON_REQUIRED_MAJOR=3
|
||||
PYTHON_REQUIRED_MINOR=10
|
||||
LOG_DIR="/var/log/${SERVICE_NAME}"
|
||||
SQL_BACKUP_FILE="${APP_DIR}/classrooms_db.sql"
|
||||
|
||||
# ─── Root check ────────────────────────────────────────────────────────────────
|
||||
[[ $EUID -ne 0 ]] && err "Ejecutá este script con sudo: sudo bash install.sh"
|
||||
# ─── Verificación de Permisos Root ─────────────────────────────────────────────
|
||||
[[ $EUID -ne 0 ]] && err "Ejecutá este script con permisos de root: sudo bash install.sh"
|
||||
|
||||
# Si el directorio está dentro de /root, lo movemos a /opt para evitar problemas de permisos
|
||||
if [[ "${APP_DIR}" == /root/* ]]; then
|
||||
@@ -41,38 +41,45 @@ if [[ "${APP_DIR}" == /root/* ]]; then
|
||||
exec bash install.sh
|
||||
fi
|
||||
|
||||
[[ ! -f "${APP_DIR}/wsgi.py" ]] && err "No se encontró wsgi.py en ${APP_DIR}. ¿Estás en el directorio correcto?"
|
||||
[[ ! -f "${APP_DIR}/wsgi.py" ]] && err "No se encontró wsgi.py en ${APP_DIR}. ¿Estás en el directorio raíz del proyecto?"
|
||||
|
||||
echo -e "\n${BOLD}${CYAN}"
|
||||
echo "╔══════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Admin Edu-Space (UniCABA) — Instalador Debian 12 ║"
|
||||
echo "║ Admin Edu-Space (UniCABA) — Proxmox LXC Installer ║"
|
||||
echo "║ Despliegue Nativo con venv + Motor PostgreSQL ║"
|
||||
echo "╚══════════════════════════════════════════════════════════════╝"
|
||||
echo -e "${RESET}"
|
||||
|
||||
OS_NAME=$(grep -oP '(?<=^PRETTY_NAME=).+' /etc/os-release 2>/dev/null | tr -d '"' || uname -s)
|
||||
info "Sistema Operativo: ${OS_NAME}"
|
||||
info "Directorio del proyecto: ${APP_DIR}"
|
||||
info "Servicio systemd: ${SERVICE_NAME}"
|
||||
info "Usuario de servicio: ${APP_USER}"
|
||||
|
||||
# ─── 1. Actualizar sistema e instalar base ──────────────────────────────────────
|
||||
hdr "1. Actualizando sistema"
|
||||
# ─── 1. Actualizar sistema e instalar dependencias base ────────────────────────
|
||||
hdr "1. Actualizando repositorios y paquetes base"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get update -qq
|
||||
apt-get install -y -qq \
|
||||
curl wget git ca-certificates gnupg lsb-release \
|
||||
build-essential libpq-dev \
|
||||
locales
|
||||
locales \
|
||||
> /dev/null 2>&1
|
||||
ok "Paquetes base instalados"
|
||||
|
||||
# ─── 2. Configurar locale UTF-8 ────────────────────────────────────────────────
|
||||
hdr "2. Configurando locale"
|
||||
sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
|
||||
sed -i 's/# es_AR.UTF-8 UTF-8/es_AR.UTF-8 UTF-8/' /etc/locale.gen
|
||||
locale-gen en_US.UTF-8 es_AR.UTF-8 > /dev/null 2>&1
|
||||
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 > /dev/null 2>&1
|
||||
# ─── 2. Configurar Locale UTF-8 ────────────────────────────────────────────────
|
||||
hdr "2. Configurando soporte de codificación (Locales UTF-8)"
|
||||
if [ -f /etc/locale.gen ]; then
|
||||
sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
|
||||
sed -i 's/# es_AR.UTF-8 UTF-8/es_AR.UTF-8 UTF-8/' /etc/locale.gen
|
||||
locale-gen en_US.UTF-8 es_AR.UTF-8 > /dev/null 2>&1 || true
|
||||
fi
|
||||
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 > /dev/null 2>&1 || true
|
||||
export LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 PYTHONUTF8=1 PYTHONIOENCODING=utf-8
|
||||
ok "Locale configurado: en_US.UTF-8 / es_AR.UTF-8"
|
||||
ok "Locales configurados: en_US.UTF-8 / es_AR.UTF-8"
|
||||
|
||||
# ─── 3. Instalar Python 3.10+ ───────────────────────────────────────────────────
|
||||
hdr "3. Instalando Python"
|
||||
# ─── 3. Instalar Python 3.10+ y entorno de desarrollo ──────────────────────────
|
||||
hdr "3. Verificando entorno Python"
|
||||
apt-get install -y -qq python3 python3-venv python3-pip python3-dev > /dev/null 2>&1
|
||||
|
||||
PY_VERSION=$(python3 --version 2>/dev/null | awk '{print $2}' || echo "0.0")
|
||||
@@ -89,43 +96,64 @@ else
|
||||
ok "Python $PY_VERSION instalado"
|
||||
fi
|
||||
|
||||
# ─── 4. Instalar PostgreSQL ────────────────────────────────────────────────────
|
||||
hdr "4. Instalando PostgreSQL"
|
||||
apt-get install -y -qq postgresql postgresql-client > /dev/null 2>&1
|
||||
ok "PostgreSQL instalado: $(psql --version | awk '{print $3}')"
|
||||
# ─── 4. Instalar y Levantar Motor PostgreSQL ───────────────────────────────────
|
||||
hdr "4. Instalando y configurando motor de base de datos PostgreSQL"
|
||||
apt-get install -y -qq postgresql postgresql-contrib postgresql-client > /dev/null 2>&1
|
||||
PG_VER=$(psql --version 2>/dev/null | awk '{print $3}' || echo "instalado")
|
||||
ok "Motor PostgreSQL instalado: ${PG_VER}"
|
||||
|
||||
# Iniciar PostgreSQL (LXC puede no tener systemd activo aún)
|
||||
pg_ctlcluster 15 main start 2>/dev/null \
|
||||
# Levantar servicio de PostgreSQL asegurando compatibilidad con contenedores LXC y VMs
|
||||
info "Iniciando servicio de PostgreSQL..."
|
||||
systemctl start postgresql 2>/dev/null \
|
||||
|| service postgresql start 2>/dev/null \
|
||||
|| systemctl start postgresql 2>/dev/null \
|
||||
|| su - postgres -c "pg_ctlcluster $(ls /etc/postgresql/ 2>/dev/null | sort -V | tail -n1) main start" 2>/dev/null \
|
||||
|| true
|
||||
sleep 2
|
||||
systemctl enable postgresql > /dev/null 2>&1 || true
|
||||
ok "PostgreSQL activo y habilitado al inicio"
|
||||
|
||||
# ─── 5. Configurar .env ────────────────────────────────────────────────────────
|
||||
hdr "5. Configurando variables de entorno"
|
||||
# Esperar a que el socket de PostgreSQL esté completamente activo
|
||||
PG_READY=false
|
||||
for i in {1..15}; do
|
||||
if sudo -u postgres psql -c '\q' >/dev/null 2>&1; then
|
||||
PG_READY=true
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ "$PG_READY" = true ]; then
|
||||
systemctl enable postgresql > /dev/null 2>&1 || true
|
||||
ok "PostgreSQL activo y aceptando conexiones"
|
||||
else
|
||||
err "No se pudo conectar al motor PostgreSQL. Verificá los registros del sistema."
|
||||
fi
|
||||
|
||||
# ─── 5. Configurar Variables de Entorno (.env) ─────────────────────────────────
|
||||
hdr "5. Configurando variables de entorno (.env)"
|
||||
|
||||
DB_NAME="classrooms_db"
|
||||
DB_USER="eduspace_user"
|
||||
|
||||
echo ""
|
||||
echo -e " ${BOLD}Configuración de la base de datos PostgreSQL${RESET}"
|
||||
read -rp " Contraseña para el usuario de BD [default: eduspace2024]: " DB_PASS_INPUT
|
||||
DB_PASSWORD="${DB_PASS_INPUT:-eduspace2024}"
|
||||
DEFAULT_DB_PASS="eduspace2024"
|
||||
|
||||
if [[ -f "$APP_ENV" ]]; then
|
||||
ok ".env ya existe — se conserva sin modificar"
|
||||
# Leer variables del .env existente para usarlas en el script
|
||||
ok ".env ya existe — se conserva la configuración existente"
|
||||
set -a
|
||||
# shellcheck disable=SC1090
|
||||
source <(grep -v '^#' "$APP_ENV" | grep '=')
|
||||
set +a
|
||||
DB_USER="${DB_USERNAME:-$DB_USER}"
|
||||
DB_PASSWORD="${DB_PASSWORD:-eduspace2024}"
|
||||
DB_NAME=$(echo "${DATABASE_URL:-}" | sed 's|.*\/||')
|
||||
DB_PASSWORD="${DB_PASSWORD:-$DEFAULT_DB_PASS}"
|
||||
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" <<ENVEOF
|
||||
# Admin Edu-Space — Configuración de producción
|
||||
@@ -146,89 +174,89 @@ BABEL_DEFAULT_LOCALE=es
|
||||
BABEL_DEFAULT_TIMEZONE=America/Argentina/Buenos_Aires
|
||||
ENVEOF
|
||||
chmod 640 "$APP_ENV"
|
||||
ok ".env creado con SECRET_KEY aleatoria"
|
||||
warn "Revisá ${APP_ENV} antes de exponer la app a producción"
|
||||
ok ".env generado exitosamente con SECRET_KEY criptográfica"
|
||||
fi
|
||||
|
||||
# ─── 6. Crear usuario y base de datos PostgreSQL ────────────────────────────────
|
||||
hdr "6. Configurando base de datos"
|
||||
# ─── 6. Crear Usuario y Permisos en PostgreSQL ─────────────────────────────────
|
||||
hdr "6. Configurando usuario y base de datos en PostgreSQL"
|
||||
|
||||
sudo -u postgres psql -c "CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASSWORD}';" 2>/dev/null \
|
||||
|| warn "El usuario '${DB_USER}' ya existe — se omite creación"
|
||||
sudo -u postgres psql -c "CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \
|
||||
|| sudo -u postgres psql -c "ALTER USER ${DB_USER} WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \
|
||||
|| true
|
||||
|
||||
sudo -u postgres psql -c "CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};" 2>/dev/null \
|
||||
|| warn "La base de datos '${DB_NAME}' ya existe — se omite creación"
|
||||
sudo -u postgres psql -c "CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};" >/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 "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 "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
|
||||
|
||||
ok "Base de datos '${DB_NAME}' lista con usuario '${DB_USER}'"
|
||||
ok "Usuario '${DB_USER}' y base de datos '${DB_NAME}' configurados"
|
||||
|
||||
# ─── 7. Entorno virtual Python + dependencias ───────────────────────────────────
|
||||
hdr "7. Instalando dependencias Python"
|
||||
# ─── 7. Crear Entorno Virtual e Instalar Dependencias ──────────────────────────
|
||||
hdr "7. Creando virtualenv e instalando dependencias Python"
|
||||
|
||||
# Limpiar venv previo roto si existe
|
||||
if [[ -d "$VENV_DIR" ]]; then
|
||||
warn "Venv previo detectado — eliminando para recrear limpio..."
|
||||
info "Recreando entorno virtual para asegurar dependencias limpias..."
|
||||
rm -rf "$VENV_DIR"
|
||||
fi
|
||||
|
||||
python3 -m venv "$VENV_DIR" > /dev/null 2>&1
|
||||
"${VENV_DIR}/bin/pip" install --upgrade pip setuptools wheel --quiet
|
||||
"${VENV_DIR}/bin/pip" install gunicorn --quiet
|
||||
ok "Entorno virtual creado: Python $(${VENV_DIR}/bin/python --version | awk '{print $2}')"
|
||||
|
||||
# Instalar requirements con fallback para Python 3.13+
|
||||
info "Instalando requirements.txt..."
|
||||
info "Instalando paquetes desde requirements.txt..."
|
||||
if "${VENV_DIR}/bin/pip" install -r "${APP_DIR}/requirements.txt" --quiet 2>/dev/null; then
|
||||
ok "Dependencias instaladas correctamente"
|
||||
else
|
||||
warn "Instalación estándar falló — reintentando con --no-build-isolation (Python 3.13+)..."
|
||||
"${VENV_DIR}/bin/pip" install -r "${APP_DIR}/requirements.txt" \
|
||||
--no-build-isolation --quiet
|
||||
ok "Dependencias instaladas (modo compatibilidad)"
|
||||
warn "Reintentando instalación con --no-build-isolation (compatibilidad Python 3.12/3.13)..."
|
||||
"${VENV_DIR}/bin/pip" install -r "${APP_DIR}/requirements.txt" --no-build-isolation --quiet
|
||||
ok "Dependencias instaladas"
|
||||
fi
|
||||
|
||||
# ─── 8. Inicializar base de datos ───────────────────────────────────────────────
|
||||
hdr "8. Inicializando base de datos"
|
||||
# ─── 8. Despliegue de Datos: Restauración o Inicialización ─────────────────────
|
||||
hdr "8. Desplegando esquema y datos de la aplicación"
|
||||
cd "$APP_DIR"
|
||||
|
||||
set -a
|
||||
# shellcheck disable=SC1090
|
||||
source "$APP_ENV"
|
||||
set +a
|
||||
if [[ -f "$SQL_BACKUP_FILE" ]]; then
|
||||
BACKUP_SIZE=$(du -h "$SQL_BACKUP_FILE" | awk '{print $1}')
|
||||
info "Se detectó snapshot de base de datos '${SQL_BACKUP_FILE}' (${BACKUP_SIZE})."
|
||||
info "Restaurando volcado integral de aulas, comisiones, materias, reservas y usuarios..."
|
||||
|
||||
if [[ -f "classrooms_db.sql" ]]; then
|
||||
info "Se detectó el archivo classrooms_db.sql. Restaurando volcado SQL..."
|
||||
# Eliminar DB si ya existe para cargar de 0
|
||||
sudo -u postgres psql -c "DROP DATABASE IF EXISTS ${DB_NAME};" > /dev/null 2>&1
|
||||
# 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
|
||||
|
||||
if sudo -u postgres psql -d "${DB_NAME}" < classrooms_db.sql > /dev/null 2>&1; then
|
||||
ok "Base de datos restaurada correctamente desde classrooms_db.sql."
|
||||
else
|
||||
err "Error al restaurar la base de datos desde el archivo SQL."
|
||||
fi
|
||||
else
|
||||
LANG=en_US.UTF-8 \
|
||||
LC_ALL=en_US.UTF-8 \
|
||||
PYTHONUTF8=1 \
|
||||
PYTHONIOENCODING=utf-8 \
|
||||
FLASK_APP=wsgi.py \
|
||||
"${VENV_DIR}/bin/python" -X utf8 init_db.py
|
||||
|
||||
ok "Esquema, roles, edificios y usuario admin inicializados"
|
||||
# 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
|
||||
ok "Volcado SQL restaurado exitosamente."
|
||||
else
|
||||
warn "Restauración completada con avisos menores — aplicando permisos..."
|
||||
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
|
||||
|
||||
# Ejecutar init_db.py de forma idempotente para verificar roles y migraciones incrementales
|
||||
info "Validando coherencia de modelos con init_db.py..."
|
||||
LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 PYTHONUTF8=1 PYTHONIOENCODING=utf-8 \
|
||||
FLASK_APP=wsgi.py "${VENV_DIR}/bin/python" -X utf8 init_db.py > /dev/null 2>&1 || true
|
||||
ok "Base de datos sincronizada y verificada"
|
||||
else
|
||||
info "No se encontró classrooms_db.sql. Creando esquema desde cero con init_db.py..."
|
||||
LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 PYTHONUTF8=1 PYTHONIOENCODING=utf-8 \
|
||||
FLASK_APP=wsgi.py "${VENV_DIR}/bin/python" -X utf8 init_db.py
|
||||
ok "Esquema, roles RBAC, edificios y usuario admin creados"
|
||||
fi
|
||||
cd - > /dev/null
|
||||
|
||||
# ─── 9. Usuario del sistema ─────────────────────────────────────────────────────
|
||||
hdr "9. Configurando usuario del sistema"
|
||||
# ─── 9. Usuario del Sistema y Permisos de Directorio ───────────────────────────
|
||||
hdr "9. Configurando permisos y usuario de ejecución del sistema"
|
||||
if id "$APP_USER" &>/dev/null; then
|
||||
warn "El usuario '${APP_USER}' ya existe — se omite"
|
||||
info "El usuario de sistema '${APP_USER}' ya existe."
|
||||
else
|
||||
useradd --system --no-create-home --shell /usr/sbin/nologin "$APP_USER"
|
||||
ok "Usuario de sistema '${APP_USER}' creado (sin shell)"
|
||||
@@ -240,10 +268,11 @@ chmod 640 "$APP_ENV"
|
||||
|
||||
mkdir -p "$LOG_DIR"
|
||||
chown -R "${APP_USER}:${APP_USER}" "$LOG_DIR"
|
||||
ok "Permisos aplicados en ${APP_DIR}"
|
||||
chmod 750 "$LOG_DIR"
|
||||
ok "Permisos de seguridad aplicados en ${APP_DIR} y ${LOG_DIR}"
|
||||
|
||||
# ─── 10. Servicio systemd ───────────────────────────────────────────────────────
|
||||
hdr "10. Configurando servicio systemd"
|
||||
# ─── 10. Servicio Systemd (Gunicorn de Producción) ─────────────────────────────
|
||||
hdr "10. Configurando servicio systemd de arranque automático"
|
||||
|
||||
GUNICORN_BIN="${VENV_DIR}/bin/gunicorn"
|
||||
|
||||
@@ -288,41 +317,42 @@ SVCEOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable "${SERVICE_NAME}" > /dev/null 2>&1
|
||||
systemctl start "${SERVICE_NAME}"
|
||||
systemctl restart "${SERVICE_NAME}"
|
||||
sleep 3
|
||||
|
||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
ok "Servicio '${SERVICE_NAME}' corriendo y habilitado al inicio"
|
||||
ok "Servicio '${SERVICE_NAME}' activo y en ejecución"
|
||||
else
|
||||
warn "El servicio no inició correctamente. Revisá los logs:"
|
||||
warn " journalctl -u ${SERVICE_NAME} -n 60 --no-pager"
|
||||
warn "El servicio tardó en arrancar. Podés revisar los logs con:"
|
||||
warn " journalctl -u ${SERVICE_NAME} -n 50 --no-pager"
|
||||
fi
|
||||
|
||||
# ─── Resumen final ──────────────────────────────────────────────────────────────
|
||||
hdr "Instalación completada"
|
||||
# ─── Resumen Final y Datos de Acceso ──────────────────────────────────────────
|
||||
hdr "¡Despliegue Completado con Éxito!"
|
||||
|
||||
IP=$(hostname -I | awk '{print $1}')
|
||||
IP=$(hostname -I 2>/dev/null | awk '{print $1}' || echo "127.0.0.1")
|
||||
|
||||
echo -e " ${BOLD}URL de la aplicación:${RESET}"
|
||||
echo -e " ${CYAN}http://${IP}:5000${RESET}"
|
||||
echo -e " ${BOLD}Acceso Web a la Aplicación:${RESET}"
|
||||
echo -e " ${CYAN}http://${IP}:5000${RESET} o ${CYAN}http://localhost:5000${RESET}"
|
||||
echo ""
|
||||
echo -e " ${BOLD}Credenciales por defecto:${RESET}"
|
||||
echo -e " ${BOLD}Credenciales Iniciales de Administrador:${RESET}"
|
||||
echo -e " Email: ${CYAN}admin@edu-space.com${RESET}"
|
||||
echo -e " Password: ${CYAN}admin123${RESET}"
|
||||
echo ""
|
||||
echo -e " ${BOLD}Base de datos:${RESET}"
|
||||
echo -e " Host: localhost:5432"
|
||||
echo -e " ${BOLD}Base de Datos Desplegada:${RESET}"
|
||||
echo -e " Motor: PostgreSQL (${PG_VER})"
|
||||
echo -e " Base: ${DB_NAME}"
|
||||
echo -e " Usuario: ${DB_USER}"
|
||||
echo -e " Snapshot: $( [ -f "$SQL_BACKUP_FILE" ] && echo "Restaurada desde classrooms_db.sql" || echo "Inicializada limpia" )"
|
||||
echo ""
|
||||
echo -e " ${BOLD}Comandos de gestión:${RESET}"
|
||||
echo -e " ${BOLD}Comandos de Gestión del Servicio:${RESET}"
|
||||
echo -e " Estado: ${CYAN}systemctl status ${SERVICE_NAME}${RESET}"
|
||||
echo -e " Logs: ${CYAN}journalctl -u ${SERVICE_NAME} -f${RESET}"
|
||||
echo -e " Reiniciar: ${CYAN}systemctl restart ${SERVICE_NAME}${RESET}"
|
||||
echo -e " Detener: ${CYAN}systemctl stop ${SERVICE_NAME}${RESET}"
|
||||
echo ""
|
||||
warn "Cambiá la contraseña del admin desde la interfaz web."
|
||||
warn "Los archivos .env contienen credenciales sensibles — NO los incluyas en git."
|
||||
echo -e " ${BOLD}Generar Nuevos Backups:${RESET}"
|
||||
echo -e " ${CYAN}bash backup_db.sh${RESET}"
|
||||
echo ""
|
||||
ok "¡Listo! La aplicación está corriendo en http://${IP}:5000"
|
||||
ok "Despliegue finalizado. El sistema se encuentra 100% operativo."
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user