Skip to content

Auditoría de red y proxies — 19 octubre 2026

Lecturas 23:05–23:07 CEST. Solo lectura. No failover, reinicios, scans de puertos, GET de apps dormidas ni llamadas Sablier dynamic/blocking. No cambios de identidad, firewall, DNS o controller. Se preservan los cambios previos ajenos de reverse-proxy/managed.caddy y scripts/homelab-ctl.py.

Resultado

No se ha acreditado un fallo nuevo de DNS o Caddy. Sí persiste la incidencia conocida H7 del ADR-0027: TRMNL comparte el puerto 8090 con Mylar3, y la app TRMNL está desconectada de sus redes. La causa y una propuesta parcial quedan concretadas abajo; no se arrancó TRMNL para probarla.

Redundancia DNS y Caddy observada

  • Pi-hole .204 y .23: 24 consultas UDP de 12 nombres devuelven los mismos registros. Seis consultas TCP adicionales comprueban jellyfin.lan=.220, soularr.monxas.casa=.250 y resolución externa de example.com en ambos. No prueba la independencia física de cada resolver ni conmutación bajo fallo.
  • Caddy CT270 en pmx50 y CT271 en pmx51: Caddy/keepalived activos en ambos. La VIP .250 aparece solo en CT270, no duplicada en CT271 en esta muestra. Caddyfile coincide, SHA256 <REDACTED>. managed.caddy coincide, SHA256 <REDACTED>. Diferencias de keepalived.conf son esperables por prioridad/identidad; no se interpreta su hash diferente como deriva de rutas.
  • GET anónimo /api/events/stream de Dozzle forzando respectivamente .40, .41 y .250, sin proxy de entorno y con TLS verificado: 401 en los tres. Prueba una ruta de un producto ya activo, no todas las apps ni failover real.
  • Informe existente de rutas: 20:40:13.930505Z, exit_code=0, siete hostnames registrados. No se relanzó el colector ni se presume cobertura de TRMNL.

TRMNL: propietario, fuentes y causa

Dueño actual VM208: /home/monxas/stacks/trmnl/compose.yaml. CT218 no contiene ningún contenedor TRMNL en la lectura, aunque el ADR proponía trasladarlo.

Runtime VM208: trmnl-app/db/redis exited. App conserva bind host 8090→80 y tunnel.port=8090; NetworkSettings.Networks vacío. DB/Redis conservan la red trmnl_trmnl-network. Mylar3 está running y ocupa .208:8090. Caddy CT271 usa Sablier para los tres nombres y reverse_proxy .208:8090 en el handle de trmnl.monxas.casa. No se invocó esa ruta: puede despertar las tres cargas.

Compose resuelto válido: app en default, stacks_shared y trmnl-network, depende de db/redis. Los volúmenes declarados coinciden con el runtime existente:

Componente Volumen persistente
MySQL trmnl-server_trmnl-db-data, external=true
Redis trmnl-server_trmnl-redis-data, external=true
Storage aplicación trmnl_trmnl-storage
Imágenes aplicación trmnl_trmnl-images

La app también tiene volúmenes anónimos en /data y /var/log/nginx; evaluar su contenido/propietario y conservar asociación al recrear, sin borrarlos.

Propuesta preparada, no aplicada

Diff parcial del puerto: comentario, publicación 8094→80, APP_URL de reserva y tunnel.port pasan a 8094. 8094 no tiene listener en VM208 ni referencias en Compose de primer nivel /home/monxas/stacks/*/compose.y*ml en esta muestra. No es una reserva global.

Este diff no constituye una reparación completa ni autorización de arranque. Pasos para una intervención posterior acotada:

  1. Capturar diff/hashes actuales del Compose, imagen, mounts y redes; inventariar consumidores de URL/puerto y el valor efectivo de APP_URL sin publicarlo.
  2. Conservar imagen trmnl-server:local y build context /home/monxas/trmnl-server-docker; no pull/build/upgrade lateral. Preservar volúmenes externos, storage/images y anónimos, con recuperación comprobable.
  3. Revisar/aplicar puerto y labels del Compose de origen. Regenerar el label runtime requiere recrear la app; no editar solo Caddy porque el controller vuelve a derivarlo de las etiquetas vivas. Verificar las tres redes y DNS app→db/redis al recrear exclusivamente la app, con ventana autorizada.
  4. Preparar render/diff del controller central CT212 con las fuentes desplegadas actuales, preservando rutas ajenas. Upstream esperado .208:8094; mantener los tres nombres lazy y su sesión. Las rutas Docker ganan sobre static: añadir una entrada static no corrige el label erróneo existente.
  5. Validar configuración de ambos Caddy, diferencia mínima y rollback antes de desplegar. No usar homelab-ctl sync como inspección: puede escribir caches.
  6. Validación funcional y dormancy de TRMNL solo en intervención deliberada; comprobar que no sirve la UI Mylar3, sesiones expiran según política y Mylar3 conserva ID, bind y datos. Conservar estado dormido al terminar si ese era el estado previsto; no registrar una prueba funcional que no se hizo.

Recuperación: volver los cuatro campos al Compose previo, imagen/redes/mounts capturados y upstream/labels anteriores según el plan de rollback específico. El estado previo contiene la colisión conocida: volver a él no significa TRMNL funcional. Ninguna fase se ejecutó en esta auditoría.

No se encontró una nueva avería de red distinta en este alcance. La auditoría no certifica DHCP, conectividad de invitados, red IoT, multicast, switch/router, VPN/Tailscale ni toda la zona DNS; no se tocaron equipos de Carmelo.