mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
373 lines
30 KiB
JSON
373 lines
30 KiB
JSON
{
|
|
"meta": {
|
|
"title": "Monitor de salud de Proxmox — CPU, memoria, almacenamiento, SMART, ZFS, logs | ProxMenux",
|
|
"description": "Supervisión proactiva de Proxmox VE: diez categorías cada cinco minutos (CPU y temperatura, memoria y swap, almacenamiento, discos/SMART, red, máquinas virtuales, servicios, registros, actualizaciones y seguridad), cuatro niveles de gravedad, silenciamiento por categoría, limpieza automática de errores resueltos, historial permanente de discos y notificaciones por Telegram, Discord, Gotify o correo.",
|
|
"ogTitle": "Monitor de salud de Proxmox — CPU, memoria, almacenamiento, SMART, ZFS, logs",
|
|
"ogDescription": "Monitorización proactiva de salud de Proxmox VE a través de diez categorías con niveles de severidad, duraciones de supresión y notificaciones dirigidas por eventos.",
|
|
"twitterTitle": "Monitor de salud de Proxmox | ProxMenux",
|
|
"twitterDescription": "Monitorización proactiva de salud de Proxmox VE a través de diez categorías con niveles de severidad y notificaciones."
|
|
},
|
|
"header": {
|
|
"title": "Monitor de salud",
|
|
"description": "El auto-chequeo continuo que escanea diez categorías de estado del host en un ciclo de cinco minutos, muestrea signos vitales continuamente entre ciclos, deduplica hallazgos en un stream de eventos estructurado, y alimenta el panel, el motor de notificaciones y el reescritor opcional de IA desde una única fuente de verdad.",
|
|
"section": "Monitor de ProxMenux"
|
|
},
|
|
"intro": {
|
|
"title": "Un escáner, tres consumidores",
|
|
"body": "Un hilo en segundo plano ejecuta el ciclo completo cada cinco minutos y guarda cada hallazgo en SQLite con un <code>error_key</code> estable. Así, <strong>(1)</strong> el panel muestra el estado actual, <strong>(2)</strong> el sistema de notificaciones distribuye los eventos nuevos a los canales configurados y <strong>(3)</strong> el asistente de IA opcional reformula las alertas en lenguaje sencillo. Configuras el análisis una vez y los componentes utilizan los mismos datos."
|
|
},
|
|
"howItWorks": {
|
|
"heading": "Cómo funciona",
|
|
"intro": "El Monitor de salud usa dos hilos paralelos. Un <strong>muestreador de métricas</strong> ligero llena los historiales de CPU, memoria y temperatura. El <strong>ciclo completo de salud</strong> lee esos datos, evalúa las condiciones sostenidas y realiza las demás comprobaciones aproximadamente cada cinco minutos; después guarda los hallazgos en SQLite para el panel y las notificaciones.",
|
|
"scannerTitle": "Del muestreo al hallazgo guardado",
|
|
"scannerCaption": "El muestreador llena los historiales entre ciclos: CPU cada 5 s, memoria cada 30 s y temperatura cada 15 s. No evalúa las alertas. El ciclo completo evalúa esos datos y realiza las comprobaciones más pesadas (SMART, estado ZFS, registros y servicios) antes de guardar los hallazgos en SQLite.",
|
|
"scannerArrowLabel": "paso",
|
|
"scannerNodes": {
|
|
"samplerLabel": "Muestreador de signos vitales",
|
|
"samplerDetail": "Uso de CPU 5 s\nMemoria 30 s\nTemperatura 15 s\n→ historiales",
|
|
"cycleLabel": "Ciclo completo de salud",
|
|
"cycleDetail": "Cada 5 min\nLee buffers\n+ probes en vivo\n(SMART, ZFS,\nservicios, journal…)",
|
|
"checksLabel": "Chequeos por categoría",
|
|
"checksDetail": "Diez categorías\n(CPU, memoria,\nalmacenamiento, discos,\nred, VMs,\nservicios, logs,\nactualizaciones, seguridad)",
|
|
"sqliteLabel": "SQLite",
|
|
"sqliteDetail": "tabla errors\n(activas +\nsilenciadas)\n+ disk_observations\n(historial permanente\npor disco)"
|
|
},
|
|
"notifTitle": "Del hallazgo guardado al usuario",
|
|
"notifCaption": "El camino de la notificación. La misma tabla errors también dirige la vista del panel (listas Active / Dismissed renderizadas en vivo) y la consume la rutina de limpieza al final de cada ciclo para auto-resolver entradas obsoletas — ambas corren desde los mismos datos sin pasar por el dispatcher.",
|
|
"notifArrowLabel": "evento",
|
|
"notifNodes": {
|
|
"errorsLabel": "tabla errors",
|
|
"errorsDetail": "Filas activas +\ndismissed\nclaveadas por\nerror_key",
|
|
"dispatcherLabel": "Dispatcher de notificaciones",
|
|
"dispatcherDetail": "Eventos nuevos +\nescalados encolados\nA través de toggles\n+ cooldown",
|
|
"templatesLabel": "Templates + reescritura con IA",
|
|
"templatesDetail": "Template\npor evento\n→ reescritura\nopcional con IA\nen lenguaje natural",
|
|
"channelsLabel": "Canales",
|
|
"channelsDetail": "Telegram\nDiscord\nGotify\nCorreo electrónico (SMTP)"
|
|
}
|
|
},
|
|
"categories": {
|
|
"heading": "Las diez categorías",
|
|
"imageAlt": "Vista del Monitor de salud mostrando las diez categorías con sus estados actuales (CPU, Memoria, Almacenamiento, Discos, Red, VMs, Servicios, Logs, Actualizaciones, Seguridad)",
|
|
"imageCaption": "Vista del Monitor de salud — las diez categorías con su estado actual. Las categorías en un host sano todas muestran OK; warnings y eventos críticos aparecen inline con las filas que los produjeron.",
|
|
"intro": "Cada ciclo ejercita diez checkers independientes. Cada uno produce uno de cuatro estados (<strong>OK</strong>, <strong>INFO</strong>, <strong>WARNING</strong>, <strong>CRITICAL</strong>) más un payload estructurado — nombres de dispositivo, líneas de log de muestra, umbrales exactos — que aparecen en el panel y viajan hasta el cuerpo de la notificación.",
|
|
"headerCategory": "Categoría",
|
|
"headerChecks": "Sub-chequeos",
|
|
"headerEvents": "Eventos típicos",
|
|
"rows": [
|
|
{
|
|
"category": "CPU y Temperatura",
|
|
"checks": "Uso de CPU con histéresis, temperatura de sensor",
|
|
"events": "Uso elevado y sostenido de CPU; avisos de temperatura basados en las lecturas muestreadas."
|
|
},
|
|
{
|
|
"category": "Memoria y Swap",
|
|
"checks": "Uso de RAM, uso de swap",
|
|
"events": "Presión de memoria sostenida; actividad del OOM-killer; swap agotado."
|
|
},
|
|
{
|
|
"category": "Almacenamiento",
|
|
"checks": "Almacenamientos Proxmox, sistema de archivos raíz",
|
|
"events": "Uso de espacio por encima de los umbrales configurados en la raíz u otros sistemas de archivos supervisados (85% aviso / 95% crítico por defecto); almacenamientos PVE no disponibles; montajes NFS/CIFS bloqueados o en solo lectura inesperada; LVM-thin y otros almacenamientos de pool que superan los mismos umbrales."
|
|
},
|
|
{
|
|
"category": "Discos y SMART",
|
|
"checks": "SMART, errores I/O en dmesg, pools ZFS, LVM, errores de filesystem",
|
|
"events": "SMART health failed; sectores reasignados / pendientes; errores I/O ATA; pool ZFS DEGRADED / FAULTED; remontaje de ext4 en solo lectura."
|
|
},
|
|
{
|
|
"category": "Red",
|
|
"checks": "Conectividad, estado de enlace, latencia al gateway",
|
|
"events": "Bridge o bond down; gateway inalcanzable; picos persistentes de latencia."
|
|
},
|
|
{
|
|
"category": "VMs y Contenedores",
|
|
"checks": "Comunicación QMP, arranque de VM, arranque de contenedor",
|
|
"events": "Boot de VM fallido; fallo de shutdown de CT; timeout de socket QMP; configuración / disco faltante tras un clone."
|
|
},
|
|
{
|
|
"category": "Servicios PVE",
|
|
"checks": "<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>, modo cluster",
|
|
"events": "Servicio caído; cluster quorum perdido; <code>pmxcfs</code> bloqueado."
|
|
},
|
|
{
|
|
"category": "Logs del sistema",
|
|
"checks": "Errores persistentes, picos de errores, cascadas de errores, mensajes críticos del kernel",
|
|
"events": "Errores idénticos repetidos; ráfaga súbita de warnings (patrón cascada); <code>BUG:</code> / <code>OOPS:</code> / <code>oom-killer</code> en dmesg."
|
|
},
|
|
{
|
|
"category": "Actualizaciones del sistema",
|
|
"checks": "Actualizaciones pendientes, actualizaciones de seguridad, kernel / versión de PVE, antigüedad del sistema",
|
|
"events": "Actualizaciones pendientes de seguridad o del kernel en uso; sistema sin actualizar desde hace mucho tiempo. Si hay actualizaciones, la categoría Actualizaciones de la ventana de estado de salud muestra <em>Actualizar ahora</em>. Ejecuta todo el proceso de actualización de ProxMenux; al cerrarlo, consulta el estado con <code>?refresh=1</code> para actualizar el indicador sin esperar al próximo ciclo."
|
|
},
|
|
{
|
|
"category": "Seguridad y Certificados",
|
|
"checks": "Intentos de login, certificados caducando, estado del jail Fail2Ban opcional",
|
|
"events": "Fallos repetidos de autenticación SSH / web; certificado PVE a < 30 días de caducar; bans activos de Fail2Ban."
|
|
}
|
|
]
|
|
},
|
|
"severity": {
|
|
"heading": "Modelo de severidad",
|
|
"headerStatus": "Estado",
|
|
"headerColour": "Color",
|
|
"headerMeaning": "Significado",
|
|
"headerNotification": "Notificación",
|
|
"rows": [
|
|
{
|
|
"status": "OK",
|
|
"colour": "Verde",
|
|
"meaning": "Sano. Sin hallazgos en esta categoría.",
|
|
"notification": "Silencioso."
|
|
},
|
|
{
|
|
"status": "INFO",
|
|
"colour": "Azul",
|
|
"meaning": "Condición transitoria o ya resuelta que merece la pena mencionar una vez. También se usa para categorías que tienen <em>solo</em> items dismissed restantes.",
|
|
"notification": "Opcional. Cada tipo de evento se puede activar o desactivar por canal."
|
|
},
|
|
{
|
|
"status": "WARNING",
|
|
"colour": "Amarillo",
|
|
"meaning": "Se necesita atención pero el host sigue funcional. La causa no es trivial — lee los detalles.",
|
|
"notification": "Se envía cuando el toggle por evento está activado para el canal."
|
|
},
|
|
{
|
|
"status": "CRITICAL",
|
|
"colour": "Rojo",
|
|
"meaning": "Funcionalidad rota o posible pérdida de datos. Acción requerida.",
|
|
"notification": "Se envía cuando el toggle por evento está activado para el canal. La temperatura de CPU CRITICAL se trata como alerta de seguridad que re-dispara incluso si se hizo dismiss previamente."
|
|
}
|
|
],
|
|
"infoNote": "Una categoría que está <strong>OK</strong> pero tiene eventos dismissed todavía dentro de su ventana de supresión se renderiza como <strong>INFO</strong> — para recordarte que algo está siendo silenciado en vez de que nunca hubo nada mal.",
|
|
"unknownTitle": "UNKNOWN, cuando un chequeo no puede completar",
|
|
"unknownBody": "Una comprobación no disponible devuelve <code>UNKNOWN</code>; tras tres ciclos consecutivos así, se registra un hallazgo persistente. El panel muestra la comprobación en amarillo. El estado general limita <code>UNKNOWN</code> a <strong>WARNING</strong>: por sí sola, una comprobación no disponible no vuelve crítico al host."
|
|
},
|
|
"dashboardView": {
|
|
"heading": "La vista del panel",
|
|
"intro": "El Monitor de salud vive dentro de la pestaña <strong>Overview</strong>. La pildora de estado de la cabecera (Healthy / Warning / Critical) abre un modal que divide los hallazgos en dos listas:",
|
|
"items": [
|
|
"<strong>Active</strong> — cada categoría con un hallazgo sin resolver. Cada fila expande para mostrar los chequeos individuales que produjeron el estado, la cadena <code>reason</code> cruda, el dispositivo o VM ID involucrado, y (para categorías que enlazan a una pestaña) un click-through a Almacenamiento / Red / VMs / Logs / Hardware para investigar.",
|
|
"<strong>Dismissed</strong> — items previamente reconocidos por el usuario que aún están dentro de su ventana de supresión. Cada fila muestra cuánto queda de la supresión y la duración configurada. Cuando la ventana caduca, el item desaparece de esta lista; si la condición subyacente sigue presente y la categoría soporta re-firing, reaparece en <em>Active</em>."
|
|
],
|
|
"pillTitle": "El indicador refleja la categoría más grave",
|
|
"pillBody": "El color de la cabecera del panel es la severidad más alta entre las diez categorías: cualquier CRITICAL → rojo, si no cualquier WARNING → amarillo, si no cualquier INFO → azul, si no verde. La misma lógica dirige el punto del favicon y el badge del PWA.",
|
|
"updateNowTitle": "Botón Update Now en la cabecera de Overview",
|
|
"updateNowBody1": "Cuando la categoría <em>Actualizaciones del sistema</em> reporta una o más actualizaciones pendientes, la cabecera de Overview renderiza un botón <strong>Update Now</strong> al lado de la pildora de salud. El botón abre una modal que ejecuta el mismo flujo del lado del host que <em>ProxMenux → Settings post-install Proxmox → Proxmox System Update</em>: higiene de repos, <code>apt full-upgrade</code> vía el worker seguro <code>update-pve-safe.sh</code>, recompilación DKMS automática de los drivers gestionados por ProxMenux cuando aterriza un kernel nuevo, autoremove / autoclean y prompt de reinicio si el kernel cambió. Las líneas de progreso van llegando a la modal según las va imprimiendo el worker.",
|
|
"updateNowBody2": "Al terminar la ejecución, cerrar la modal llama a <code>GET /api/health/details?refresh=1</code>, que invalida la caché del endpoint de health antes de servir. La fila de actualizaciones pendientes y la severidad de la pildora se recomputan al momento a partir del nuevo estado de paquetes, así que el badge desaparece sin esperar al siguiente ciclo de cinco minutos. Cuando el host ya está al día el botón queda oculto — sin ruido visual en un sistema sano."
|
|
},
|
|
"dismiss": {
|
|
"heading": "Hacer dismiss de alertas y la Suppression Duration",
|
|
"intro": "Algunos eventos son ruidosos por naturaleza: <em>System Updates: actualizaciones pendientes disponibles</em> sigue activo hasta que actualices el host, y no quieres una notificación cada cinco minutos durante una semana. El botón <em>Actualizar ahora</em> de la categoría Actualizaciones de la ventana de estado de salud resuelve ese caso en el sitio; para todo lo demás, o si aplazas la actualización, el Monitor de salud ofrece además dos mecanismos de silenciado relacionados:",
|
|
"step1": "<strong>Descartar un evento</strong> desde su ventana. El botón ofrece <strong>24 horas</strong>, <strong>7 días</strong> o <strong>Permanentemente</strong>, independientemente del valor de la categoría. Envía <code>POST /api/health/acknowledge</code> con el <code>error_key</code> y las <code>suppression_hours</code> elegidas (<code>-1</code> para permanente). El evento pasa a Descartados con su fecha <code>acknowledged_at</code>.",
|
|
"dropdownImageAlt": "Menú para descartar una alerta: 24 horas, 7 días o permanentemente",
|
|
"dropdownImageCaption": "La duración elegida se aplica solo a esta alerta; sin una elección individual, se usa el valor de la categoría. Los descartes permanentes llevan una etiqueta ámbar <em>Permanente</em> y normalmente no reaparecen. La excepción de temperatura crítica de CPU se explica más abajo.",
|
|
"step2": "<strong>Ajuste de Suppression Duration por categoría</strong>. Desde la card Settings → Health Monitor (o <code>POST /api/health/settings</code>), cada una de las diez categorías tiene su propia ventana por defecto, aplicada cuando se hace un Dismiss sin elegir ventana por evento:",
|
|
"imageAlt": "Card Settings → Health Monitor con los dropdowns de supresión por categoría y la sección Active Suppressions",
|
|
"imageCaption": "Un selector de duración por categoría. Elige una ventana mayor para eventos ruidosos, como actualizaciones pendientes, y menor para los que quieras reevaluar pronto. Debajo se muestran los silenciamientos activos.",
|
|
"outro": "Mientras un evento está suprimido, el escáner sigue corriendo y actualiza el timestamp <code>last_seen</code> de la fila, pero no se despacha ninguna notificación nueva y el panel se mantiene calmado. Cuando la ventana caduca, el siguiente ciclo reevalúa la condición y o bien re-dispara fresco o, si la condición se ha aclarado por sí sola, retira la fila de las listas.",
|
|
"activeSuppressionsTitle": "Revisar y revertir dismisses — el panel Active Suppressions",
|
|
"activeSuppressionsBody": "Las alertas silenciadas, temporales o permanentes, aparecen en <strong>Ajustes → Monitor de salud → Silenciamientos activos</strong>. Cada fila muestra identificador, categoría, gravedad, fecha y tiempo restante. <strong>Reactivar</strong> quita la confirmación para permitir otra alerta en el próximo análisis. Los descartes permanentes se revierten desde aquí; los temporales también pueden reactivarse antes de tiempo. Activa el modo <em>Editar</em> de la tarjeta, pulsa Reactivar en las filas deseadas (quedan con borde verde y tachadas) y Guarda para aplicar. Cancelar vacía la selección.",
|
|
"autoTitle": "Silenciamiento automático al cambiar la duración",
|
|
"autoBody": "Poner una Suppression Duration de categoría a cualquier cosa distinta del valor por defecto de 24 h tiene un segundo efecto más allá de los dismissals iniciados por el usuario: <strong>los futuros hallazgos en esa categoría entran en la tabla ya reconocidos</strong> con esa duración. Esto es por diseño — si le has dicho al Monitor que quieres los eventos de disco silenciados durante una semana, los hallazgos de disco nuevos honran esa intención sin que tengas que hacer dismiss de cada uno a mano. Aparecen directamente en la lista Dismissed con el tiempo restante configurado. Las categorías dejadas en 24 h no se ven afectadas y se comportan de la forma clásica (los hallazgos nuevos aterrizan en Active hasta que actúes).",
|
|
"tempTitle": "La temperatura de CPU CRITICAL es el override de seguridad",
|
|
"tempBody": "La persistencia incluye una regla especial para un registro <strong>Temperatura de CPU CRITICAL</strong>: si lo recibe, ignora la confirmación previa y el silenciamiento automático. Esto no significa que todos los comprobadores de temperatura emitan un registro crítico al superar un umbral configurado.",
|
|
"nonDismissableTitle": "¿Qué hallazgos pueden descartarse?",
|
|
"nonDismissableBody": "La ventana muestra Descartar solo si la comprobación devuelve explícitamente dismissable = true. Si el valor es falso o falta, oculta el botón. La gravedad no determina este permiso: varias comprobaciones críticas permiten la confirmación. Los ejemplos describen los datos actuales; silenciar una alerta no corrige su causa.",
|
|
"headerFinding": "Hallazgo",
|
|
"headerWhy": "Comportamiento al descartar",
|
|
"rows": [
|
|
{
|
|
"finding": "Advertencia / crítico de temperatura de CPU",
|
|
"why": "El aviso de temperatura basado en muestras permite descartarse explícitamente. Una regla separada ignora la confirmación si llega un registro de temperatura de CPU con gravedad CRITICAL."
|
|
},
|
|
{
|
|
"finding": "Espacio crítico de filesystem (montaje raíz)",
|
|
"why": "Las comprobaciones de espacio permiten descartarse, incluso con uso crítico. Confirmar la alerta no libera espacio ni elimina el riesgo de fallos de escritura."
|
|
},
|
|
{
|
|
"finding": "Pool ZFS DEGRADED / FAULTED",
|
|
"why": "Los hallazgos de estado del pool ZFS (DEGRADED, FAULTED, UNAVAIL) permiten descartarse, igual que las comprobaciones de capacidad del pool. Confirmar no repara un pool degradado o averiado."
|
|
},
|
|
{
|
|
"finding": "Errores I/O de disco con SMART FAILED",
|
|
"why": "Los hallazgos de disco persistidos desde el journal pueden permitir descartarse. SMART FAILED sigue necesitando investigación; el botón depende del indicador de la comprobación, no solo del texto de la alerta."
|
|
},
|
|
{
|
|
"finding": "Interfaz de red DOWN",
|
|
"why": "Las comprobaciones persistidas de interfaz DOWN permiten descartarse. Esto no restaura un bridge, un bond o un enlace físico, ni recupera el acceso remoto."
|
|
},
|
|
{
|
|
"finding": "Eventos I/O en discos sanos (INFO)",
|
|
"why": "Los eventos ATA o dmesg transitorios con SMART sano pueden ser informativos y resolverse solos. Las filas informativas pueden no ofrecer Descartar; el comprobador decide cuándo se resuelve la condición."
|
|
}
|
|
],
|
|
"principle": "Usa el botón que muestre el hallazgo concreto; no deduzcas su disponibilidad por la categoría o gravedad. La confirmación controla la presentación y las notificaciones. Las comprobaciones de recuperación y el historial del disco son independientes."
|
|
},
|
|
"autoresolve": {
|
|
"heading": "Auto-resolución y limpieza",
|
|
"intro": "Muchas alertas deben desaparecer cuando cesa la causa: una VM que ya arranca, un disco retirado o una temperatura que vuelve a la normalidad. La limpieza al final de cada ciclo de cinco minutos aplica estas reglas:",
|
|
"headerTrigger": "Disparador",
|
|
"headerAction": "Acción",
|
|
"rows": [
|
|
{
|
|
"trigger": "Uso de CPU de vuelta al rango normal tras un warning relacionado con CPU.",
|
|
"action": "Marcado como resuelto. Sale de la lista Active."
|
|
},
|
|
{
|
|
"trigger": "Presión de memoria de vuelta por debajo del umbral de warning tras un warning OOM / memoria.",
|
|
"action": "Marcado como resuelto."
|
|
},
|
|
{
|
|
"trigger": "VM / CT referenciada por el error ya no existe (<code>qm status</code> / <code>pct status</code> distinto de cero).",
|
|
"action": "Marcado como resuelto por recurso eliminado."
|
|
},
|
|
{
|
|
"trigger": "Disco referenciado por el error ya no presente en <code>/dev/</code>.",
|
|
"action": "Marcado como resuelto por dispositivo eliminado. El historial permanente de observaciones se preserva (mira la siguiente sección)."
|
|
},
|
|
{
|
|
"trigger": "Hallazgos provenientes del journal (categoría <code>logs</code>, entradas SMART, errores ATA / I/O) cuando su ventana de supresión caduca.",
|
|
"action": "Se retiran. Cada análisis examina nuevas entradas del journal a partir de ese punto; la misma línea histórica no vuelve a emitirse."
|
|
},
|
|
{
|
|
"trigger": "Errores resueltos con más de siete días.",
|
|
"action": "Borrados de la base de datos para mantener la tabla pequeña. El historial de notificaciones es independiente y se conserva más tiempo."
|
|
}
|
|
],
|
|
"permanentTitle": "La supresión permanente no es lo mismo que resuelto",
|
|
"permanentBody": "Una duración por categoría de <code>-1</code> (<em>permanente</em>) silencia futuras alertas de los elementos descartados, pero no evita la comprobación automática anterior. Si desaparece la causa —recurso eliminado o umbral ya no superado—, el elemento sigue limpiándose automáticamente."
|
|
},
|
|
"observations": {
|
|
"heading": "Observaciones de disco — el historial permanente",
|
|
"intro": "Los eventos de disco merecen conservarse. Un aviso SMART en <code>/dev/sdh</code> a las 02:14 sigue siendo relevante cuando termina la ráfaga de E/S y el error se resuelve solo: el disco ya tiene antecedentes. Por eso el Monitor de salud mantiene otra tabla <strong>permanente</strong>: <code>disk_observations</code>.",
|
|
"headerProperty": "Propiedad",
|
|
"headerErrors": "Tabla <code>errors</code> (Activos)",
|
|
"headerObs": "tabla <code>disk_observations</code>",
|
|
"rows": [
|
|
{
|
|
"property": "Propósito",
|
|
"errors": "Dirige la vista <em>actual</em> de salud + despacho de notificaciones.",
|
|
"obs": "Registro de auditoría permanente por disco."
|
|
},
|
|
{
|
|
"property": "Resolución automática",
|
|
"errors": "Sí: las filas se retiran cuando desaparece la causa.",
|
|
"obs": "No — las entradas persisten para siempre salvo que el usuario las descarte explícitamente."
|
|
},
|
|
{
|
|
"property": "Clave de deduplicación",
|
|
"errors": "<code>error_key</code> (p. ej. <code>smart_sdh</code>).",
|
|
"obs": "<code>(disk_registry_id, error_type, error_signature)</code> con firmas estables despojadas de datos volátiles."
|
|
},
|
|
{
|
|
"property": "Dónde se muestra",
|
|
"errors": "Modal del Monitor de salud (listas Active / Dismissed).",
|
|
"obs": "Tarjeta de detalle de disco en la pestaña <strong>Almacenamiento</strong>, con un badge \"X obs.\" por disco."
|
|
},
|
|
{
|
|
"property": "Qué registra",
|
|
"errors": "Lo que esté fallando actualmente.",
|
|
"obs": "Avisos SMART (sectores, temperatura, CRC o autopruebas fallidas), errores de E/S (ATA / NVMe / dm), errores del sistema de archivos y eventos de pools ZFS."
|
|
}
|
|
],
|
|
"outro": "Una alerta puede desaparecer del panel mientras el incidente sigue registrado en el historial del disco. Al abrir el disco en Almacenamiento, su tarjeta muestra las observaciones pendientes con fecha, gravedad y mensaje original sin procesar. Esto ayuda a decidir si hay que sustituirlo.",
|
|
"renameTitle": "Los renombres entre dispositivos se fusionan automáticamente",
|
|
"renameBody": "Los discos a veces aparecen bajo nombres transitorios (<code>ata8</code>, <code>nvme0n1p3</code>) antes de conseguir un nombre estable de block-device. La capa de observaciones consolida entradas por número de serie cuando se conoce: si un evento se registró primero como <code>ata8</code> y el mismo disco se identifica más tarde como <code>sdh</code>, las observaciones históricas se reasocian a <code>sdh</code> en el siguiente ciclo para que el historial no se fragmente."
|
|
},
|
|
"notification": {
|
|
"heading": "De un hallazgo a una notificación",
|
|
"intro": "Cada error activo es también un candidato para el motor de notificaciones. El flujo:",
|
|
"items": [
|
|
"El escáner registra el hallazgo con categoría + severidad + detalles estructurados.",
|
|
"Si el tipo de evento está <strong>activado</strong> en los ajustes globales de notificación, y el canal no ha silenciado esta categoría, se encola un evento.",
|
|
"El motor de templates renderiza un par (título, cuerpo) desde los detalles estructurados. Si el reescritor de IA está activado, el mismo par también pasa por el proveedor configurado para una versión en lenguaje natural.",
|
|
"La implementación del canal lo envía: mensaje de Telegram, embed de Discord, push de Gotify o email. El resultado del despacho se guarda en <code>notification_history</code>.",
|
|
"Descartar una alerta inicia su ventana de silenciamiento. Durante ella, las nuevas detecciones del mismo <code>error_key</code> normalmente no generan notificaciones ni quedan en cola para enviarse al terminar. La regla de temperatura crítica de CPU sigue siendo una excepción."
|
|
],
|
|
"outro": "La configuración de canales —token del bot Telegram, URLs de webhook, claves de IA, opciones por evento y ajustes por canal— se explica en <notifLink>Notificaciones</notifLink> y <aiLink>Asistente de IA</aiLink>."
|
|
},
|
|
"rest": {
|
|
"heading": "Endpoints REST",
|
|
"intro": "Las acciones de la ventana están disponibles por API para scripts, paneles o bots. Las llamadas necesitan un token Bearer válido, obtenido al iniciar sesión o en la pantalla de tokens API. Los cambios, como confirmar alertas, guardar ajustes o limpiar errores huérfanos, exigen full_admin; read_only recibe 403.",
|
|
"headerEndpoint": "Endpoint",
|
|
"headerMethod": "Método",
|
|
"headerUse": "Uso",
|
|
"rows": [
|
|
{
|
|
"endpoint": "/api/health",
|
|
"method": "GET",
|
|
"use": "Comprobación ligera que devuelve JSON con <code>status</code>, <code>timestamp</code> y <code>version</code>. Sirve para comprobar palabras clave con Uptime Kuma; el cliente debe enviar una cabecera Bearer."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/status",
|
|
"method": "GET",
|
|
"use": "Veredicto global de salud — severidad única + cadena de resumen. Autenticado."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/details",
|
|
"method": "GET",
|
|
"use": "Las diez categorías con sus estados por categoría y el payload estructurado que produjo cada uno."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/full",
|
|
"method": "GET",
|
|
"use": "Vista completa: categorías, errores activos, descartados y ajustes de silenciamiento. Alimenta la ventana con una sola petición y usa una caché en segundo plano de seis minutos para responder rápidamente."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/active-errors",
|
|
"method": "GET",
|
|
"use": "Solo la lista Activos. Admite el filtro <code>?category=<name></code>."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/dismissed",
|
|
"method": "GET",
|
|
"use": "Solo la lista Descartados, con las horas restantes de silenciamiento."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/acknowledge",
|
|
"method": "POST",
|
|
"use": "Cuerpo: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Descarta una alerta durante el plazo configurado para su categoría."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/settings",
|
|
"method": "GET / POST",
|
|
"use": "Lee o guarda la duración del silenciamiento por categoría."
|
|
},
|
|
{
|
|
"endpoint": "/api/health/cleanup-orphans",
|
|
"method": "POST",
|
|
"use": "Limpieza manual de errores cuyo dispositivo / VM subyacente ha desaparecido. Idempotente."
|
|
}
|
|
],
|
|
"codeComment1": "# Snapshot del estado actual de salud para un script",
|
|
"codeComment2": "# Descarta un error específico",
|
|
"codeComment3": "# Pon la supresión de la categoría discos a una semana"
|
|
},
|
|
"whereNext": {
|
|
"heading": "Por dónde seguir",
|
|
"items": [
|
|
{
|
|
"label": "Panel",
|
|
"href": "/docs/monitor/dashboard",
|
|
"tail": " — desde donde se abre el modal del Monitor de salud en la UI."
|
|
},
|
|
{
|
|
"label": "Notificaciones",
|
|
"href": "/docs/monitor/notifications",
|
|
"tail": " — canales, opciones por evento, integración de la reformulación IA e historial."
|
|
},
|
|
{
|
|
"label": "Asistente de IA",
|
|
"href": "/docs/monitor/ai-assistant",
|
|
"tail": " — configuración del proveedor (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), modo de prompt, nivel de detalle por canal, idioma."
|
|
},
|
|
{
|
|
"label": "Arquitectura",
|
|
"href": "/docs/monitor/architecture",
|
|
"tailRich": " — el esquema SQLite (<code>errors</code>, <code>disk_observations</code>, <code>events</code>) y la cadencia del hilo de fondo."
|
|
}
|
|
]
|
|
}
|
|
}
|