#!/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}"