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
This commit is contained in:
173
web/index.html
173
web/index.html
@@ -4,6 +4,7 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
|
||||
<title>Panel de Monitoreo</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"
|
||||
@@ -54,90 +55,117 @@
|
||||
>
|
||||
<div class="flex h-full grow flex-col">
|
||||
<!-- Sticky Top Navigation -->
|
||||
<header
|
||||
class="sticky top-0 z-50 w-full border-b border-slate-200 dark:border-slate-800 bg-background-light/80 dark:bg-background-dark/80 backdrop-blur-md"
|
||||
>
|
||||
<div
|
||||
class="max-w-[1200px] mx-auto px-4 lg:px-10 py-3 flex items-center justify-between"
|
||||
>
|
||||
<div class="flex items-center gap-8">
|
||||
<div class="flex items-center gap-3 text-primary">
|
||||
<header class="border-b border-[#283039] bg-[#0a0f16]">
|
||||
<div class="container mx-auto px-4 py-4">
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex items-center gap-4">
|
||||
<div
|
||||
class="size-8 bg-primary rounded-lg flex items-center justify-center text-white"
|
||||
class="rounded-full size-9 border-2 border-slate-700 overflow-hidden"
|
||||
>
|
||||
<span class="material-symbols-outlined"
|
||||
>monitoring</span
|
||||
>
|
||||
<img
|
||||
src="/static/icon/logo.png"
|
||||
alt="Logo"
|
||||
class="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<h1 class="text-xl font-bold">SIAX Monitor</h1>
|
||||
<p class="text-xs text-slate-400">Dashboard</p>
|
||||
</div>
|
||||
<h2
|
||||
class="text-white text-lg font-bold leading-tight tracking-[-0.015em]"
|
||||
>
|
||||
SIAX Monitor
|
||||
</h2>
|
||||
</div>
|
||||
<nav class="hidden md:flex items-center gap-6">
|
||||
|
||||
<!-- Desktop Navigation -->
|
||||
<nav class="hidden md:flex items-center gap-2">
|
||||
<a
|
||||
class="text-primary text-sm font-semibold leading-normal"
|
||||
href="/"
|
||||
>Inicio</a
|
||||
href="/health"
|
||||
class="px-4 py-2 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-2"
|
||||
>
|
||||
<span class="material-symbols-outlined text-lg"
|
||||
>monitor_heart</span
|
||||
>
|
||||
<span>Health</span>
|
||||
</a>
|
||||
<a
|
||||
class="text-slate-600 dark:text-slate-400 hover:text-white text-sm font-medium transition-colors"
|
||||
href="/scan"
|
||||
class="px-4 py-2 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-2"
|
||||
>
|
||||
Escanear
|
||||
<span class="material-symbols-outlined text-lg"
|
||||
>search</span
|
||||
>
|
||||
<span>Escanear</span>
|
||||
</a>
|
||||
<a
|
||||
class="text-slate-600 dark:text-slate-400 hover:text-white text-sm font-medium transition-colors"
|
||||
href="/select"
|
||||
>
|
||||
Agregar
|
||||
</a>
|
||||
<a
|
||||
class="text-slate-600 dark:text-slate-400 hover:text-white text-sm font-medium transition-colors"
|
||||
href="/register"
|
||||
>
|
||||
Nueva App
|
||||
</a>
|
||||
<a
|
||||
class="text-slate-600 dark:text-slate-400 hover:text-white text-sm font-medium transition-colors"
|
||||
href="/logs"
|
||||
class="px-4 py-2 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-2"
|
||||
>
|
||||
Registros
|
||||
<span class="material-symbols-outlined text-lg"
|
||||
>article</span
|
||||
>
|
||||
<span>Logs</span>
|
||||
</a>
|
||||
<a
|
||||
href="/register"
|
||||
class="px-4 py-2 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-2"
|
||||
>
|
||||
<span class="material-symbols-outlined text-lg"
|
||||
>app_registration</span
|
||||
>
|
||||
<span>Registrar</span>
|
||||
</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="hidden sm:block">
|
||||
<label class="relative block">
|
||||
<span
|
||||
class="absolute inset-y-0 left-0 flex items-center pl-3 text-slate-500"
|
||||
>
|
||||
<span
|
||||
class="material-symbols-outlined text-sm"
|
||||
>
|
||||
search
|
||||
</span>
|
||||
</span>
|
||||
<input
|
||||
class="form-input w-64 rounded-lg border-none bg-slate-200 dark:bg-slate-800 text-sm py-2 pl-10 pr-4 placeholder:text-slate-500 focus:ring-1 focus:ring-primary"
|
||||
placeholder="Buscar..."
|
||||
type="text"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Menu Button -->
|
||||
<button
|
||||
class="hidden lg:flex cursor-pointer items-center justify-center rounded-lg h-9 px-4 bg-primary text-white text-sm font-bold transition-opacity hover:opacity-90"
|
||||
onclick="window.location.href = '/register'"
|
||||
onclick="toggleMenu()"
|
||||
class="md:hidden px-3 py-2 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors"
|
||||
>
|
||||
<span>Registrar App</span>
|
||||
<span class="material-symbols-outlined text-2xl"
|
||||
>menu</span
|
||||
>
|
||||
</button>
|
||||
<div
|
||||
class="bg-center bg-no-repeat aspect-square bg-cover rounded-full size-9 border-2 border-slate-700"
|
||||
style="
|
||||
background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuCT0iINTncUFHp353HCJXRR5C0OKbSp_7IBOVNoDU07yuF2aToQQdnXNOeGI9RLUjVBsVNcU--ZoTMY90FFJvrQvYvRzKvq-CFCzBlVkCeoi5AgG84cB71wW0NIMg626M_sCjmDjxqmAJwIbkAcSmSlAg3TUThW1U2A3StNVgqFXEpgFbpJcU5nxLs6vuRkfYR1kIXcV44TQpgOosbsjSB1Pk1UTOQJ_OEcQtY-5c3FJw7gXBDxlp6y3jsY3rBm0xWGJi8NWnrUrhpl");
|
||||
"
|
||||
></div>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Menu Dropdown -->
|
||||
<div
|
||||
id="mobile-menu"
|
||||
class="hidden md:hidden mt-4 pb-4 space-y-2"
|
||||
>
|
||||
<a
|
||||
href="/health"
|
||||
class="block px-4 py-3 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-3"
|
||||
>
|
||||
<span class="material-symbols-outlined"
|
||||
>monitor_heart</span
|
||||
>
|
||||
<span>Health</span>
|
||||
</a>
|
||||
<a
|
||||
href="/scan"
|
||||
class="block px-4 py-3 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-3"
|
||||
>
|
||||
<span class="material-symbols-outlined"
|
||||
>search</span
|
||||
>
|
||||
<span>Escanear</span>
|
||||
</a>
|
||||
<a
|
||||
href="/logs"
|
||||
class="block px-4 py-3 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-3"
|
||||
>
|
||||
<span class="material-symbols-outlined"
|
||||
>article</span
|
||||
>
|
||||
<span>Logs</span>
|
||||
</a>
|
||||
<a
|
||||
href="/register"
|
||||
class="block px-4 py-3 rounded-lg text-slate-300 hover:bg-[#161f2a] transition-colors flex items-center gap-3"
|
||||
>
|
||||
<span class="material-symbols-outlined"
|
||||
>app_registration</span
|
||||
>
|
||||
<span>Registrar</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
@@ -150,7 +178,7 @@
|
||||
<h1
|
||||
class="text-slate-900 dark:text-white text-3xl font-black tracking-tight"
|
||||
>
|
||||
Dashboard Index
|
||||
Panel de Control
|
||||
</h1>
|
||||
<p class="text-slate-500 text-sm mt-1">
|
||||
Monitoreo de salud del sistema y procesos en tiempo
|
||||
@@ -436,7 +464,7 @@
|
||||
<a class="hover:text-primary" href="#"
|
||||
>Política de Privacidad</a
|
||||
>
|
||||
<a class="hover:text-primary" href="#"
|
||||
<a class="hover:text-primary" href="/api-docs"
|
||||
>Documentación de API</a
|
||||
>
|
||||
</div>
|
||||
@@ -446,9 +474,7 @@
|
||||
<script>
|
||||
async function loadApps() {
|
||||
try {
|
||||
const response = await fetch(
|
||||
"http://localhost:8080/api/apps",
|
||||
);
|
||||
const response = await fetch("/api/apps");
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success && result.data && result.data.apps) {
|
||||
@@ -516,6 +542,11 @@
|
||||
`;
|
||||
}
|
||||
|
||||
function toggleMenu() {
|
||||
const menu = document.getElementById("mobile-menu");
|
||||
menu.classList.toggle("hidden");
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", loadApps);
|
||||
</script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user