145 lines
5.5 KiB
Bash
Executable File
145 lines
5.5 KiB
Bash
Executable File
#!/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}"
|