feat(deploy): integrar orquestacion de despliegue con SIAX Monitor y vincular dominio soporte.sigmac.app
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
| ID | Objetivo | Origen | Prioridad | Criterio de Aceptación |
|
| 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-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` |
|
||||||
|
|
||||||
@@ -19,6 +20,7 @@
|
|||||||
|
|
||||||
| Fecha | Objetivo | Evidencia |
|
| 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-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-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-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`) |
|
||||||
|
|||||||
@@ -49,6 +49,13 @@
|
|||||||
8. **Bitácora Centralizada de Errores (API-SIGMA-WEBCONTROL):**
|
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`.
|
- 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
|
## Base de Datos
|
||||||
@@ -68,3 +75,4 @@
|
|||||||
|
|
||||||
## Puerto del Servidor
|
## Puerto del Servidor
|
||||||
- **Puerto configurado:** `3008` (por variable `PORT=3008` en `.env`).
|
- **Puerto configurado:** `3008` (por variable `PORT=3008` en `.env`).
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
| Fecha | Tarea / Entregable | Responsable | Archivos Afectados |
|
| 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 | **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 | **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` |
|
||||||
@@ -29,6 +30,7 @@
|
|||||||
|
|
||||||
| Prioridad | Tarea | Descripción | Dependencia |
|
| 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) |
|
| **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 |
|
| **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 |
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
.env
|
.env
|
||||||
|
servers.conf
|
||||||
|
*.log
|
||||||
|
|||||||
@@ -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
|
## 🧪 Pruebas y Auditoría
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -90,8 +90,15 @@ Proveer un sistema web robusto, ágil y seguro para la gestión integral de tick
|
|||||||
- Categoría: `application`
|
- Categoría: `application`
|
||||||
- Tipo: `webapp`
|
- Tipo: `webapp`
|
||||||
- Puerto: `3008`
|
- 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`).
|
- 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.
|
- 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:**
|
- **Base de Datos Central:**
|
||||||
- Host: `192.168.10.149:3306` (CT 114 en Proxmox).
|
- 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`).
|
- Base de datos: `help_desk` (Verificada: 6 tablas activas: `companies`, `departments`, `ticket_respuestas`, `tickets`, `users`, `ticket_visitas`).
|
||||||
|
|||||||
+169
-84
@@ -3,16 +3,20 @@
|
|||||||
# Help Desk — Script de Despliegue a Producción
|
# Help Desk — Script de Despliegue a Producción
|
||||||
# Ecosistema Telcotronics
|
# Ecosistema Telcotronics
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Servidor: server-webapps (192.168.10.160, CT 132 en Proxmox)
|
# Convención del ecosistema (proyecto webapp Node.js):
|
||||||
# Usuario remoto: user_apps
|
# 1. Lee servers.conf (creado desde servers.conf.example, no commiteado).
|
||||||
# Directorio: /home/user_apps/apps/help_desk
|
# 2. Sincroniza código vía rsync hacia el servidor remoto.
|
||||||
# Servicio systemd: siax-app-HELPDESK.service
|
# 3. Instala dependencias y ejecuta setup de BD en el servidor.
|
||||||
# Puerto producción: 3008
|
# 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'
|
GREEN='\033[0;32m'
|
||||||
BLUE='\033[0;34m'
|
BLUE='\033[0;34m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
@@ -20,125 +24,206 @@ RED='\033[0;31m'
|
|||||||
CYAN='\033[0;36m'
|
CYAN='\033[0;36m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
SERVER="${DEPLOY_SERVER:-192.168.10.160}"
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
USER="${DEPLOY_USER:-user_apps}"
|
cd "$SCRIPT_DIR"
|
||||||
DEST="${DEPLOY_DEST:-/home/user_apps/apps/help_desk}"
|
|
||||||
SERVICE_NAME="siax-app-HELPDESK"
|
APP_NAME="HELPDESK"
|
||||||
SUDO_PASS="${DEPLOY_SUDO_PASS:-Microbot%}"
|
APP_PORT="3008"
|
||||||
REMOTE_PORT="${DEPLOY_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}=====================================================${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 "${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
|
# 1. Validar existencia de servers.conf
|
||||||
echo -e "${YELLOW}🔍 [1/6] Verificando requisitos locales y conectividad SSH...${NC}"
|
if [ ! -f "$CONF_FILE" ]; then
|
||||||
if [ ! -f "app.js" ]; 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}"
|
echo -e "${RED}❌ Error: Ejecuta el script desde la raíz del proyecto help_desk.${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f "siax-app-HELPDESK.service" ]; then
|
# 3. Advertencia de cambios sin commitear
|
||||||
echo -e "${RED}❌ Error: No se encontró siax-app-HELPDESK.service en la raíz.${NC}"
|
if [ "$SKIP_GIT" = false ] && command -v git >/dev/null 2>&1; then
|
||||||
exit 1
|
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
|
fi
|
||||||
|
|
||||||
if ! ssh -o BatchMode=yes -o ConnectTimeout=5 "$USER@$SERVER" echo "OK" >/dev/null 2>&1; then
|
# 4. Procesar cada servidor definido en servers.conf
|
||||||
echo -e "${RED}❌ Error: No se pudo conectar vía SSH a $USER@$SERVER.${NC}"
|
grep -vE '^\s*(#|$)' "$CONF_FILE" | while IFS=: read -r DESTINO PUERTO_SSH RUTA_REMOTA; do
|
||||||
|
HOST="${DESTINO#*@}"
|
||||||
|
PUERTO_SSH="${PUERTO_SSH:-22}"
|
||||||
|
|
||||||
|
echo -e "\n${CYAN}-----------------------------------------------------${NC}"
|
||||||
|
echo -e "🎯 Destino: ${YELLOW}$DESTINO${NC} (SSH :$PUERTO_SSH) -> ${YELLOW}$RUTA_REMOTA${NC}"
|
||||||
|
echo -e "${CYAN}-----------------------------------------------------${NC}"
|
||||||
|
|
||||||
|
# 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
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo -e "${GREEN}✓ Conectividad SSH y archivos locales validados.${NC}"
|
echo -e "${GREEN}✓ Conexión SSH establecida.${NC}"
|
||||||
|
|
||||||
# 2. Sincronización con el servidor vía rsync
|
if [ "$CHECK_ONLY" = true ]; then
|
||||||
echo -e "${YELLOW}📡 [2/6] Sincronizando archivos con el servidor remoto vía rsync...${NC}"
|
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
|
||||||
|
|
||||||
|
# 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 \
|
rsync -avz \
|
||||||
-e "ssh -o IdentitiesOnly=yes" \
|
-e "ssh -o IdentitiesOnly=yes -p $PUERTO_SSH" \
|
||||||
--exclude 'node_modules/' \
|
--exclude 'node_modules/' \
|
||||||
--exclude '.git/' \
|
--exclude '.git/' \
|
||||||
--exclude 'scratch/' \
|
--exclude 'scratch/' \
|
||||||
--exclude '.env' \
|
--exclude '.env' \
|
||||||
./ "$USER@$SERVER:$DEST/"
|
--exclude 'servers.conf' \
|
||||||
|
--exclude '*.log' \
|
||||||
|
./ "$DESTINO:$RUTA_REMOTA/"
|
||||||
|
|
||||||
# Asegurar sincronización segura de configuración .env
|
# Sincronizar .env seguro si existe localmente
|
||||||
if [ -f .env ]; then
|
if [ -f .env ]; then
|
||||||
echo -e "${CYAN}Sincronizando archivo .env de configuración a producción...${NC}"
|
echo -e " Sincronizando .env de configuración..."
|
||||||
scp -o IdentitiesOnly=yes .env "$USER@$SERVER:$DEST/.env"
|
scp -o IdentitiesOnly=yes -P "$PUERTO_SSH" .env "$DESTINO:$RUTA_REMOTA/.env"
|
||||||
fi
|
fi
|
||||||
|
echo -e "${GREEN}✓ Archivos sincronizados exitosamente.${NC}"
|
||||||
|
|
||||||
echo -e "${GREEN}✓ Archivos sincronizados exitosamente en $DEST.${NC}"
|
# Instalación de dependencias y migraciones remotas
|
||||||
|
echo -e "${YELLOW}⚙️ [3/5] Instalando dependencias y setup de BD en el servidor...${NC}"
|
||||||
# 3. Preparación de dependencias y migraciones remotas
|
ssh -o IdentitiesOnly=yes -p "$PUERTO_SSH" "$DESTINO" "bash -s" << EOF
|
||||||
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
|
set -e
|
||||||
export PATH="\$HOME/.nvm/versions/node/v24.12.0/bin:/usr/local/bin:/usr/bin:\$PATH"
|
export PATH="\$HOME/.nvm/versions/node/v24.12.0/bin:/usr/local/bin:/usr/bin:\$PATH"
|
||||||
|
cd "$RUTA_REMOTA"
|
||||||
cd "$DEST"
|
npm install --omit=dev --no-audit --no-fund
|
||||||
|
|
||||||
# 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
|
node config/setup.js
|
||||||
EOF
|
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
|
# Reinicio coordinado con SIAX Monitor
|
||||||
echo -e "${YELLOW}🔄 [4/6] Configurando e instalando servicio systemd ($SERVICE_NAME)...${NC}"
|
echo -e "${YELLOW}🔄 [4/5] Coordinando reinicio vía SIAX Monitor ($HOST:8080)...${NC}"
|
||||||
ssh -o IdentitiesOnly=yes "$USER@$SERVER" "bash -s" << EOF
|
RESTART_RES=$(curl -s -m 15 -X POST "http://$HOST:8080/api/apps/$APP_NAME/restart" || true)
|
||||||
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
|
if echo "$RESTART_RES" | grep -q '"success":true'; then
|
||||||
echo -e "${YELLOW}🩺 [5/6] Verificando salud del servicio HTTP en el puerto $REMOTE_PORT...${NC}"
|
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
|
||||||
|
|
||||||
|
# Espera breve para estabilización de socket
|
||||||
sleep 2
|
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
|
# Verificación de salud y métricas de SIAX Monitor
|
||||||
echo -e "${YELLOW}🌐 [6/6] Actualizando estado a ACTIVE en el MCP de Infraestructura...${NC}"
|
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 "
|
node -e "
|
||||||
const http = require('http');
|
const http = require('http');
|
||||||
const payload = JSON.stringify({ status: 'ACTIVE' });
|
const payload = JSON.stringify({
|
||||||
|
status: 'ACTIVE',
|
||||||
|
url: 'https://soporte.sigmac.app'
|
||||||
|
});
|
||||||
const req = http.request({
|
const req = http.request({
|
||||||
hostname: '$SERVER',
|
hostname: '$HOST',
|
||||||
port: 3007,
|
port: 3007,
|
||||||
path: '/api/services/35',
|
path: '/api/services/$MCP_SERVICE_ID',
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Content-Length': Buffer.byteLength(payload)
|
'Content-Length': Buffer.byteLength(payload)
|
||||||
}
|
}
|
||||||
}, (res) => {
|
}, res => {
|
||||||
let d = '';
|
console.log(' ✓ Ficha MCP #$MCP_SERVICE_ID sincronizada (HTTP ' + res.statusCode + ')');
|
||||||
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.on('error', err => console.warn(' ⚠️ MCP aviso:', err.message));
|
||||||
req.write(payload);
|
req.write(payload);
|
||||||
req.end();
|
req.end();
|
||||||
" || true
|
" || true
|
||||||
|
|
||||||
echo -e "-----------------------------------------------------"
|
done
|
||||||
echo -e "${GREEN}🎉 ¡Despliegue a Producción completado exitosamente!${NC}"
|
|
||||||
echo -e "Acceso en red local: ${CYAN}http://$SERVER:$REMOTE_PORT${NC}"
|
echo -e "\n${BLUE}=====================================================${NC}"
|
||||||
echo -e "Servicio: ${CYAN}${SERVICE_NAME}.service${NC}"
|
echo -e "${GREEN}🎉 ¡Despliegue a Producción finalizado con éxito!${NC}"
|
||||||
echo -e "Ficha MCP: ${CYAN}ID 35 (Status: ACTIVE)${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}"
|
echo -e "${BLUE}=====================================================${NC}"
|
||||||
|
|||||||
@@ -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}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}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}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}5)${NC} Desplegar a producción con SIAX Monitor (./desplegar.sh)"
|
||||||
echo -e " ${CYAN}6)${NC} Salir"
|
echo -e " ${CYAN}6)${NC} Consultar estado en SIAX Monitor (./desplegar.sh --check)"
|
||||||
echo -n "Opción [1-6]: "
|
echo -e " ${CYAN}7)${NC} Salir"
|
||||||
|
echo -n "Opción [1-7]: "
|
||||||
read -r OPCION
|
read -r OPCION
|
||||||
|
|
||||||
case "$OPCION" in
|
case "$OPCION" in
|
||||||
@@ -78,10 +79,14 @@ case "$OPCION" in
|
|||||||
npm run check:errors
|
npm run check:errors
|
||||||
;;
|
;;
|
||||||
5)
|
5)
|
||||||
echo -e "${GREEN}Iniciando despliegue hacia CT 132...${NC}"
|
echo -e "${GREEN}Iniciando despliegue hacia producción con SIAX Monitor...${NC}"
|
||||||
./desplegar.sh
|
./desplegar.sh
|
||||||
;;
|
;;
|
||||||
6)
|
6)
|
||||||
|
echo -e "${GREEN}Consultando estado en SIAX Monitor...${NC}"
|
||||||
|
./desplegar.sh --check
|
||||||
|
;;
|
||||||
|
7)
|
||||||
echo "Operación cancelada."
|
echo "Operación cancelada."
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user