Files
SIAX-MONITOR/web/blog.html
pablinux 8822e9e6b5 feat: Mejorar estructura de monitored_apps.json con metadata completa
- Añadir campos al modelo MonitoredApp:
  * service_name: Nombre del servicio systemd
  * path: WorkingDirectory de la aplicación
  * entry_point: Archivo de entrada (server.js, app.js, etc.)
  * node_bin: Ruta completa al binario de node/python
  * mode: Modo de ejecución (production, development, test)
  * service_file_path: Ruta al archivo .service de systemd
  * registered_at: Timestamp de registro (ISO 8601)

- Actualizar discovery.rs para extraer toda la información:
  * Parsear ExecStart para obtener node_bin y entry_point
  * Extraer NODE_ENV para determinar el modo
  * Guardar ruta completa al archivo .service
  * Usar add_app_full() con información completa

- Integrar ConfigManager en AppManager:
  * Guardar automáticamente en monitored_apps.json al registrar apps
  * Eliminar del JSON al desregistrar apps
  * Extraer metadata desde ServiceConfig (puerto, entry_point, mode, etc.)

- Mantener retrocompatibilidad con JSON antiguo mediante campos deprecated
- Todos los nuevos campos usan #[serde(default)] para evitar errores de deserialización
2026-01-18 03:26:42 -05:00

765 lines
32 KiB
HTML

<!doctype html>
<html class="dark" lang="es" dir="ltr">
<head>
<meta charset="utf-8" />
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
<title>
SIAX Monitor: Sistema de Monitoreo de Aplicaciones en Rust - Blog
Telcotronics
</title>
<link rel="icon" type="image/svg+xml" href="/static/icon/favicon.svg" />
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
rel="stylesheet"
/>
<link
href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap"
rel="stylesheet"
/>
<link
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap"
rel="stylesheet"
/>
<script>
tailwind.config = {
darkMode: "class",
theme: {
extend: {
colors: {
primary: "#137fec",
"background-light": "#f6f7f8",
"background-dark": "#101922",
},
fontFamily: {
display: ["Inter", "sans-serif"],
mono: ["JetBrains Mono", "monospace"],
},
},
},
};
</script>
<style>
body {
font-family: "Inter", sans-serif;
}
.material-symbols-outlined {
font-variation-settings:
"FILL" 0,
"wght" 400,
"GRAD" 0,
"opsz" 24;
}
.blog-content h2 {
font-size: 2rem;
font-weight: 800;
margin-top: 3rem;
margin-bottom: 1.5rem;
color: white;
}
.blog-content h3 {
font-size: 1.5rem;
font-weight: 700;
margin-top: 2rem;
margin-bottom: 1rem;
color: #e2e8f0;
}
.blog-content p {
margin-bottom: 1.25rem;
line-height: 1.75;
color: #cbd5e1;
}
.blog-content ul,
.blog-content ol {
margin-bottom: 1.5rem;
padding-left: 1.5rem;
}
.blog-content li {
margin-bottom: 0.75rem;
line-height: 1.75;
color: #cbd5e1;
}
.blog-content ul li {
list-style-type: disc;
}
.blog-content ol li {
list-style-type: decimal;
}
.blog-content strong {
color: white;
font-weight: 600;
}
.blog-content code {
background: #1e293b;
padding: 0.2rem 0.4rem;
border-radius: 0.25rem;
font-size: 0.9em;
color: #60a5fa;
}
.blog-content pre {
background: #0f172a;
padding: 1.5rem;
border-radius: 0.5rem;
overflow-x: auto;
margin-bottom: 1.5rem;
border: 1px solid #334155;
}
.blog-content pre code {
background: none;
padding: 0;
color: #94a3b8;
}
.blog-content blockquote {
border-left: 4px solid #137fec;
padding-left: 1.5rem;
margin: 1.5rem 0;
font-style: italic;
color: #94a3b8;
}
</style>
</head>
<body class="bg-background-dark text-slate-300">
<!-- Header -->
<header class="border-b border-slate-800 bg-[#0a0f16]">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
<div class="flex items-center justify-between">
<a
href="/"
class="text-2xl font-black text-white hover:text-primary transition-colors"
>
SIAX Monitor
</a>
<nav class="flex items-center gap-6">
<a
href="/"
class="text-slate-400 hover:text-white transition-colors"
>Dashboard</a
>
<a
href="/api-docs"
class="text-slate-400 hover:text-white transition-colors"
>API</a
>
<a
href="https://git.telcotronics.net/pablinux/SIAX-MONITOR"
target="_blank"
class="text-slate-400 hover:text-primary transition-colors flex items-center gap-1"
>
<span class="material-symbols-outlined text-sm"
>code</span
>
Git
</a>
</nav>
</div>
</div>
</header>
<!-- Article Container -->
<article class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<!-- Article Header -->
<header class="mb-12">
<!-- Categories -->
<div class="flex flex-wrap gap-2 mb-6">
<span
class="inline-flex items-center gap-1 px-3 py-1 rounded-full bg-primary/20 text-primary text-sm font-semibold"
>
<span class="material-symbols-outlined text-xs"
>folder</span
>
DevOps
</span>
<span
class="inline-flex items-center gap-1 px-3 py-1 rounded-full bg-green-500/20 text-green-400 text-sm font-semibold"
>
<span class="material-symbols-outlined text-xs"
>code</span
>
Rust
</span>
<span
class="inline-flex items-center gap-1 px-3 py-1 rounded-full bg-blue-500/20 text-blue-400 text-sm font-semibold"
>
<span class="material-symbols-outlined text-xs"
>monitoring</span
>
Monitoring
</span>
</div>
<!-- Title -->
<h1
class="text-4xl md:text-5xl font-black text-white mb-6 leading-tight"
>
SIAX Monitor: Sistema de Monitoreo y Gestión de Aplicaciones
Node.js y Python
</h1>
<!-- Meta info -->
<div
class="flex flex-wrap items-center gap-4 text-slate-400 text-sm"
>
<div class="flex items-center gap-2">
<div
class="w-10 h-10 rounded-full bg-primary/20 flex items-center justify-center"
>
<span
class="material-symbols-outlined text-primary text-lg"
>person</span
>
</div>
<span
>Por
<strong class="text-white">pablinux</strong></span
>
</div>
<div class="flex items-center gap-1">
<span class="material-symbols-outlined text-sm"
>calendar_today</span
>
<time datetime="2026-01-13">13 de enero, 2026</time>
</div>
<div class="flex items-center gap-1">
<span class="material-symbols-outlined text-sm"
>schedule</span
>
<span>10 min de lectura</span>
</div>
</div>
</header>
<!-- Featured Image -->
<div
class="mb-12 rounded-2xl overflow-hidden border border-slate-800 bg-gradient-to-br from-primary/20 via-background-dark to-background-dark p-12"
>
<div class="flex items-center justify-center">
<div class="text-center">
<div
class="inline-flex items-center justify-center w-24 h-24 rounded-2xl bg-primary/20 border-2 border-primary/30 mb-4"
>
<span
class="material-symbols-outlined text-primary"
style="font-size: 3rem"
>monitoring</span
>
</div>
<p class="text-slate-400 text-lg">
Monitoreo inteligente con Rust + Systemd
</p>
</div>
</div>
</div>
<!-- Article Content -->
<div class="blog-content">
<p class="text-xl text-slate-300 mb-8 leading-relaxed">
En el mundo del desarrollo moderno, gestionar múltiples
aplicaciones Node.js y Python en servidores de producción
puede convertirse rápidamente en un dolor de cabeza. SIAX
Monitor nace como una solución elegante, ligera y poderosa
para este problema, aprovechando la velocidad y seguridad de
Rust.
</p>
<h2>¿Qué es SIAX Monitor?</h2>
<p>
SIAX Monitor es un
<strong>agente de monitoreo inteligente</strong> diseñado
específicamente para entornos Linux con systemd. A
diferencia de soluciones enterprise como Prometheus o
Grafana que pueden resultar excesivas para equipos pequeños,
SIAX Monitor ofrece exactamente lo que necesitas sin
complicaciones innecesarias.
</p>
<p>
Desarrollado completamente en Rust, combina alto rendimiento
con un consumo mínimo de recursos. El proyecto utiliza
tecnologías modernas como Tokio para async runtime, Axum
para el servidor web, y se integra nativamente con systemd y
journalctl.
</p>
<h2>Características Principales</h2>
<h3>🔍 Escaneo Automático de Procesos</h3>
<p>
El sistema detecta automáticamente procesos Node.js y Python
en ejecución, recopilando información detallada como:
</p>
<ul>
<li>PID y nombre del proceso</li>
<li>Usuario propietario</li>
<li>Uso de CPU en tiempo real</li>
<li>Consumo de memoria RAM</li>
<li>Comando completo de ejecución</li>
</ul>
<h3>⚙️ Gestión de Ciclo de Vida</h3>
<p>
Control total sobre tus aplicaciones mediante la API REST:
</p>
<ul>
<li>
<code>POST /api/apps</code> - Registrar nueva aplicación
</li>
<li>
<code>POST /api/apps/:name/start</code> - Iniciar
servicio
</li>
<li>
<code>POST /api/apps/:name/stop</code> - Detener
servicio
</li>
<li>
<code>POST /api/apps/:name/restart</code> - Reiniciar
servicio
</li>
<li>
<code>GET /api/apps/:name/status</code> - Consultar
estado
</li>
</ul>
<p>
El sistema incluye <strong>rate limiting</strong> (1
operación/segundo por app) para evitar abusos y validaciones
de seguridad en todos los endpoints.
</p>
<h3>📝 Logs en Tiempo Real</h3>
<p>
Uno de los puntos más fuertes es el streaming de logs vía
WebSocket. Conectándote al endpoint
<code>ws://localhost:8080/api/apps/:name/logs</code>,
recibes logs en tiempo real desde journalctl sin necesidad
de SSH al servidor.
</p>
<p>La interfaz web incluye un visor tipo terminal con:</p>
<ul>
<li>Auto-scroll inteligente</li>
<li>Colores para niveles de log (ERROR, WARN, INFO)</li>
<li>Timestamps formateados</li>
<li>Botón para pausar/reanudar</li>
</ul>
<h3>🛡️ Seguridad y Validaciones</h3>
<p>SIAX Monitor toma la seguridad en serio:</p>
<ul>
<li>
Validación estricta de paths de trabajo (previene
directory traversal)
</li>
<li>Lista blanca de usuarios permitidos</li>
<li>
Configuración automatizada de sudoers para systemctl
</li>
<li>Hardening de servicios systemd generados</li>
<li>Rate limiting en operaciones críticas</li>
</ul>
<h3>🎨 Dashboard Moderno</h3>
<p>
La interfaz web está construida con
<strong>Tailwind CSS</strong> en tema oscuro (#101922 de
fondo, #137fec como color primario). Incluye:
</p>
<ul>
<li>
<strong>/</strong> - Dashboard con estadísticas y lista
de apps
</li>
<li>
<strong>/scan</strong> - Escaneo de procesos activos
</li>
<li>
<strong>/select</strong> - Selección de procesos para
registrar
</li>
<li>
<strong>/register</strong> - Formulario de registro
manual
</li>
<li>
<strong>/logs</strong> - Visor de logs en tiempo real
</li>
<li>
<strong>/api-docs</strong> - Documentación completa de
la API
</li>
</ul>
<h2>¿Cómo Funciona?</h2>
<h3>Arquitectura Multi-Threaded</h3>
<p>
SIAX Monitor utiliza una arquitectura basada en tres
componentes principales:
</p>
<p><strong>1. Monitor en Background</strong></p>
<p>Un thread dedicado ejecuta cada 60 segundos para:</p>
<ul>
<li>
Recopilar métricas de CPU y RAM usando
<code>sysinfo</code>
</li>
<li>Reconciliar estados entre sysinfo y systemd</li>
<li>Reportar al cloud API de SIAX (opcional)</li>
</ul>
<p><strong>2. Servidor Web Unificado</strong></p>
<p>Un servidor HTTP en puerto 8080 que fusiona:</p>
<ul>
<li>API REST (JSON responses)</li>
<li>WebSocket para logs</li>
<li>Interfaz web HTML estática</li>
<li>Archivos estáticos (favicon, logos)</li>
</ul>
<p>
Esto elimina problemas de CORS al servir todo desde el mismo
origen.
</p>
<p><strong>3. Integración Systemd</strong></p>
<p>
El módulo <code>systemd_manager</code> genera archivos
<code>.service</code> automáticamente con:
</p>
<pre><code>[Unit]
Description=App gestionada por SIAX Monitor
After=network.target
[Service]
Type=simple
User=app-user
WorkingDirectory=/opt/app
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target</code></pre>
<h2>Stack Tecnológico</h2>
<p>
El proyecto está construido sobre tecnologías modernas y
probadas:
</p>
<ul>
<li>
<strong>Rust</strong> - Lenguaje core (seguridad de
memoria, velocidad)
</li>
<li><strong>Tokio</strong> - Runtime asíncrono</li>
<li><strong>Axum 0.7</strong> - Framework web moderno</li>
<li><strong>Serde</strong> - Serialización JSON</li>
<li><strong>Sysinfo</strong> - Información del sistema</li>
<li>
<strong>Tower-HTTP</strong> - Middleware (CORS, static
files)
</li>
<li><strong>DashMap</strong> - HashMap thread-safe</li>
<li>
<strong>Tailwind CSS</strong> - Estilos del frontend
</li>
<li><strong>Material Symbols</strong> - Iconos</li>
</ul>
<h2>Ventajas y Consideraciones</h2>
<h3>✅ Ventajas</h3>
<ul>
<li>
<strong>Alto Rendimiento</strong>: Rust ofrece velocidad
cercana a C con seguridad de memoria garantizada
</li>
<li>
<strong>Ligero</strong>: Binario compilado de ~15MB,
consumo mínimo de RAM
</li>
<li>
<strong>Sin Dependencias</strong>: No requiere Node.js,
Python o base de datos
</li>
<li>
<strong>Integración Nativa</strong>: Aprovecha systemd y
journalctl del sistema
</li>
<li>
<strong>Fácil Despliegue</strong>: Single binary +
script de instalación
</li>
<li>
<strong>Open Source</strong>: Código auditable y
personalizable
</li>
</ul>
<h3>⚠️ Consideraciones</h3>
<ul>
<li>
<strong>Solo Linux + Systemd</strong>: Requiere
distribuciones con systemd (no macOS/Windows)
</li>
<li>
<strong>Permisos Sudo</strong>: Necesita configurar
sudoers para systemctl
</li>
<li>
<strong>Sin Métricas Históricas</strong>: No almacena
histórico, solo tiempo real
</li>
<li>
<strong>Solo Node.js y Python</strong>: Otros lenguajes
requieren extensión del código
</li>
<li>
<strong>Sin Autenticación</strong>: Diseñado para acceso
local/VPN, no exponer públicamente
</li>
</ul>
<h2>Casos de Uso</h2>
<h3>👔 Equipos DevOps</h3>
<p>
Gestión centralizada de microservicios en múltiples
servidores. El monitor actúa como worker node que reporta al
cloud API central, permitiendo visibilidad de toda la
infraestructura desde un solo panel.
</p>
<h3>💻 Desarrolladores</h3>
<p>
Monitoreo de aplicaciones en entornos de desarrollo y
staging sin la complejidad de herramientas enterprise.
Perfecto para proyectos pequeños a medianos que necesitan
control básico de servicios.
</p>
<h3>🖥️ Administradores de Sistemas</h3>
<p>
Control de servicios systemd con una interfaz web moderna.
Alternativa visual a comandos
<code>systemctl</code> repetitivos, con la ventaja de logs
centralizados y accesibles desde el navegador.
</p>
<h2>Instalación Rápida</h2>
<p>El proceso de instalación es extremadamente simple:</p>
<pre><code># Clonar el repositorio
git clone https://git.telcotronics.net/pablinux/SIAX-MONITOR.git
cd SIAX-MONITOR
# Compilar en modo release
cargo build --release
# Ejecutar instalador (crea usuario, configura sudoers, instala servicio)
sudo ./instalador.sh
# El servicio estará disponible en http://localhost:8080
</code></pre>
<p>
El script <code>instalador.sh</code> realiza
automáticamente:
</p>
<ul>
<li>Crear usuario del sistema <code>siax-agent</code></li>
<li>Configurar permisos sudoers para systemctl</li>
<li>Copiar binario a <code>/opt/siax-agent/</code></li>
<li>Instalar y habilitar servicio systemd</li>
<li>Verificar salud del servicio</li>
</ul>
<h2>Arquitectura de Despliegue</h2>
<p>
SIAX Monitor fue diseñado pensando en una arquitectura
distribuida:
</p>
<ul>
<li>
<strong>Cloud API</strong>:
<code>https://api.siax-system.net</code> - Panel central
de control
</li>
<li>
<strong>Worker Nodes</strong>: Agentes SIAX Monitor en
cada servidor
</li>
<li>
<strong>Comunicación</strong>: VPN segura entre workers
y cloud API
</li>
</ul>
<p>
Cada worker reporta cada 60 segundos su estado, permitiendo
monitoreo centralizado de toda la infraestructura sin
exponer puertos públicamente.
</p>
<h2>Conclusión</h2>
<p>
SIAX Monitor demuestra que no siempre necesitas soluciones
enterprise complejas para problemas simples. Con menos de
2,000 líneas de código Rust bien estructurado, ofrece
exactamente lo necesario para gestionar aplicaciones Node.js
y Python en producción.
</p>
<p>
La combinación de Rust + Systemd + WebSocket resulta en una
herramienta rápida, confiable y fácil de mantener. Es
perfecta para equipos pequeños o medianos que buscan
simplicidad sin sacrificar funcionalidad.
</p>
<p>
Si administras servidores Linux con aplicaciones Node.js o
Python, definitivamente vale la pena darle una oportunidad.
El código está disponible en
<a
href="https://git.telcotronics.net/pablinux/SIAX-MONITOR"
target="_blank"
class="text-primary hover:underline"
>Git Telcotronics</a
>
bajo licencia open source.
</p>
<blockquote>
"A veces la mejor solución no es la más compleja, sino la
que resuelve tu problema específico de la manera más
elegante posible." - Filosofía detrás de SIAX Monitor
</blockquote>
</div>
<!-- Article Footer -->
<footer class="mt-16 pt-8 border-t border-slate-800">
<div class="flex flex-wrap items-center justify-between gap-4">
<div class="flex items-center gap-3">
<div
class="w-12 h-12 rounded-full bg-primary/20 flex items-center justify-center"
>
<span class="material-symbols-outlined text-primary"
>person</span
>
</div>
<div>
<p class="text-white font-semibold">pablinux</p>
<p class="text-slate-400 text-sm">
DevOps Engineer · Rust Enthusiast
</p>
</div>
</div>
<div class="flex gap-3">
<a
href="https://git.telcotronics.net/pablinux/SIAX-MONITOR"
target="_blank"
class="inline-flex items-center gap-2 px-6 py-3 bg-primary hover:brightness-110 rounded-lg text-white font-semibold transition-all"
>
<span class="material-symbols-outlined text-sm"
>code</span
>
Ver en Git
</a>
<a
href="/api-docs"
class="inline-flex items-center gap-2 px-6 py-3 bg-slate-800 hover:bg-slate-700 rounded-lg text-white font-semibold transition-all"
>
<span class="material-symbols-outlined text-sm"
>description</span
>
Documentación
</a>
</div>
</div>
</footer>
<!-- Related Articles / Tags -->
<div
class="mt-12 p-6 rounded-2xl border border-slate-800 bg-[#0a0f16]"
>
<h3 class="text-lg font-bold text-white mb-4">Etiquetas</h3>
<div class="flex flex-wrap gap-2">
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>rust</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>systemd</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>monitoring</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>devops</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>nodejs</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>python</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>websocket</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>axum</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>tokio</span
>
<span
class="px-3 py-1 rounded-full bg-slate-800 text-slate-300 text-sm hover:bg-slate-700 transition-colors cursor-pointer"
>linux</span
>
</div>
</div>
</article>
<!-- Footer -->
<footer class="bg-[#0a0f16] border-t border-slate-800 mt-20 py-12">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-6">
<h3 class="text-2xl font-bold text-white mb-2">
SIAX Monitor
</h3>
<p class="text-slate-400">
Sistema de Monitoreo y Gestión de Aplicaciones
</p>
</div>
<div class="flex justify-center gap-8 mb-6">
<a
href="https://git.telcotronics.net/pablinux/SIAX-MONITOR"
target="_blank"
class="text-slate-400 hover:text-primary transition-colors"
>Git</a
>
<a
href="/api-docs"
class="text-slate-400 hover:text-primary transition-colors"
>API Docs</a
>
<a
href="/"
class="text-slate-400 hover:text-primary transition-colors"
>Dashboard</a
>
</div>
<p class="text-slate-500 text-sm text-center">
© 2026 SIAX Monitor. Desarrollado con 🦀 Rust y ❤️ por la
comunidad
</p>
</div>
</footer>
</body>
</html>