Cómo monitorizar tu nube personal con Uptime Kuma

Cuando tu nube personal empieza a crecer, se va haciendo cada vez más complicado monitorizar todos los servicios. Con Uptime Kuma podemos automatizar el proceso de saber cuándo uno de ellos se viene abajo o deja de responder

Cómo monitorizar tu nube personal con Uptime Kuma
Photo by S Migaj / Unsplash

En una ocasión ya hablé de Statping y de cómo nos podía ayudar a monitorizar los servicios que, poco a poco, vamos construyendo en nuestra nube local. El proyecto al parecer se abandonó y, aunque surgieron alternativas que partían de él, comencé a mirar otras opciones. Y así fue como topé con Uptime Kuma.

Con Uptime Kuma podremos monitorizar multitud de servicios mediante HTTP, HTTPS, Ping... e incluso, la ejecución de scripts, ya que nos permitirá exponer un endpoint al que invocar cada vez que nuestro script se ejecute satisfactoriamente. Esto último fue algo que me llamó bastante la atención, ya que tengo algunos procesos automatizados mediante cron y hasta ahora tenía que estar notificando uno a uno cuando no se ejecutaban correctamente. Esto ya quedó atrás, ahora notifican a Kuma de manera silenciosa y ésta última sólo me informa cuando no lo hacen en el tiempo esperado.

Pero dejémonos de explicaciones y vayamos al grano, que será como mejor veamos la utilidad...

Instalar Uptime Kuma

Para el primer paso, la instalación, nos valdremos de nuestro gran amigo Docker, cómo no. Lo primero será crear un directorio y, dentro de él, un fichero docker-compose.yml con el siguiente contenido:

version: '3.3'

services:
  kuma:
    image: louislam/uptime-kuma:1
    container_name: kuma
    restart: always
    volumes:
      - ./data:/app/data
    networks:
      - public
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=public"
      - "traefik.http.routers.kuma-secure.entrypoints=https"
      - "traefik.http.routers.kuma-secure.rule=Host(`status.example.org`)"
      - "traefik.http.routers.kuma-secure.tls=true"
      - "traefik.http.routers.kuma-secure.tls.certresolver=certlocal"
      - "traefik.http.services.kuma.loadbalancer.server.port=3001"

networks:
  public:
    external: true
Fichero docker-compose para Uptime-Kuma

Como podéis observar, el fichero no tiene nada del otro mundo. Apenas merece mención el volumen data que montamos, y que almacenará toda la configuración de Uptime Kuma. También tenemos las ya conocidas labels para Traefik y la red en la que trabaja (que en este caso hemos llamado public). Lanzamos docker-compose up -d y accederemos a https://status.example.org.

El primer paso al acceder a la URL será crear el usuario administrador. Así pues, seleccionamos el idioma por defecto, e introducimos el que será el usuario administrador y la contraseña que usaremos para él:

Panel de creación de un usuario administrador para Uptime Kuma
Panel de creación de un usuario administrador para Uptime Kuma

Configuración inicial

La primera vez que accedemos al panel principal de Uptime Kuma tendremos algo similar a esto:

Panel principal de Uptime Kuma (vacío)
Panel principal de Uptime Kuma (vacío)

Obviamente, se encuentra vacío. En la parte superior derecha vemos que tenemos 3 opciones:

  • Página de estado: Aquí podremos configurar varias páginas de estado, si deseamos particionar nuestro dashboard en varias páginas o bloques.
  • Panel: Nos muestra un vistazo rápido de todas los servicios monitorizados y las estadísticas, así como la opción de crear nuevos.
  • Menú del usuario: Desde aquí podremos acceder a los ajustes de nuestro usuario, tales como contraseña, apariencia de la web, servidores de notificaciones, proxy inversos...

Creación de un nuevo servicio a monitorizar

Comenzaremos creando un servicio que es encargue de monitorizar, por ejemplo... este blog mismo. Para ello, en el menú superior de la derecha haremos clic sobre Panel. En la parte izquierda veremos un botón con el texto Añadir nuevo monitor. Lo pulsaremos y rellenaremos la información que se nos solicita.

Creación de un nuevo monitor HTTPS
Creación de un nuevo monitor HTTPS

De entre las opciones que nos sugiere, las más importantes serían:

  • Tipo de monitor: El tipo de monitor que queremos crear. En este caso, será un monitor HTTPS, que controlará que el blog esté accesible mediante dicho protocolo.
  • Nombre sencillo: El nombre que le daremos al monitor. En mi caso, tras darle muchas vueltas, me he decantado por blog.
  • URL: La URL que monitorizará. En este caso, será la raíz, pero para algunos servicios puede que tengamos un endpoint tipo /health o similar (típico en entorno de microservicios).
  • Intervalo de latidos: Cada cuánto deberá Uptime Kuma comprobar el servicio. En nuestro caso, lo fijaremos en 600 segundos (cada 10 minutos). Cuando más crítico sea un servicio, más pequeño deberá ser este valor, y para servicios más puntuales (por ejemplo, un script de copia de seguridad semanal), podremos poner valores mucho más altos.
  • Intervalo de reintento de latido: Aquí indicaremos cada cuánto deberá Uptime Kuma de reintentar el latido si el primero falló. Le damos el mismo valor en nuestro caso, pues con 5 minutos es más que suficiente para el blog
  • Reintentos: Uptime Kuma monitorizará el servicio cada X segundos (definidos en el intervalo de reintento de latidos) si el primer intento falla. Aquí informaremos de las veces que dicho chequeo puede fallar antes de lanzar una alerta. En nuestro caso, el valor de 3 indicará que, si tras 3 intentos el blog no es alcanzable, deberá informar. Esto ocurrirá si el blog está caído durante más de 15 minutos seguidos (intervalo de 300 segundos x 3 intentos = 900 segundos, es decir: 15 minutos).
  • Method: En esta parte le indicaremos el tipo de petición REST que hará. En nuestro caso, será un simple GET.

En el bloque Avanzado podremos afinar más nuestro monitor. No entraré en detalles, aunque cabe destacar que, para nuestro caso, esperamos una respuesta de tipo 2xx, ya que lo que hará Uptime Kuma será acceder a la página principal y ésta le devolverá la web con un 200. Hay servicios que requieren autenticación, por lo que para el monitor nos podría servir un 401 perfectamente (al fin y al cabo, indicará que el servicio está vivo y bloqueando el acceso).

Seleccionamos etiquetas si queremos, y pulsamos en Crear. Y veremos que se nos ha creado el monitor y nos da información sobre él desde el primer minuto, algo como esto:

Estado del monitor del blog
Estado del monitor del blog

¡Eureka! Ya tenemos nuestro primer monitor funcionando y, al parecer, indicando que el blog está operativo. 😀

Creación de una nueva página de estado

A continuación vamos a crear una nueva página de estado. Para ello, pulsamos en la opción de menú superior derecha llamada Página de estado. En el formulario que se nos aparece introduciremos un nombre que nos sirva de referencia y una URL que será la que usaremos para acceder. Al pulsar en Next veremos cómo nos lleva a la página de configuración del estado, donde podremos modificar el título, la descripción, añadir encabezados y pies de página, subir un logo... e, incluso, notificar de algún incidente (servicios que estarán caídos próximamente).

Formulario de creación de una nueva página de estado
Formulario de creación de una nueva página de estado

Tras modificar de los apartados lo que más nos guste, vamos a proceder a añadir el servicio que hemos creado en el paso anterior. Para ello podemos agregar un grupo, si deseamos agrupar nuestros monitores. En este caso no será necesario, ya que sólo tenemos uno, pero según vayamos añadiendo más nos puede ser útil.

Si hacemos clic en el recuadro que hay debajo de Añadir monitor veremos que nos aparece un listado con los monitores que no tenemos en nuestra página de estado. En este caso aparecerá sólo uno, así que lo seleccionamos. En ese momento veremos que se nos ha creado un grupo por defecto (Services) y, debajo de él, nuestro monitor. Podemos ya, simplemente, pulsar sobre Guardar cambios.

Una vez hecho, si accedemos a https://status.example.org/status/cloud podremos ver el estado de los servicios que estamos monitorizando, y será accesible por cualquiera (aún no se soportan dashboards privados), por lo que cualquiera podrá ver el estado de nuestro servicios si tenemos accesible al exterior la URL.

Ejemplo de página de estado creada con el monitor del blog
Ejemplo de página de estado creada con el monitor del blog

Todo esto está muy bien para informar del estado de nuestros monitores, pero a menos que estemos constantemente refrescando la página, no nos enteraremos si alguno de ellos cae. Para ver cómo solventar esto, vayamos al próximo apartado...

Añadir una notificación

Lo primero que deberemos hacer en este caso es ir a los ajustes de nuestro perfil (arriba a la derecha del todo). En las opciones de menú que nos sale, iremos a Notificaciones.

Formulario de servidores de notificación
Formulario de servidores de notificación

Una vez en él, pulsaremos sobre Configurar notificación. Como veis, tenemos un montón de servicios que podemos usar, pero para el caso de este tutorial seleccionaremos, cómo no, Telegram.

Formulario de creación de un servicio de notificación
Formulario de creación de un servicio de notificación

La información que deberemos rellenar para este caso es, a parte del tipo de notificación Telegram y un nombre que nos permita identificarlo:

  • Bot Token: El token de nuestro bot de Telegram. Si no tenéis uno, hablad con BotFather y que os lo dé.
  • Chat ID: El chat ID de nuestra cuenta de Telegram. Hay mil formas de obtenerlo, pero Uptime Kuma nos dice la mejor: Escribimos a nuestro bot desde nuestra cuenta de Telegram y, acto seguido, accedemos a la URL https://api.telegram.org/bot**********************************************/getUpdates y en el JSON de respuesta veremos nuestro chat ID (dentro de result[0].message.from.id). Obviamente, no te olvides de reemplazar los * por tu token.
  • La casilla de Habilitado por defecto nos permitirá habilitar esta notificación de forma predeterminada, lo que nos ahorrará trabajo para futuros monitores que creemos. Siempre la podemos deshabilitar en la creación de un nuevo monitor, por lo que si usáis mucho Telegram, os recomiendo dejarla activada.
  • La opción Aplicar en todos los monitores existentes nos activará esta notificación en los monitores que ya tengamos. Yo la dejo desactivada en este caso, ya que sólo tengo uno y quiero mostraros cómo hacerlo manualmente.

Finalmente, pulsaremos sobre Test y deberemos recibir en nuestro Telegram una notificación de nuestro bot con el texto de prueba. Si esto sucede, significa que lo tenemos bien configurado y podremos darle a Guardar.

Modificar un monitor para añadir notificación

Ahora que podemos recibir notificaciones por Telegram, es el momento de modificar nuestro monitor para que nos informe si algo va mal. Para ello, pulsaremos sobre Panel (arriba a la derecha) y en la parte izquierda seleccionaremos nuestro monitor. Una vez hecho, veremos que nos aparece información sobre el mismo, estadísticas y una serie de botones de acción, entre ellos el de Editar. Lo pulsamos.

En la parte derecha, bajo el grupo Notificaciones, veremos que nos aparece la creada en el paso anterior, y sólo tendremos que marcar la casilla como activa. También podemos, desde aquí, crear nuestra propia notificación, si queremos añadir alguna más.

Selección de la notificación de Telegram para el monitor
Selección de la notificación de Telegram para el monitor

Y con pulsar en Guardar, ya tendríamos nuestro monitor completo. Ahora, cuando el servicio caiga y los reintentos no consigan alcanzarlo, Uptime Kuma nos notificará por Telegram de ello, con un mensaje similar a éste:

[Blog] [🔴 Down] No heartbeat in the time window

Y cuando el servicio vuelva a estar disponible, nos volverá a informar con algo similar a:

[Blog] [✅ Up] OK

A partir de aquí, es vuestra imaginación la única que os limitará para añadir todo tipo de servicios que queráis monitorizar de manera automática. Además de lo que hemos visto en este tutorial, es interesante explorar los otros tipos de monitores:

  • Push es un tipo de monitor pasivo. Uptime Kuma nos dará un endpoint al que el servicio deberá llamar a modo latido, en lugar de ser el primero el que lo haga. Yo los uso para los script de copias de seguridad, que se ejecutan cada 2 días y, sólo cuando la copia se realiza satisfactoriamente, hacen una llamada a este endpoint... De tal forma que Uptime Kuma lo espera cada 173.000 segundos (172.800 segundos serían 48 horas, por lo que dejo un margen de 3 minutos de más para que el script llame... ya que la copia apenas tarda 1 minuto en completarse).
  • MQTT nos permite conectarnos a un tópico y escuchar en él los eventos producidos. Útil para servicios como Tasmota, el cual publica en un tópico su estado (Online/Offline) cada vez que se conecta (conocido como Birth o mensaje de bienvenida) o cuando se desconecta del bróker (el conocido como mensaje de Last Will Testament). De esta forma, puedo detectar cuándo mi puente Tasmota pierde la conexión Wi-Fi y actuar rápido para reiniciarlo.

Por último, comentar que podemos pausar nuestros monitores desde el Panel siempre que así lo necesitemos (por ejemplo, vamos a hacer cambios en un servicio que sabemos que estará caído y no queremos estar monitorizándolo).

¡Y listo! Con esto ya podéis empezar a hacer vuestros monitores en función de vuestras necesidades. ¡Espero que os sea tan útil como a mí!

Si te ha gustado la entrada, o te ha sido útil y quieres ayudarme a pagar los gastos que conlleva el servidor y mantener así el blog libre completamente de anuncios, puedes hacer una donación en Bitcoin en la siguiente dirección:

Donar