✨ Nuevas funcionalidades: - API REST unificada en puerto 8080 (eliminado CORS) - WebSocket para logs en tiempo real desde journalctl - Integración completa con systemd para gestión de servicios - Escaneo automático de procesos Node.js y Python - Rate limiting (1 operación/segundo por app) - Interface web moderna con Tailwind CSS (tema oscuro) - Documentación API estilo Swagger completamente en español 🎨 Interface Web (todas las páginas en español): - Dashboard con estadísticas en tiempo real - Visor de escaneo de procesos con filtros - Formulario de registro de aplicaciones con variables de entorno - Visor de logs en tiempo real con WebSocket y sidebar - Página de selección de apps detectadas - Documentación completa de API REST 🏗️ Arquitectura: - Módulo models: ServiceConfig, ManagedApp, AppStatus - Módulo systemd: wrapper de systemctl, generador de .service, parser - Módulo orchestrator: AppManager, LifecycleManager con validaciones - Módulo api: handlers REST, WebSocket manager, DTOs - Servidor unificado en puerto 8080 (Web + API + WS) 🔧 Mejoras técnicas: - Eliminación de CORS mediante servidor unificado - Separación clara frontend/backend con carga dinámica - Thread-safe con Arc<DashMap> para estado compartido - Reconciliación de estados: sysinfo vs systemd - Validaciones de paths, usuarios y configuraciones - Manejo robusto de errores con thiserror 📝 Documentación: - README.md actualizado con arquitectura completa - EJEMPLOS.md con casos de uso detallados - ESTADO_PROYECTO.md con progreso de Fase 4 - API docs interactiva en /api-docs - Script de despliegue mejorado con health checks 🚀 Producción: - Deployment script con validaciones - Health checks y rollback capability - Configuración de sudoers para systemctl - Hardening de seguridad en servicios systemd
11 KiB
11 KiB
SIAX Agent - Sistema de Monitoreo y Gestión de Procesos
Sistema completo de monitoreo y gestión de aplicaciones Node.js y Python con integración systemd, API REST y streaming de logs en tiempo real.
Características
✅ Monitoreo en Tiempo Real
- Detección automática de procesos Node.js y Python
- Métricas de CPU y RAM
- Reconciliación con systemd para detectar estados inconsistentes
- Reporte automático a API central cloud
🔧 Gestión de Servicios
- Registro dinámico de aplicaciones
- Generación automática de archivos
.servicepara systemd - Control de ciclo de vida: start, stop, restart
- Soporte para Node.js y Python/FastAPI
- Rate limiting para prevenir spam de operaciones
📊 Interface Web Local
- Dashboard de procesos en ejecución
- Escaneo y detección automática
- Visualizador de logs del sistema
- Control de aplicaciones (solo VPN)
🔌 API REST
- Endpoints para gestión completa de aplicaciones
- WebSocket para streaming de logs en tiempo real
- Documentación OpenAPI/Swagger ready
🔒 Seguridad
- Interface web solo accesible vía VPN
- Validaciones de permisos sudo
- Sistema de rate limiting
- Detección de discrepancias de estado
Arquitectura
┌─────────────────────────────────────┐
│ API Central Cloud │
│ https://api.siax-system.net │
│ - Dashboard público analytics │
│ - Recibe reportes de agents │
└──────────────┬──────────────────────┘
│ POST /apps_servcs/apps
│ (reportes de estado)
│
┌──────────────▼──────────────────────┐
│ SIAX Agent (local en servidor) │
│ http://192.168.x.x:8080 (VPN only) │
│ │
│ Componentes: │
│ 1. Monitor (background) │
│ 2. Interface Web (puerto 8080) │
│ 3. API REST (puerto 8081) │
│ 4. WebSocket Logs (puerto 8081) │
└──────────────────────────────────────┘
Instalación
Requisitos Previos
- Linux con systemd
- Rust 1.70+ (instalación abajo)
- Acceso sudo para gestión de servicios
Instalar Rust (si no está instalado)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
Instalación Automática
# Clonar repositorio
git clone <repo-url>
cd siax_monitor
# Ejecutar script de despliegue
sudo ./desplegar_agent.sh
El script automáticamente:
- ✅ Verifica dependencias
- ✅ Compila en modo release
- ✅ Crea usuario del sistema
- ✅ Instala binario en
/opt/siax-agent - ✅ Configura sudoers para systemctl
- ✅ Crea y habilita servicio systemd
- ✅ Inicia el agente
- ✅ Verifica instalación
Instalación Manual
# Compilar
cargo build --release
# Copiar binario
sudo mkdir -p /opt/siax-agent
sudo cp target/release/siax_monitor /opt/siax-agent/siax-agent
# Crear usuario
sudo useradd --system --no-create-home siax-agent
# Configurar sudoers (ver sección Configuración)
# Crear servicio systemd (ver ejemplo abajo)
sudo nano /etc/systemd/system/siax-agent.service
# Habilitar e iniciar
sudo systemctl daemon-reload
sudo systemctl enable siax-agent
sudo systemctl start siax-agent
Configuración
Archivo de Configuración
/opt/siax-agent/config/monitored_apps.json
{
"apps": [
{
"name": "app_tareas",
"port": 3000
},
{
"name": "fidelizacion",
"port": 3001
}
]
}
Configuración de Sudoers
/etc/sudoers.d/siax-agent
siax-agent ALL=(ALL) NOPASSWD: /bin/systemctl start *
siax-agent ALL=(ALL) NOPASSWD: /bin/systemctl stop *
siax-agent ALL=(ALL) NOPASSWD: /bin/systemctl restart *
siax-agent ALL=(ALL) NOPASSWD: /bin/systemctl status *
siax-agent ALL=(ALL) NOPASSWD: /bin/systemctl enable *
siax-agent ALL=(ALL) NOPASSWD: /bin/systemctl disable *
siax-agent ALL=(ALL) NOPASSWD: /bin/systemctl daemon-reload
siax-agent ALL=(ALL) NOPASSWD: /bin/journalctl *
Variables de Entorno (main.rs)
let server_name = "siax-intel"; // Nombre del servidor
let api_key = "ak_xxx..."; // API key para cloud
let cloud_url = "https://api.siax-system.net/api/apps_servcs/apps";
Uso
Comandos del Sistema
# Ver estado del agente
sudo systemctl status siax-agent
# Ver logs en tiempo real
sudo journalctl -u siax-agent -f
# Reiniciar agente
sudo systemctl restart siax-agent
# Detener agente
sudo systemctl stop siax-agent
Interface Web
http://localhost:8080
Páginas disponibles:
/- Inicio/scan- Escanear procesos Node.js/select- Seleccionar y agregar procesos/logs- Ver logs del sistema
API REST
Base URL: http://localhost:8081
Listar Aplicaciones
GET /api/apps
Response:
{
"success": true,
"data": {
"apps": ["app1", "app2"],
"total": 2
}
}
Registrar Nueva Aplicación
POST /api/apps
Content-Type: application/json
{
"app_name": "mi-app",
"script_path": "/opt/apps/mi-app/index.js",
"working_directory": "/opt/apps/mi-app",
"user": "nodejs",
"environment": {
"PORT": "3000",
"NODE_ENV": "production"
},
"restart_policy": "always",
"app_type": "nodejs",
"description": "Mi aplicación"
}
Iniciar Aplicación
POST /api/apps/:name/start
Detener Aplicación
POST /api/apps/:name/stop
Reiniciar Aplicación
POST /api/apps/:name/restart
Obtener Estado
GET /api/apps/:name/status
Response:
{
"success": true,
"data": {
"name": "mi-app",
"status": "running",
"pid": 12345,
"cpu_usage": 2.5,
"memory_usage": "128.50 MB",
"systemd_status": "active",
"last_updated": "2026-01-12 10:30:00"
}
}
Eliminar Aplicación
DELETE /api/apps/:name
WebSocket para Logs
// Conectar a logs en tiempo real
const ws = new WebSocket('ws://localhost:8081/ws/logs/mi-app');
ws.onmessage = (event) => {
console.log('Log:', event.data);
};
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
Ejemplo con wscat:
wscat -c ws://localhost:8081/ws/logs/mi-app
Ejemplos de Uso
Registrar una app Node.js
curl -X POST http://localhost:8081/api/apps \
-H "Content-Type: application/json" \
-d '{
"app_name": "api-backend",
"script_path": "/home/nodejs/api-backend/server.js",
"working_directory": "/home/nodejs/api-backend",
"user": "nodejs",
"environment": {
"PORT": "3000",
"NODE_ENV": "production"
},
"restart_policy": "always",
"app_type": "nodejs",
"description": "API Backend Principal"
}'
Registrar una app Python (FastAPI)
curl -X POST http://localhost:8081/api/apps \
-H "Content-Type: application/json" \
-d '{
"app_name": "ml-service",
"script_path": "/home/python/ml-service/main.py",
"working_directory": "/home/python/ml-service",
"user": "python",
"environment": {
"PORT": "8000",
"WORKERS": "4"
},
"restart_policy": "on-failure",
"app_type": "python"
}'
Reiniciar una aplicación
curl -X POST http://localhost:8081/api/apps/api-backend/restart
Ver estado de todas las apps
curl http://localhost:8081/api/apps | jq
Estructura del Proyecto
siax_monitor/
├── src/
│ ├── main.rs # Entry point
│ ├── lib.rs # Módulo raíz
│ ├── monitor.rs # Monitor de procesos + reconciliación systemd
│ ├── interface.rs # Interface web
│ ├── logger.rs # Sistema de logs
│ ├── config.rs # Gestión de configuración
│ ├── models/ # Modelos de datos
│ │ ├── mod.rs
│ │ ├── app.rs # ManagedApp, AppStatus, ServiceStatus
│ │ └── service_config.rs # ServiceConfig, AppType, RestartPolicy
│ ├── systemd/ # Integración con systemd
│ │ ├── mod.rs
│ │ ├── systemctl.rs # Wrapper de systemctl
│ │ ├── service_generator.rs # Generador de .service
│ │ └── parser.rs # Parser de salida systemd
│ ├── orchestrator/ # Lógica de ciclo de vida
│ │ ├── mod.rs
│ │ ├── app_manager.rs # CRUD de apps
│ │ └── lifecycle.rs # Start/Stop/Restart + rate limiting
│ └── api/ # API REST + WebSocket
│ ├── mod.rs
│ ├── handlers.rs # Handlers HTTP
│ ├── dto.rs # DTOs de request/response
│ └── websocket.rs # LogStreamer con journalctl
├── web/ # Templates HTML
├── config/ # Configuración
│ └── monitored_apps.json
├── logs/ # Logs del sistema
│ └── errors.log
├── Cargo.toml # Dependencias
├── desplegar_agent.sh # Script de deployment
├── tareas.txt # Plan de desarrollo
└── README.md # Esta documentación
Estados de Aplicaciones
El sistema reconcilia estados entre detección de procesos y systemd:
| Proceso | Systemd | Estado Final | Descripción |
|---|---|---|---|
| ✅ | Active | running |
Funcionamiento normal |
| ❌ | Active | crashed |
⚠️ Systemd dice activo pero proceso no existe |
| ❌ | Failed | failed |
Servicio falló y systemd lo detectó |
| ✅ | Inactive | zombie |
⚠️ Proceso existe pero systemd dice inactivo |
| ❌ | Inactive | stopped |
Aplicación detenida normalmente |
Las discrepancias (crashed/zombie) se reportan automáticamente en logs y a la API central.
Troubleshooting
El agente no inicia
# Ver logs detallados
sudo journalctl -u siax-agent -n 100 --no-pager
# Verificar permisos
ls -la /opt/siax-agent
Error de permisos sudo
# Verificar configuración sudoers
sudo cat /etc/sudoers.d/siax-agent
# Probar manualmente
sudo -u siax-agent sudo systemctl status siax-agent
No puede registrar apps
Error: Permission denied writing to /etc/systemd/system
Solución: Asegúrate de que el servicio tiene permisos de escritura o ajusta ProtectSystem en el servicio systemd.
WebSocket no conecta
# Verificar que el puerto 8081 esté abierto
sudo netstat -tlnp | grep 8081
# Probar conexión
curl http://localhost:8081/api/apps
Desarrollo
Compilar en modo desarrollo
cargo build
cargo run
Ejecutar tests
cargo test
Linter
cargo clippy
Formateo
cargo fmt
Licencia
[Especificar licencia]
Contacto
[Información de contacto del proyecto]