feat: Implementación completa Fase 4 - Sistema de monitoreo con API REST y WebSocket

 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
This commit is contained in:
2026-01-13 08:24:13 -05:00
parent 3595e55a1e
commit b0489739cf
33 changed files with 6893 additions and 1261 deletions

86
src/api/dto.rs Normal file
View File

@@ -0,0 +1,86 @@
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Deserialize, Serialize)]
pub struct RegisterAppRequest {
pub app_name: String,
pub script_path: String,
pub working_directory: String,
pub user: String,
#[serde(default)]
pub environment: HashMap<String, String>,
#[serde(default = "default_restart_policy")]
pub restart_policy: String,
pub app_type: String,
pub description: Option<String>,
}
fn default_restart_policy() -> String {
"always".to_string()
}
#[derive(Debug, Serialize)]
pub struct ApiResponse<T> {
pub success: bool,
pub data: Option<T>,
pub error: Option<String>,
}
impl<T> ApiResponse<T> {
pub fn success(data: T) -> Self {
ApiResponse {
success: true,
data: Some(data),
error: None,
}
}
pub fn error(error: String) -> Self {
ApiResponse {
success: false,
data: None,
error: Some(error),
}
}
}
#[derive(Debug, Serialize)]
pub struct AppStatusResponse {
pub name: String,
pub status: String,
pub pid: Option<i32>,
pub cpu_usage: f32,
pub memory_usage: String,
pub systemd_status: String,
pub last_updated: String,
}
#[derive(Debug, Serialize)]
pub struct AppListResponse {
pub apps: Vec<String>,
pub total: usize,
}
#[derive(Debug, Serialize)]
pub struct OperationResponse {
pub app_name: String,
pub operation: String,
pub success: bool,
pub message: String,
}
#[derive(Debug, Serialize)]
pub struct DetectedProcess {
pub pid: i32,
pub name: String,
pub user: Option<String>,
pub cpu_usage: f64,
pub memory_mb: f64,
pub process_type: String,
}
#[derive(Debug, Serialize)]
pub struct ProcessScanResponse {
pub processes: Vec<DetectedProcess>,
pub total: usize,
}