Monitoring Layer - External & Internals 🢃3

Dentro del {{homelab}} existe una capa de monitoreo que atraviesa a todos los servicios y hardware de forma horizontal. Esta capa es la encargada de monitorear recursos y dar aviso en casos especiales.

  • IMS - Internal Monitor System
  • EMS - External Monitor System

La diferencia entre IMS y EMS es que el externo vive en un VPS fuera del homelab local. Esto me da la ventaja de poder monitorear distintos servicios por mas de que haya un corte de energía en el {{homelab}} o de internet.

Por otro lado el IMS, funciona de forma similar pero ademas de dar aviso de forma local a través de un medio digital (Telegram / Mail / Push Notification) también me avisa de forma física a través de un panel de información.

EMS

Actualmente tengo un solo servicio corriendo como EMS y es {{Uptime Kuma}}. Este corre en un VPS, esta conectado a mi red a través de {{tailscale}} y se encarga de monitorear todos los servers y algunas páginas web. Para algunos servicios tengo configurado una push notification desde Uptime Kuma a un grupo de {{Telegram}}

Para los servers tengo configurado notificaciones en Telegram que me avisan cuando los servers responden el ping y cuando no.

Update 2024-11-01: Se agrego un stack completo de monitoreo y {{observability}} con {{Grafana}}, {{prometheus}} y {{promtail}}. Todo conectado por {{tailscale}}. Hosteado en un VPS y que muestra bastante estadísticas, tanto de los servidores públicos como de los servers de mi {{homelab}}. Todavía esta en etapa de prueba, tengo que escribir documentación.

IMS

Para lo que es aviso de notificaciones local utilizo las mismas notificaciones push de cada sistema / aplicación en caso de que lo tenga, como por ejemplo {{home-assistant}} que utiliza la app mobile para enviarte notificaciones. Pero también utilizo {{ntfy}} como servidor pub-sub http para mandar push notifications. Las notificaciones son manejadas a través de una API a la que tienen acceso todos los servicios del {{homelab}}.

El panel de información en el departamento todavía no esta funcional, pero la idea es armar un panel simple con una pantalla eink, que consuma muy pocos recursos.

Si en mi {{homelab}} se corta la luz, ya se que los servicios no van a estar funcionando, no necesito una notificación, con una unica excepción que es si yo no estoy en casa. Ahí quién debería encargarse de avisar? Algún nodo externo.

Si bien muchos de los sistemas que uso tienen la posibilidad de notificar cuando algo no sale como lo esperas, me hace un poco de ruido tener esa responsabilidad en muchos lugares, pero a la vez si todo pasa por un solo lugar también es peligroso porque es un single point of failure. Entonces es como que estamos en la misma.

Claramente que esta arquitectura que estoy compartiendo es algo que se me ocurrió, no tiene ninguna teoría mas que la que explique recién. Tampoco sigue estandares, es algo muy personal y en constante desarrollo.

Notas

Cuando debería avisar que un servicio no funciona?

  • cuando deja de responder?
  • cuando empieza a responder?
  • siempre?

Por alguna razón no esta funcionando del todo bien este sistema, sobre todo por que siento que es bastante manual. Me gustaría encontrar una forma de que cada servicio que levanto, automáticamente levante su propio proceso de monitoreo y que haya un lugar (un panel o lo que sea) que me de esa información. El tema es donde vive cada sistema y como hago para que sea lo sumamente resiliente para que en caso de que exista un desperfecto (físico o virtual) pueda seguir funcionando.

Lo que mas busco con todo esto es enterarme de cuando algo no esta funcionando. Necesito enterarme para dos cosas:

  • poder arreglarlo si es posible
    • hay servicios como los de {{quantified-self}} que necesitan estar corriendo continuamente para poder capturar datos, en caso de que un servicio deje de funcionar y no me entere, es un problema por que puedo estar perdiendo datos.
    • hay varios servicios del {{homelab}} que ya son importantes, como por ejemplo {{forgejo}} y son cosas que necesitan estar corriendo 24/7 y saber cuando dejaron de funcionar.
  • poder buscar alternativa al servicio (en caso de que sea un servicio esencial).

Que es lo que debería controlar?

  • para servicios que usan un proxy, como por ejemplo todo lo del {{homelab}} que sistema debería usar para chequear que estén funcionando?
  • los distintos hosts, para esto utilizaria {{prometheus}}. Para cada host es necesario monitorear los recursos y para los que usan docker, los servicios de docker.
    • solaris
      • logs de host
      • recursos
      • docker
        • logs
        • recursos que esta utilizando cada servicio
    • diamond
    • zero
    • t4lan
    • hipercubo
    • pinkbox
    • pfsense
    • arch-desktop
    • seedbox?

Se podría pensar que los dos sistemas EMS y IMS van cambiando a medida que uno se va moviendo de lugares físicos. Tal vez si no estoy en mi casa, el IMS no me sirve para nada, tengo que recibir una notificación externa para poder enterarme también. Entonces se me ocurre que tiene que existir como una especie de {{proxy}} que actué entre los dos. #TODO acá debería buscar la forma de que si salgo de mi red local y no tengo activo {{tailscale}}, debería seguir enterandome de que algo se rompió. Tal vez abrir la conexión de tailscale automáticamente si estoy fuera de casa.

Hay algo con respecto a que algo te avise cuando deja de funcionar que todavía no termino de entender o no termina de gustarme. Entiendo que es al pedo informar que algo esta funcionando cuando sabemos que es el estado “default” que algo este funcional, pero es como que a veces realmente te olvidas de que eso esta ahí. Tal vez se podría agregar como un chequeo cada cierto tiempo para realmente comprobar que ese servicio esta y sigue funcionando.

Otros monitoreos

  • actualizaciones de seguridad
    • necesito saber cuando hay una nueva versión de algún sistema que utilizo
      • {{diun}}
    • actualización de sistemas operativos, sobre todo Kernels y patchs de seguridad
  • inicio de sesión en nodos limítrofes que no fueron hechos por mi
    • esto se debería hacer monitoreando logs /var/log/auth.log ?
    • loki / promtail
  • notificaciones de errores de discos / storage
    • esto es bastante importante
    • S.M.A.R.T
  • espacio en discos / storage
  • estado de un proceso automático
    • hoy en día tengo varias notificaciones para cuando los procesos de backups terminan
    • también para cuando el build y deploy de la web se termina

Siento que si todo pasa por un solo lugar ahí esta el punto de posible falla, se rompe ese punto y me quede sin notificaciones de todo.

TODO

  • metrics vs logs
  • “bird’s eye view”
  • logs aggregation {{loki}} y {{promtail}}
  • alertas -> {{alertmanager}}

Resources