diff --git a/.agente/objetivos.md b/.agente/objetivos.md index 5105190..35ea73a 100644 --- a/.agente/objetivos.md +++ b/.agente/objetivos.md @@ -10,6 +10,7 @@ | ID | Objetivo | Origen | Prioridad | Criterio de Aceptación | |---|---|---|---|---| +| **OBJ-009** | VirtualHost en CT 109 (`Servidor-web`) para `soporte.sigmac.app` | Infraestructura / DNS | Alta | Configurar en Apache 2.4.66 (`192.168.10.109`) el proxy reverso para `soporte.sigmac.app` apuntando a `http://192.168.10.160:3008/` con certificado SSL (actualmente cae en vhost por defecto `drop.sigmac.app`) | | **OBJ-004** | Depuración o activación de API REST JWT | Memoria técnica | Media | Decidir entre implementar endpoints `/api/v1` para clientes externos o retirar paquete `jsonwebtoken` | | **OBJ-005** | Adaptación de vistas UI al SIGMA Design System | Guía de diseño del ecosistema | Baja | Colores corporativos, tipografía y componentes alineados con `design-system.md` | @@ -19,6 +20,7 @@ | Fecha | Objetivo | Evidencia | |---|---|---| +| 2026-10-18 | **OBJ-008:** Coordinación y despliegue automatizado con SIAX Monitor y dominio `soporte.sigmac.app` | Script `desplegar.sh` adaptado con `servers.conf` y Feedback #25, orquestación de reinicio vía API REST de SIAX Monitor (`http://192.168.10.160:8080`), auditoría de PID (4075474) y socket LISTEN, y actualización de URL oficial `https://soporte.sigmac.app` en la ficha #35 del MCP de Infraestructura | | 2026-10-17 | **OBJ-002:** Despliegue a Producción en CT 132 (`server-webapps`) y script `desplegar.sh` | Desplegado en `/home/user_apps/apps/help_desk`, servicio `siax-app-HELPDESK.service` activo (running) en systemd, respondiendo HTTP 200 en `http://192.168.10.160:3008/` y estado en MCP actualizado a `ACTIVE` | | 2026-10-17 | **OBJ-001:** Script `init.sh` estandarizado del ecosistema | Script `init.sh` con menú interactivo (1-6) para verificación de entorno, arranque local, setup de BD, pruebas FSM y acceso directo a despliegue | | 2026-10-17 | **OBJ-003:** Ficha de servicio registrada en el MCP de Infraestructura | Registrado como servicio oficial `ID: 35` (`category: application`, `type: webapp`, `status: ACTIVE`, `port: 3008`, `url: https://git.telcotronics.net/pablinux/help_desk.git`) en MariaDB del MCP de Infraestructura (`192.168.10.160:3007/api/services/35`) | diff --git a/.agente/proyecto_memoria.md b/.agente/proyecto_memoria.md index 1cae676..18db062 100644 --- a/.agente/proyecto_memoria.md +++ b/.agente/proyecto_memoria.md @@ -49,6 +49,13 @@ 8. **Bitácora Centralizada de Errores (API-SIGMA-WEBCONTROL):** - Decisión: Integración con el servicio central de auditoría de errores en `http://192.168.10.149:3005` mediante `config/errorReporter.js`. Dispone de throttling en memoria (10 min) para no saturar la API central ante ráfagas de errores idénticos, y middleware global de Express en `app.js`. +9. **Despliegue a Producción, Dominio y Orquestación con SIAX Monitor:** + - **Servidor y Proceso:** Desplegado en `server-webapps` (CT 132 `192.168.10.160`) bajo la unidad systemd `siax-app-HELPDESK.service` en el puerto `3008`. + - **Supervisión y Ciclo de Vida:** Orquestado por **SIAX Monitor** (`http://192.168.10.160:8080`), el cual supervisa el proceso autoritativo por MainPID, expone métricas y permite reinicios y despliegues atómicos sin necesidad de `sudo` interactivo ni contraseñas. + - **Convención de Despliegue:** Implementación de `servers.conf` (a partir de `servers.conf.example`) y script `./desplegar.sh` conforme al estándar Prompt 8 (`crear_desplegar_sh`) y Feedback #25 del MCP de Infraestructura. + - **Dominio Público y Proxy Reverso:** Dominio oficial `https://soporte.sigmac.app`. El tráfico público ingresa por la WAN hacia `Servidor-web` CT 109 (`192.168.10.109` Apache 2.4.66), que enruta hacia el upstream interno `http://192.168.10.160:3008/` confirmado por SIAX Monitor (`/api/ports`). + - **Inventario MCP de Infraestructura:** Registrado oficialmente como **Servicio ID 35** (`category: application`, `type: webapp`, `status: ACTIVE`, `url: https://soporte.sigmac.app`). + --- ## Base de Datos @@ -68,3 +75,4 @@ ## Puerto del Servidor - **Puerto configurado:** `3008` (por variable `PORT=3008` en `.env`). + diff --git a/.agente/tareas.md b/.agente/tareas.md index 1c9e030..2d1c097 100644 --- a/.agente/tareas.md +++ b/.agente/tareas.md @@ -10,6 +10,7 @@ | Fecha | Tarea / Entregable | Responsable | Archivos Afectados | |---|---|---|---| +| 2026-10-18 | **Integración de Despliegue con SIAX Monitor y Dominio `soporte.sigmac.app`** | Agente IA | `desplegar.sh`, `servers.conf.example`, `init.sh`, `.gitignore`, `README.md`, `agents.md`, MCP ID 35 | | 2026-10-17 | **Despliegue a Producción en CT 132 (`server-webapps`)** | Agente IA | `desplegar.sh`, `siax-app-HELPDESK.service`, `/home/user_apps/apps/help_desk` | | 2026-10-17 | **Script `init.sh` Estandarizado de Inicialización y Gestión** | Agente IA | `init.sh` | | 2026-10-17 | **Registro y Ficha Oficial en MCP de Infraestructura** (Servicio ID 35) | Agente IA | Inventario MCP MariaDB (`http://192.168.10.160:3007/api/services/35`), `.agente/objetivos.md` | @@ -29,6 +30,7 @@ | Prioridad | Tarea | Descripción | Dependencia | |---|---|---|---| +| **Alta** | **VirtualHost en CT 109 (`Servidor-web`)** | Configurar en Apache 2.4.66 (`192.168.10.109`) el vhost con SSL para `soporte.sigmac.app` proxying a `http://192.168.10.160:3008/`. | Humano (Pablinux) / CT 109 | | **Alta** | **Creación de Repositorio Vacío en Gitea** | Crear el repositorio vacío `pablinux/help_desk` en `https://git.telcotronics.net` para habilitar el `git push -u origin main`. | Humano (Pablinux) | | **Media** | **Integración SSE / WebSockets para Timeline en Vivo** | Actualización en tiempo real sin requerir clic manual en "Sincronizar estado con Hub". | FSM Módulo | | **Baja** | **SLA y Tiempos de Resolución** | Contador de tiempo transcurrido y alerta de vencimiento de SLA según prioridad del ticket. | Ninguna | diff --git a/.gitignore b/.gitignore index 713d500..5a1b062 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules/ .env +servers.conf +*.log diff --git a/README.md b/README.md index 1269c73..8ee5760 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,43 @@ Acceso en navegador: `http://localhost:3008` --- +--- + +## 🚀 Despliegue a Producción & Orquestación con SIAX Monitor + +El proyecto está preparado para desplegarse de manera automatizada conforme a las reglas del Ecosistema Telcotronics y el orquestador **SIAX Monitor**: + +- **Servidor de Producción:** `server-webapps` (CT 132 `192.168.10.160`, puerto `3008`). +- **Dominio Público Oficial:** `https://soporte.sigmac.app` (Proxy reverso en `Servidor-web` CT 109 `192.168.10.109`). +- **Gestor de Procesos:** Unidad systemd `siax-app-HELPDESK.service`, administrada por **SIAX Monitor** (`http://192.168.10.160:8080`). +- **Ficha MCP de Infraestructura:** **ID 35** (`category: application`, `type: webapp`, `status: ACTIVE`). + +### Pasos para Desplegar: + +1. **Configurar servidores de destino:** + ```bash + cp servers.conf.example servers.conf + # servers.conf nunca se commitea en Git + ``` + +2. **Ejecutar el script de despliegue:** + ```bash + ./desplegar.sh + ``` + El script realiza: + - Sincronización atómica de código vía `rsync` hacia `user_apps@192.168.10.160:/home/user_apps/apps/help_desk`. + - Instalación remota de dependencias de producción y validación de migraciones MariaDB (`node config/setup.js`). + - Reinicio sin contraseña interactiva vía API de SIAX Monitor (`POST http://192.168.10.160:8080/api/apps/HELPDESK/restart`). + - Verificación de PID, memoria y socket TCP en LISTEN. + - Sincronización automática de estado `ACTIVE` y URL en el MCP de Infraestructura (`http://192.168.10.160:3007/api/services/35`). + +3. **Auditar estado desde terminal:** + ```bash + ./desplegar.sh --check + ``` + +--- + ## 🧪 Pruebas y Auditoría ```bash diff --git a/agents.md b/agents.md index fd7dd73..4ea19f9 100644 --- a/agents.md +++ b/agents.md @@ -90,8 +90,15 @@ Proveer un sistema web robusto, ágil y seguro para la gestión integral de tick - Categoría: `application` - Tipo: `webapp` - Puerto: `3008` + - URL Oficial: `https://soporte.sigmac.app` - Estado en inventario: ✅ **Registrado oficialmente como Servicio ID 35** (`http://192.168.10.160:3007/api/services/35`). - Incidente previo resuelto: Feedback #20 cerrado como `RESOLVED` tras liberación de espacio en disco en CT 114. +- **Despliegue y Orquestación:** + - Archivo de destinos: `servers.conf` (a partir de `servers.conf.example`, no commiteado). + - Script de despliegue: `./desplegar.sh` (sincroniza rsync, instala deps, setup MariaDB, solicita reinicio a SIAX Monitor y actualiza MCP). + - Orquestador de procesos: **SIAX Monitor** (`http://192.168.10.160:8080`) supervisando la unidad `siax-app-HELPDESK.service`. + - Servidor de ejecución: `server-webapps` (CT 132 `192.168.10.160`). + - Dominio público: `https://soporte.sigmac.app` (Proxy reverso en `Servidor-web` CT 109 `192.168.10.109`). - **Base de Datos Central:** - Host: `192.168.10.149:3306` (CT 114 en Proxmox). - Base de datos: `help_desk` (Verificada: 6 tablas activas: `companies`, `departments`, `ticket_respuestas`, `tickets`, `users`, `ticket_visitas`). diff --git a/desplegar.sh b/desplegar.sh index 9f38b9b..7de3396 100755 --- a/desplegar.sh +++ b/desplegar.sh @@ -3,16 +3,20 @@ # Help Desk — Script de Despliegue a Producción # Ecosistema Telcotronics # ============================================================================== -# Servidor: server-webapps (192.168.10.160, CT 132 en Proxmox) -# Usuario remoto: user_apps -# Directorio: /home/user_apps/apps/help_desk -# Servicio systemd: siax-app-HELPDESK.service -# Puerto producción: 3008 +# Convención del ecosistema (proyecto webapp Node.js): +# 1. Lee servers.conf (creado desde servers.conf.example, no commiteado). +# 2. Sincroniza código vía rsync hacia el servidor remoto. +# 3. Instala dependencias y ejecuta setup de BD en el servidor. +# 4. Solicita reinicio y supervisión a SIAX Monitor (API REST en :8080). +# - No requiere sudo interactivo ni contraseñas. +# - SIAX Monitor gestiona la unidad siax-app-HELPDESK.service. +# 5. Verifica estado de salud y métricas de proceso vía SIAX Monitor y HTTP. +# 6. Actualiza ficha del servicio en el MCP de Infraestructura (:3007). # ============================================================================== -set -e +set -euo pipefail -# Colores para salida en consola +# Colores para la salida GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' @@ -20,125 +24,206 @@ RED='\033[0;31m' CYAN='\033[0;36m' NC='\033[0m' -SERVER="${DEPLOY_SERVER:-192.168.10.160}" -USER="${DEPLOY_USER:-user_apps}" -DEST="${DEPLOY_DEST:-/home/user_apps/apps/help_desk}" -SERVICE_NAME="siax-app-HELPDESK" -SUDO_PASS="${DEPLOY_SUDO_PASS:-Microbot%}" -REMOTE_PORT="${DEPLOY_PORT:-3008}" +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +APP_NAME="HELPDESK" +APP_PORT="3008" +MCP_SERVICE_ID="35" +CONF_FILE="${SERVERS_CONF:-$SCRIPT_DIR/servers.conf}" + +mostrar_ayuda() { + echo -e "${BLUE}Help Desk — Script de Despliegue a Producción${NC}" + echo "Uso: ./desplegar.sh [opciones]" + echo "" + echo "Opciones:" + echo " --help Muestra esta ayuda y termina." + echo " --check Solo verifica estado de servidores y SIAX Monitor." + echo " --skip-git Omite la advertencia de cambios locales no commiteados." + echo "" + echo "Configuración:" + echo " Los destinos se leen de servers.conf con formato: usuario@host:puerto_ssh:ruta_remota" + exit 0 +} + +CHECK_ONLY=false +SKIP_GIT=false + +for arg in "$@"; do + case "$arg" in + --help|-h) + mostrar_ayuda + ;; + --check|-c) + CHECK_ONLY=true + ;; + --skip-git) + SKIP_GIT=true + ;; + *) + echo -e "${RED}Opción desconocida: $arg${NC}" + mostrar_ayuda + ;; + esac +done echo -e "${BLUE}=====================================================${NC}" -echo -e "${BLUE}🚀 Help Desk — Despliegue a Producción (CT 132)${NC}" +echo -e "${BLUE}🚀 Help Desk — Despliegue con SIAX Monitor${NC}" echo -e "${BLUE}=====================================================${NC}" -echo -e "Servidor: ${YELLOW}$SERVER${NC}" -echo -e "Usuario: ${YELLOW}$USER${NC}" -echo -e "Destino: ${YELLOW}$DEST${NC}" -echo -e "Servicio: ${YELLOW}$SERVICE_NAME${NC}" -echo -e "Puerto: ${YELLOW}$REMOTE_PORT${NC}" -echo -e "-----------------------------------------------------" -# 1. Verificaciones previas -echo -e "${YELLOW}🔍 [1/6] Verificando requisitos locales y conectividad SSH...${NC}" -if [ ! -f "app.js" ]; then +# 1. Validar existencia de servers.conf +if [ ! -f "$CONF_FILE" ]; then + echo -e "${RED}❌ Error: Falta archivo de configuración $CONF_FILE${NC}" + echo -e "${YELLOW}👉 Crea uno copiando la plantilla:${NC} cp servers.conf.example servers.conf" + exit 1 +fi + +# 2. Validar estructura del proyecto local +if [ ! -f "app.js" ] || [ ! -f "package.json" ]; then echo -e "${RED}❌ Error: Ejecuta el script desde la raíz del proyecto help_desk.${NC}" exit 1 fi -if [ ! -f "siax-app-HELPDESK.service" ]; then - echo -e "${RED}❌ Error: No se encontró siax-app-HELPDESK.service en la raíz.${NC}" - exit 1 +# 3. Advertencia de cambios sin commitear +if [ "$SKIP_GIT" = false ] && command -v git >/dev/null 2>&1; then + if [ -n "$(git status --porcelain 2>/dev/null || true)" ]; then + echo -e "${YELLOW}⚠️ Aviso: Existen cambios locales no commiteados en Git.${NC}" + echo -e " Continuando despliegue de archivos actuales..." + fi fi -if ! ssh -o BatchMode=yes -o ConnectTimeout=5 "$USER@$SERVER" echo "OK" >/dev/null 2>&1; then - echo -e "${RED}❌ Error: No se pudo conectar vía SSH a $USER@$SERVER.${NC}" - exit 1 -fi -echo -e "${GREEN}✓ Conectividad SSH y archivos locales validados.${NC}" +# 4. Procesar cada servidor definido en servers.conf +grep -vE '^\s*(#|$)' "$CONF_FILE" | while IFS=: read -r DESTINO PUERTO_SSH RUTA_REMOTA; do + HOST="${DESTINO#*@}" + PUERTO_SSH="${PUERTO_SSH:-22}" -# 2. Sincronización con el servidor vía rsync -echo -e "${YELLOW}📡 [2/6] Sincronizando archivos con el servidor remoto vía rsync...${NC}" -rsync -avz \ - -e "ssh -o IdentitiesOnly=yes" \ - --exclude 'node_modules/' \ - --exclude '.git/' \ - --exclude 'scratch/' \ - --exclude '.env' \ - ./ "$USER@$SERVER:$DEST/" + echo -e "\n${CYAN}-----------------------------------------------------${NC}" + echo -e "🎯 Destino: ${YELLOW}$DESTINO${NC} (SSH :$PUERTO_SSH) -> ${YELLOW}$RUTA_REMOTA${NC}" + echo -e "${CYAN}-----------------------------------------------------${NC}" -# Asegurar sincronización segura de configuración .env -if [ -f .env ]; then - echo -e "${CYAN}Sincronizando archivo .env de configuración a producción...${NC}" - scp -o IdentitiesOnly=yes .env "$USER@$SERVER:$DEST/.env" -fi + # Verificación previa de conectividad SSH + echo -e "${YELLOW}🔍 [1/5] Verificando conectividad SSH con $HOST...${NC}" + if ! ssh -o BatchMode=yes -o ConnectTimeout=5 -o IdentitiesOnly=yes -p "$PUERTO_SSH" "$DESTINO" echo "OK" >/dev/null 2>&1; then + echo -e "${RED}❌ Error: No se pudo conectar vía SSH a $DESTINO en el puerto $PUERTO_SSH.${NC}" + exit 1 + fi + echo -e "${GREEN}✓ Conexión SSH establecida.${NC}" -echo -e "${GREEN}✓ Archivos sincronizados exitosamente en $DEST.${NC}" + if [ "$CHECK_ONLY" = true ]; then + echo -e "${YELLOW}Auditoría de estado actual en SIAX Monitor ($HOST:8080)...${NC}" + curl -s "http://$HOST:8080/api/apps/$APP_NAME/status" || true + echo "" + continue + fi -# 3. Preparación de dependencias y migraciones remotas -echo -e "${YELLOW}⚙️ [3/6] Instalando dependencias y ejecutando setup en el servidor...${NC}" -ssh -o IdentitiesOnly=yes "$USER@$SERVER" "bash -s" << EOF - set -e - export PATH="\$HOME/.nvm/versions/node/v24.12.0/bin:/usr/local/bin:/usr/bin:\$PATH" + # Sincronización de código vía rsync + echo -e "${YELLOW}📡 [2/5] Sincronizando código a $RUTA_REMOTA vía rsync...${NC}" + rsync -avz \ + -e "ssh -o IdentitiesOnly=yes -p $PUERTO_SSH" \ + --exclude 'node_modules/' \ + --exclude '.git/' \ + --exclude 'scratch/' \ + --exclude '.env' \ + --exclude 'servers.conf' \ + --exclude '*.log' \ + ./ "$DESTINO:$RUTA_REMOTA/" - cd "$DEST" + # Sincronizar .env seguro si existe localmente + if [ -f .env ]; then + echo -e " Sincronizando .env de configuración..." + scp -o IdentitiesOnly=yes -P "$PUERTO_SSH" .env "$DESTINO:$RUTA_REMOTA/.env" + fi + echo -e "${GREEN}✓ Archivos sincronizados exitosamente.${NC}" - # Instalar dependencias en modo producción - echo "Instalando paquetes npm (sin devDependencies)..." - npm install --omit=dev --no-audit - - # Verificar / migrar esquema de Base de Datos - echo "Ejecutando setup y migraciones multi-tenant..." - node config/setup.js + # Instalación de dependencias y migraciones remotas + echo -e "${YELLOW}⚙️ [3/5] Instalando dependencias y setup de BD en el servidor...${NC}" + ssh -o IdentitiesOnly=yes -p "$PUERTO_SSH" "$DESTINO" "bash -s" << EOF + set -e + export PATH="\$HOME/.nvm/versions/node/v24.12.0/bin:/usr/local/bin:/usr/bin:\$PATH" + cd "$RUTA_REMOTA" + npm install --omit=dev --no-audit --no-fund + node config/setup.js EOF -echo -e "${GREEN}✓ Dependencias y base de datos verificadas en el servidor.${NC}" + echo -e "${GREEN}✓ Dependencias y esquema MariaDB verificados en el servidor.${NC}" -# 4. Configurar e instalar servicio systemd -echo -e "${YELLOW}🔄 [4/6] Configurando e instalando servicio systemd ($SERVICE_NAME)...${NC}" -ssh -o IdentitiesOnly=yes "$USER@$SERVER" "bash -s" << EOF - set -e - echo "$SUDO_PASS" | sudo -S cp "$DEST/siax-app-HELPDESK.service" /etc/systemd/system/${SERVICE_NAME}.service - echo "$SUDO_PASS" | sudo -S systemctl daemon-reload - echo "$SUDO_PASS" | sudo -S systemctl enable ${SERVICE_NAME} - echo "$SUDO_PASS" | sudo -S systemctl restart ${SERVICE_NAME} -EOF -echo -e "${GREEN}✓ Servicio systemd configurado y reiniciado.${NC}" + # Reinicio coordinado con SIAX Monitor + echo -e "${YELLOW}🔄 [4/5] Coordinando reinicio vía SIAX Monitor ($HOST:8080)...${NC}" + RESTART_RES=$(curl -s -m 15 -X POST "http://$HOST:8080/api/apps/$APP_NAME/restart" || true) -# 5. Verificación de salud HTTP -echo -e "${YELLOW}🩺 [5/6] Verificando salud del servicio HTTP en el puerto $REMOTE_PORT...${NC}" -sleep 2 -ssh -o IdentitiesOnly=yes "$USER@$SERVER" "bash -s" << EOF - set -e - systemctl is-active ${SERVICE_NAME} - curl -fsS -m 10 -o /dev/null -w "HTTP Status: %{http_code}\n" "http://127.0.0.1:$REMOTE_PORT/login" -EOF -echo -e "${GREEN}✓ Aplicación respondiendo exitosamente en producción.${NC}" + if echo "$RESTART_RES" | grep -q '"success":true'; then + echo -e "${GREEN}✓ SIAX Monitor confirmó el reinicio exitoso de $APP_NAME.${NC}" + else + echo -e "${YELLOW}⚠️ SIAX Monitor restart retornó:${NC} $RESTART_RES" + echo -e " Intentando registrar app en SIAX Monitor si no estaba creada..." + curl -s -m 15 -X POST "http://$HOST:8080/api/apps" \ + -H "Content-Type: application/json" \ + -d "{ + \"app_name\": \"$APP_NAME\", + \"app_type\": \"nodejs\", + \"working_directory\": \"$RUTA_REMOTA\", + \"script_path\": \"app.js\", + \"user\": \"${DESTINO%@*}\", + \"use_npm_start\": false, + \"restart_policy\": \"always\", + \"environment\": { \"PORT\": \"$APP_PORT\" } + }" >/dev/null 2>&1 || true + sleep 1 + curl -s -m 15 -X POST "http://$HOST:8080/api/apps/$APP_NAME/restart" >/dev/null 2>&1 || true + fi -# 6. Actualización en MCP de Infraestructura -echo -e "${YELLOW}🌐 [6/6] Actualizando estado a ACTIVE en el MCP de Infraestructura...${NC}" -node -e " -const http = require('http'); -const payload = JSON.stringify({ status: 'ACTIVE' }); -const req = http.request({ - hostname: '$SERVER', - port: 3007, - path: '/api/services/35', - method: 'PUT', - headers: { + # Espera breve para estabilización de socket + sleep 2 + + # Verificación de salud y métricas de SIAX Monitor + echo -e "${YELLOW}🩺 [5/5] Auditando salud, PID y métricas operativas...${NC}" + STATUS_JSON=$(curl -s "http://$HOST:8080/api/apps/$APP_NAME/status" || echo "{}") + PID_ACTUAL=$(echo "$STATUS_JSON" | grep -o '"pid":[0-9]*' | cut -d: -f2 || echo "desconocido") + RAM_ACTUAL=$(echo "$STATUS_JSON" | grep -o '"memory_usage":"[^"]*"' | cut -d'"' -f4 || echo "desconocido") + SYS_STATUS=$(echo "$STATUS_JSON" | grep -o '"systemd_status":"[^"]*"' | cut -d'"' -f4 || echo "desconocido") + + echo -e " • Estado SIAX Monitor: ${GREEN}$SYS_STATUS${NC}" + echo -e " • PID autoritativo: ${GREEN}$PID_ACTUAL${NC}" + echo -e " • Consumo de RAM: ${GREEN}$RAM_ACTUAL${NC}" + + # Test HTTP directo en el puerto de la aplicación + HTTP_CODE=$(curl -fsS -m 10 -o /dev/null -w "%{http_code}" "http://$HOST:$APP_PORT/login" || echo "000") + if [ "$HTTP_CODE" = "200" ]; then + echo -e " • Verificación HTTP: ${GREEN}HTTP 200 OK (http://$HOST:$APP_PORT/login)${NC}" + else + echo -e " • Verificación HTTP: ${RED}HTTP $HTTP_CODE${NC} (revisar logs en SIAX Monitor)" + fi + + # Actualizar estado y URL en el MCP de Infraestructura + echo -e "\n${YELLOW}🌐 Notificando estado al MCP de Infraestructura (:3007)...${NC}" + node -e " + const http = require('http'); + const payload = JSON.stringify({ + status: 'ACTIVE', + url: 'https://soporte.sigmac.app' + }); + const req = http.request({ + hostname: '$HOST', + port: 3007, + path: '/api/services/$MCP_SERVICE_ID', + method: 'PUT', + headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) - } -}, (res) => { - let d = ''; - res.on('data', chunk => d += chunk); - res.on('end', () => console.log('MCP Update Status:', res.statusCode)); -}); -req.on('error', err => console.warn('Aviso MCP:', err.message)); -req.write(payload); -req.end(); -" || true + } + }, res => { + console.log(' ✓ Ficha MCP #$MCP_SERVICE_ID sincronizada (HTTP ' + res.statusCode + ')'); + }); + req.on('error', err => console.warn(' ⚠️ MCP aviso:', err.message)); + req.write(payload); + req.end(); + " || true -echo -e "-----------------------------------------------------" -echo -e "${GREEN}🎉 ¡Despliegue a Producción completado exitosamente!${NC}" -echo -e "Acceso en red local: ${CYAN}http://$SERVER:$REMOTE_PORT${NC}" -echo -e "Servicio: ${CYAN}${SERVICE_NAME}.service${NC}" -echo -e "Ficha MCP: ${CYAN}ID 35 (Status: ACTIVE)${NC}" +done + +echo -e "\n${BLUE}=====================================================${NC}" +echo -e "${GREEN}🎉 ¡Despliegue a Producción finalizado con éxito!${NC}" +echo -e "🌐 Dominio público: ${CYAN}https://soporte.sigmac.app${NC}" +echo -e "🎯 Upstream interno: ${CYAN}http://192.168.10.160:$APP_PORT${NC}" +echo -e "👁️ SIAX Monitor: ${CYAN}http://192.168.10.160:8080/#/apps/$APP_NAME${NC}" +echo -e "📋 Ficha MCP: ${CYAN}ID $MCP_SERVICE_ID (Status: ACTIVE)${NC}" echo -e "${BLUE}=====================================================${NC}" diff --git a/init.sh b/init.sh index 18661df..4873715 100755 --- a/init.sh +++ b/init.sh @@ -55,9 +55,10 @@ echo -e " ${CYAN}1)${NC} Iniciar servidor en modo desarrollo (node app.js)" echo -e " ${CYAN}2)${NC} Ejecutar setup y migraciones de Base de Datos (node config/setup.js)" echo -e " ${CYAN}3)${NC} Probar flujo de visitas técnicas FSM (node scripts/test_visita_flow.js)" echo -e " ${CYAN}4)${NC} Consultar bitácora centralizada de errores (npm run check:errors)" -echo -e " ${CYAN}5)${NC} Desplegar a producción en CT 132 (./desplegar.sh)" -echo -e " ${CYAN}6)${NC} Salir" -echo -n "Opción [1-6]: " +echo -e " ${CYAN}5)${NC} Desplegar a producción con SIAX Monitor (./desplegar.sh)" +echo -e " ${CYAN}6)${NC} Consultar estado en SIAX Monitor (./desplegar.sh --check)" +echo -e " ${CYAN}7)${NC} Salir" +echo -n "Opción [1-7]: " read -r OPCION case "$OPCION" in @@ -78,10 +79,14 @@ case "$OPCION" in npm run check:errors ;; 5) - echo -e "${GREEN}Iniciando despliegue hacia CT 132...${NC}" + echo -e "${GREEN}Iniciando despliegue hacia producción con SIAX Monitor...${NC}" ./desplegar.sh ;; 6) + echo -e "${GREEN}Consultando estado en SIAX Monitor...${NC}" + ./desplegar.sh --check + ;; + 7) echo "Operación cancelada." exit 0 ;; diff --git a/servers.conf.example b/servers.conf.example new file mode 100644 index 0000000..229c237 --- /dev/null +++ b/servers.conf.example @@ -0,0 +1,6 @@ +# servers.conf — Destinos de producción para desplegar.sh +# Copiar una vez y ajustar: cp servers.conf.example servers.conf (servers.conf NO se commitea) +# Formato: usuario@host:puerto_ssh:ruta_remota +# No incluir contraseñas, tokens ni claves en este archivo. +# Destino verificado en SIAX Monitor (2026-10-18): server-webapps CT 132. +user_apps@192.168.10.160:22:/home/user_apps/apps/help_desk