Afinado y auditoría con cuatro agentes — 19 octubre 2026¶
Ramon pidió seguir afinando y analizar el homelab con muchos agentes. Se han distribuido capacidad/estabilidad, copias/recuperación, servicios/acceso, red, automatismos y consola de mantenimiento. Cuatro agentes distintos, con un máximo de tres simultáneos, y revisión/integración por el coordinador. Observaciones aproximadamente 23:02–23:10 CEST, con la hora propia de cada informe.
Aplicado y comprobado¶
Consola de mantenimiento¶
Fuente ~/Dev/homelab-maint, runtime CT212. La API exigía el nivel solo a las
transiciones; una tarea ordinaria declarada L2 podía solicitarse desde L0.
Ahora exige el mínimo declarado, valida niveles conocidos y conserva el origen
exacto de las transiciones. No permite cambiar manualmente nivel/estado mientras
hay una ejecución. La UI deshabilita acciones incompatibles.
Publicado 763ef72. Once pruebas aisladas correctas; despliegue selectivo con
rollback, running=[] antes y después, nivel L0 conservado. En vivo, solicitar
nas-reboot sin confirmación devuelve 409 por nivel L2; un nivel inexistente
devuelve 422. No se ejecutó esa tarea ni ninguna transición de mantenimiento.
Segunda corrección publicada 60a85d5: excepciones de proceso/log/persistencia
y abortos antes/durante la creación del proceso ya liberan la exclusión y
registran fallo parcial. El doble aborto es idempotente. Suite final de 17
pruebas correctas, desplegada y comprobada con nivel L0, running=[] y sin
transición. Hash vivo app.py:
<REDACTED>.
Esto no certifica L2–L4: la auditoría adicional reproduce errores ocultos por pipelines/echo en sus comandos y admisión de operaciones tras reiniciar con una transición huérfana. Antes de emplear esos niveles hay que reconciliar inventario, propagar errores críticos y tratar el estado interrumpido.
Monitorización de memoria y CPU¶
HighMemoryUsage y LowMemoryAvailable ya no suman todo el ARC a MemAvailable.
Conservan umbrales, nombres y tiempos. Añadidas dos reglas sobre métricas que
ya existían: temperatura CPU >=85 °C y limitación de CPU >6 eventos/min,
ambas sostenidas durante 10 minutos. Solo consideran el job de nodos físicos.
Reconciliadas ocho reglas ARR/rutas que existían en producción pero faltaban en la plantilla, y corregidos cuatro escapes Jinja que impedían renderizarla. Comparación semántica: ninguna regla eliminada, solo las dos de memoria modificadas y las dos térmicas añadidas. Validación: 83 reglas y seis escenarios promtool correctos, incluyendo ARC grande con memoria disponible baja.
CT217: escritura en el mismo inode y recarga HUP, sin reiniciar Prometheus.
Un primer control demasiado temprano recibió reglas aún sin evaluar y revirtió
automáticamente. Se repitió esperando la evaluación real: 83 reglas cargadas,
todas saludables, reloadConfigSuccess=true, último reload 21:07:02 UTC.
Hash final <REDACTED>.
Rollback final:
/home/monxas/appdata/prometheus/alerts.yml.before-thermal-20261019T230702.
Se preservaron los canales y la política de notificación existentes.
Diagnóstico de tareas RunWisp¶
La tarea AudioMuse ocultaba stdout/stderr y falla al consultar el Navidrome antiguo de VM208. Eliminada únicamente esa redirección, tanto en fuente Ansible como en el TOML vivo. Horario, solapamiento y política catch-up conservados; no se ejecutó el limpiador ni se trasladó su DELETE a otra BD.
Se descubrió además que reload --socket de RunWisp 0.14 devuelve código cero
y «No daemon is running» si faltan sus variables de directorio. Corregido el
role para pasar RUNWISP_CONFIG/RUNWISP_DATA y rechazar ese falso éxito. La
recarga real, con ambas variables, confirmó exclusivamente
changed audiomuse_dedup_cleanup (command). Daemon healthy, 19 tareas y
config_stale=false. No se reinició ni relanzó un job. El cambio del role queda
como fuente para futuras ejecuciones; no se ejecutó el role completo.
Backup: media-208:/home/monxas/runwisp/runwisp.toml.before-audiomuse-log-20261019T230808.
Sintaxis del playbook Ansible correcta.
Fuentes publicadas en homelab-infra commit 68a75f8; consola publicada hasta
60a85d5. Ambos árboles quedaron limpios. Los dos servicios ansible-pull
habían terminado con Result=success/ExecMainStatus=0 y ambos timers seguían
activos al cierre; esa lectura no acredita un pull posterior al commit nuevo.
El push señaló una alerta Dependabot alta abierta, número 146: braces <=3.0.3
en services/wp-pulse-server/web/pnpm-lock.yaml, sin versión parcheada declarada
en la API al consultar. No se ha demostrado alcance en producción ni aplicado
un override o una actualización de sitios de clientes por esta auditoría.
Queda registrada para el propietario de ese proyecto, fuera de las mutaciones
operativas del homelab realizadas aquí.
Orden de trabajo que deja esta revisión¶
- Térmica de pmx51 y estabilidad de pmx50. pmx51 estuvo a 78–81 °C y
acumuló 363 eventos de limitación en 36 s. Tiene
thermal.off=1persistente desde agosto, sin antecedente localizado; eso desactiva control ACPI, no demuestra anulación de protecciones de hardware. Revisar disipación y antecedente antes de cambiar arranque. pmx50 sigue con watchdog como causa de reinicio registrada, sin volcado que identifique el origen. - Terminar originales y recuperar Immich en aislamiento. Photos avanza,
pics espera. Los 31.621 registros apuntan a esos dos grupos;
/dataestá vacío. El dump real más reciente es del 19 octubre 00:00 UTC y pasó CRC. Todavía no hay un punto coherente dump/generaciones ni restore completo. - Reparar AudioMuse con guardas de datos. Navidrome activo está en CT218; redirigir el limpiador sin rechazar listas vacías, proveedor equivocado y borrados excesivos puede eliminar mappings válidos. Primero estimación y transacción con límites; no ocultar ahora su error. En paralelo, cerrar los dos riesgos de transición pendientes de la consola antes de usar L2–L4 para intervenir almacenamiento o parar aplicaciones.
- Recuperar actualizaciones nocturnas. Tres días fallando por timeout/429 de LSCR. Aplicaciones actuales saludables; preparar reintentos acotados con backoff, sin lanzar actualizaciones masivas como prueba.
- TRMNL y editor Soularr. TRMNL sigue colisionando con Mylar3 en 8090 y su
app está sin redes. Hay diff parcial al puerto 8094; requiere reconciliar
runtime, labels, rutas y reposo preservando volúmenes. Soularr permite
editor anónimo en LAN; por WAN exige Cloudflare Access. Endurecer identidad
del editor tras inventariar consumidores; no romper Caddy remoto con un
bind localhost ni inventar
/forward-authde Pocket ID.
N-1 mantiene solo +828 MiB tras reserva de 2 GiB en la muestra: no recortar más RAM ni presentar máximos simultáneos como acreditados. DNS primario/secundario coinciden en las consultas UDP/TCP; ambos Caddy activos y VIP única. Todos los 44 targets de Prometheus respondían. Los 29 pendientes de contratos se descomponen en evidencias funcionales/acceso/imagen/restore, no 29 averías.
SAI/Meross conserva las barreras previas: faltan herramientas HA permitidas y autonomía/presupuesto de parada acreditados. No se realizaron cortes, reinicios, migraciones, stress, scrub, poda, descargas ni despertares de servicios para demostrar esta revisión. No se afirma auditoría exhaustiva de cada aplicación.