From 18c6cbcf6b2942f12f0df73d71841a222a2be2c8 Mon Sep 17 00:00:00 2001 From: pablinux Date: Sat, 17 Oct 2026 10:43:53 -0500 Subject: [PATCH] feat(deploy): implementar init.sh, desplegar.sh, servicio systemd y desplegar en CT 132 --- .agente/objetivos.md | 6 +- .agente/proyecto_estructura.md | 3 + .agente/tareas.md | 4 +- .env.example | 5 ++ desplegar.sh | 144 +++++++++++++++++++++++++++++++++ init.sh | 92 +++++++++++++++++++++ siax-app-HELPDESK.service | 19 +++++ 7 files changed, 268 insertions(+), 5 deletions(-) create mode 100755 desplegar.sh create mode 100755 init.sh create mode 100644 siax-app-HELPDESK.service diff --git a/.agente/objetivos.md b/.agente/objetivos.md index 6eb9492..5105190 100644 --- a/.agente/objetivos.md +++ b/.agente/objetivos.md @@ -10,8 +10,6 @@ | ID | Objetivo | Origen | Prioridad | Criterio de Aceptación | |---|---|---|---|---| -| **OBJ-001** | Script `init.sh` estandarizado del ecosistema | Estándar Telcotronics | Alta | Menú interactivo/flags para arranque local, validación de variables de entorno y conexión con MariaDB | -| **OBJ-002** | Script `desplegar.sh` para producción | Estándar Telcotronics | Media | Automatización de sincronización y preparación hacia servidor de producción Proxmox | | **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` | @@ -21,7 +19,9 @@ | Fecha | Objetivo | Evidencia | |---|---|---| -| 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: INACTIVE`, `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`) | +| 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`) | | 2026-10-17 | **OBJ-007:** Módulo de Asignación de Tareas y Visitas Técnicas (FSM) integrado con `tareas.telcotronics.com` | Endpoints externos en CT 132 activados (`POST /api/external/tareas` y `GET /api/external/tareas/:id/status`), tabla `ticket_visitas` en MariaDB con `historial_json`, servicio `config/tareasHubService.js`, modelo `models/TicketVisita.js`, rutas `/agent/ticket/:id/visita` y `/sync`, y Mini-Timeline en `views/agent/view-ticket.ejs` | | 2026-10-16 | **OBJ-006:** Integración de bitácora centralizada de errores y remoto Git | Módulo `config/errorReporter.js`, middleware global en `app.js`, script `scripts/consultar_errores.js` (`npm run check:errors`) y remoto `git.telcotronics.net/pablinux/help_desk.git` configurado | | 2026-10-16 | **OBJ-000:** Inicialización documental estandarizada según estándar Telcotronics | Estructura `.agente/` completa, espejo `infraestructura.md` sincronizado al 100%, `id_agente.md`, `agents.md` y `README.md` alineados | diff --git a/.agente/proyecto_estructura.md b/.agente/proyecto_estructura.md index 5112f2d..9c15502 100644 --- a/.agente/proyecto_estructura.md +++ b/.agente/proyecto_estructura.md @@ -12,6 +12,9 @@ help_desk/ ├── id_agente.md # Identidad del agente en sigma-robot (estado local) ├── README.md # Documentación general para humanos ├── agents.md # Punto de entrada principal para agentes IA +├── init.sh # Script bash interactivo para gestión y entorno local +├── desplegar.sh # Script de despliegue automatizado hacia producción (CT 132) +├── siax-app-HELPDESK.service # Unidad de servicio systemd gestionada por SIAX en CT 132 ├── .agente/ # Documentación interna del proyecto │ ├── infraestructura.md # Espejo del inventario global de infraestructura │ ├── proyecto_memoria.md # Historial de decisiones y arquitectura diff --git a/.agente/tareas.md b/.agente/tareas.md index 10418d7..1c9e030 100644 --- a/.agente/tareas.md +++ b/.agente/tareas.md @@ -10,6 +10,8 @@ | Fecha | Tarea / Entregable | Responsable | Archivos Afectados | |---|---|---|---| +| 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` | | 2026-10-17 | **Módulo FSM de Visitas Técnicas integrado con Hub de Tareas** (`tareas.telcotronics.com`) | Agente IA | `models/TicketVisita.js`, `config/tareasHubService.js`, `routes/agent.js`, `config/setup.js` | | 2026-10-17 | **Mini-Timeline Operativo en Vivo con Bitácora de Eventos y Firma Digital** | Agente IA | `views/agent/view-ticket.ejs` | @@ -28,7 +30,5 @@ | Prioridad | Tarea | Descripción | Dependencia | |---|---|---|---| | **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) | -| **Alta** | **Script `init.sh` Estandarizado** | Script bash con menú interactivo para verificar variables de entorno, pool MariaDB y dependencias npm antes del arranque. | Ninguna | -| **Media** | **Script `desplegar.sh` para Producción** | Automatización de rsync y reinicio de servicio para despliegue en contenedor Proxmox (CT 132 u homólogo). | Ninguna | | **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/.env.example b/.env.example index 3181e73..6dbb153 100644 --- a/.env.example +++ b/.env.example @@ -9,3 +9,8 @@ JWT_SECRET=jwt_secreto_helpdesk # Bitácora centralizada de errores (API-SIGMA-WEBCONTROL) ERROR_REPORTING_URL=https://api.siax-system.net/api/errores WEBCONTROL_API_KEY= + +# Hub de Tareas FSM (tareas.telcotronics.com) +HUB_TAREAS_URL=https://tareas.telcotronics.com/api/external +HUB_TAREAS_API_KEY=sigma_crm_test_key_123 + diff --git a/desplegar.sh b/desplegar.sh new file mode 100755 index 0000000..9f38b9b --- /dev/null +++ b/desplegar.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +# ============================================================================== +# 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 +# ============================================================================== + +set -e + +# Colores para salida en consola +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +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}" + +echo -e "${BLUE}=====================================================${NC}" +echo -e "${BLUE}🚀 Help Desk — Despliegue a Producción (CT 132)${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 + 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 +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}" + +# 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/" + +# 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 + +echo -e "${GREEN}✓ Archivos sincronizados exitosamente en $DEST.${NC}" + +# 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" + + cd "$DEST" + + # 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 +EOF +echo -e "${GREEN}✓ Dependencias y base de datos verificadas 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}" + +# 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}" + +# 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: { + '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 + +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}" +echo -e "${BLUE}=====================================================${NC}" diff --git a/init.sh b/init.sh new file mode 100755 index 0000000..18661df --- /dev/null +++ b/init.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +# ============================================================================== +# Help Desk — Script de Inicialización y Gestión Local +# Ecosistema Telcotronics +# ============================================================================== + +set -e + +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +CYAN='\033[0;36m' +NC='\033[0m' + +echo -e "${BLUE}=====================================================${NC}" +echo -e "${BLUE}🔧 Help Desk — Inicialización y Entorno Local${NC}" +echo -e "${BLUE}=====================================================${NC}" + +# 1. Verificar Node.js +echo -e "${YELLOW}[1/4] Verificando versión de Node.js...${NC}" +NODE_VER=$(node -v 2>/dev/null || true) +if [ -z "$NODE_VER" ]; then + echo -e "${RED}❌ Error: Node.js no está instalado.${NC}" + exit 1 +fi +echo -e "${GREEN}✓ Node.js detectado: $NODE_VER${NC}" + +# 2. Verificar o generar archivo .env +echo -e "${YELLOW}[2/4] Verificando configuración .env...${NC}" +if [ ! -f .env ]; then + if [ -f .env.example ]; then + cp .env.example .env + echo -e "${CYAN}ℹ️ Se ha creado .env a partir de .env.example. Por favor revisa las credenciales de BD.${NC}" + else + echo -e "${RED}❌ Error: No se encontró .env ni .env.example.${NC}" + exit 1 + fi +else + echo -e "${GREEN}✓ Archivo .env presente.${NC}" +fi + +# 3. Verificar dependencias +echo -e "${YELLOW}[3/4] Verificando dependencias npm...${NC}" +if [ ! -d "node_modules" ]; then + echo -e "${CYAN}Instalando dependencias de Node.js...${NC}" + npm install +else + echo -e "${GREEN}✓ Directorio node_modules presente.${NC}" +fi + +# 4. Menú de Opciones +echo -e "${YELLOW}[4/4] Selecciona una acción:${NC}" +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]: " +read -r OPCION + +case "$OPCION" in + 1) + echo -e "${GREEN}Iniciando Help Desk en http://localhost:3008...${NC}" + node app.js + ;; + 2) + echo -e "${GREEN}Ejecutando setup y migraciones de MariaDB...${NC}" + node config/setup.js + ;; + 3) + echo -e "${GREEN}Ejecutando prueba integral de visitas técnicas...${NC}" + node scripts/test_visita_flow.js + ;; + 4) + echo -e "${GREEN}Consultando bitácora de errores...${NC}" + npm run check:errors + ;; + 5) + echo -e "${GREEN}Iniciando despliegue hacia CT 132...${NC}" + ./desplegar.sh + ;; + 6) + echo "Operación cancelada." + exit 0 + ;; + *) + echo -e "${RED}Opción no válida.${NC}" + exit 1 + ;; +esac diff --git a/siax-app-HELPDESK.service b/siax-app-HELPDESK.service new file mode 100644 index 0000000..ba4a543 --- /dev/null +++ b/siax-app-HELPDESK.service @@ -0,0 +1,19 @@ +[Unit] +Description=SIAX Managed Service: HELPDESK +After=network.target + +[Service] +Type=simple +User=user_apps +WorkingDirectory=/home/user_apps/apps/help_desk +Environment=PATH=/home/user_apps/.nvm/versions/node/v24.12.0/bin:/usr/local/bin:/usr/bin:/bin +Environment=NODE_ENV=production +Environment=PORT=3008 +ExecStart=/home/user_apps/.nvm/versions/node/v24.12.0/bin/node /home/user_apps/apps/help_desk/app.js + +Restart=always +RestartSec=10 +SyslogIdentifier=siax-app-HELPDESK + +[Install] +WantedBy=multi-user.target