feat(deploy): implementar init.sh, desplegar.sh, servicio systemd y desplegar en CT 132

This commit is contained in:
2026-10-17 10:43:53 -05:00
parent 5a7dbf7ab9
commit 18c6cbcf6b
7 changed files with 268 additions and 5 deletions
+3 -3
View File
@@ -10,8 +10,6 @@
| ID | Objetivo | Origen | Prioridad | Criterio de Aceptación | | 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-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` | | **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 | | 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-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-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 | | 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 |
+3
View File
@@ -12,6 +12,9 @@ help_desk/
├── id_agente.md # Identidad del agente en sigma-robot (estado local) ├── id_agente.md # Identidad del agente en sigma-robot (estado local)
├── README.md # Documentación general para humanos ├── README.md # Documentación general para humanos
├── agents.md # Punto de entrada principal para agentes IA ├── 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 ├── .agente/ # Documentación interna del proyecto
│ ├── infraestructura.md # Espejo del inventario global de infraestructura │ ├── infraestructura.md # Espejo del inventario global de infraestructura
│ ├── proyecto_memoria.md # Historial de decisiones y arquitectura │ ├── proyecto_memoria.md # Historial de decisiones y arquitectura
+2 -2
View File
@@ -10,6 +10,8 @@
| Fecha | Tarea / Entregable | Responsable | Archivos Afectados | | 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 | **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 | **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` | | 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 | | 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** | **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 | | **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 | | **Baja** | **SLA y Tiempos de Resolución** | Contador de tiempo transcurrido y alerta de vencimiento de SLA según prioridad del ticket. | Ninguna |
+5
View File
@@ -9,3 +9,8 @@ JWT_SECRET=jwt_secreto_helpdesk
# Bitácora centralizada de errores (API-SIGMA-WEBCONTROL) # Bitácora centralizada de errores (API-SIGMA-WEBCONTROL)
ERROR_REPORTING_URL=https://api.siax-system.net/api/errores ERROR_REPORTING_URL=https://api.siax-system.net/api/errores
WEBCONTROL_API_KEY= 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
Executable
+144
View File
@@ -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}"
Executable
+92
View File
@@ -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
+19
View File
@@ -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