Ir al contenido
  1. Posts/

Beszel: monitoriza todos tus servidores desde un panel ligero

Tenía Netdata. Luego tuve Prometheus con Grafana. En algún momento llegué a tener los dos corriendo a la vez porque no me decidía a migrar del todo. Los dos hacen bien su trabajo, pero los dos tienen el mismo problema: son herramientas grandes, con mucha configuración, y cuando tienes más de cinco servidores, mantener esa infraestructura de monitorización ya se convierte en un trabajo aparte.

Hace unos meses empecé a ver Beszel en varios foros de homelab. La propuesta es distinta: un hub central que recoge métricas de agentes ultra-ligeros instalados en cada máquina. Sin bases de datos externas, sin configuración de exporters, sin Grafana necesario. El hub guarda los datos internamente con SQLite, y la interfaz web ya viene incluida.

Lo instalé para probarlo un fin de semana. Tres semanas después, Netdata y Prometheus llevan parados y Beszel sigue corriendo.

Qué monitoriza Beszel
#

Antes de entrar en la instalación, vale la pena entender qué datos recoge, porque es selectivo por diseño.

El hub recibe de cada agente:

  • Uso de CPU (total y por core)
  • RAM y swap
  • Disco: espacio y velocidad de lectura/escritura por partición
  • Red: tráfico de entrada y salida por interfaz
  • Temperatura de CPU (donde esté disponible)
  • Uptime

No hay métricas de aplicaciones, no hay alertas basadas en queries complejas, no hay scraping de endpoints custom. Beszel hace una cosa y la hace bien: te dice cómo están tus máquinas a nivel de sistema. Para todo lo demás, tienes otras herramientas.

Lo que me parece más interesante es cómo gestiona el histórico. El agente envía datos al hub cada pocos segundos, pero el hub los va compactando automáticamente según la antigüedad. Los últimos minutos tienen resolución alta, los últimos días tienen resolución media, y más allá va compactando para no crecer sin control. Sin configuración manual.

Arquitectura hub-agente
#

El hub es un contenedor Docker que expone la interfaz web. No necesita nada más: ni Postgres, ni Redis, ni volúmenes complicados. Un directorio para los datos y ya.

El agente es un binario pequeño que se instala en cada máquina que quieres monitorizar. Conecta al hub por WebSocket y manda los datos de forma continua. La conexión la inicia el agente, lo que significa que el hub no necesita saber de antemano qué máquinas van a conectar, y las máquinas monitoradas no necesitan puertos abiertos hacia fuera.

Esto hace que funcione bien con Tailscale o con NAT: el agente conecta desde dentro hacia el hub, sin reglas de firewall adicionales.

Instalación del hub
#

El despliegue más sencillo es con Docker Compose:

1
2
3
4
5
6
7
8
9
services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    ports:
      - "8090:8090"
    volumes:
      - ./beszel-data:/beszel_data
1
docker compose up -d

La primera vez que abres http://tu-servidor.local:8090 te pide crear el usuario admin. Sin pasos adicionales, sin licencias, sin correo de verificación. Entra, y ya ves el dashboard vacío esperando agentes.

El hub usa PocketBase internamente, así que la interfaz de autenticación y la base de datos vienen incluidas. Puedes incluso crear múltiples usuarios con distintos niveles de acceso si necesitas compartir el monitoreo con alguien más.

Añadir agentes
#

Desde la interfaz del hub, añades un sistema nuevo y te da el comando de instalación del agente. Algo así:

1
2
3
4
curl -sL https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/scripts/install-agent.sh \
  -o /tmp/install-beszel-agent.sh && \
  chmod +x /tmp/install-beszel-agent.sh && \
  sudo /tmp/install-beszel-agent.sh -p 45876 -k "TU_CLAVE_PUBLICA"

El script descarga el binario, lo instala como servicio systemd, y lo configura con la clave que genera el hub. En menos de un minuto tienes el agente corriendo.

Para máquinas con Docker puedes usar también el agente como contenedor:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      PORT: 45876
      KEY: "TU_CLAVE_PUBLICA"

El acceso al socket de Docker es opcional pero permite que Beszel también monitorice el uso de recursos de los contenedores corriendo en esa máquina. Lo tengo activado en los nodos donde uso Docker.

La interfaz
#

No hay mucho que configurar porque no hay mucho que configurar. Entras, ves la lista de tus sistemas, cada uno con su estado actual. Haces clic en uno y ves las gráficas históricas de CPU, RAM, red y disco.

El diseño es limpio. Nada de dashboards con 40 métricas en pantalla que tardan diez segundos en cargar. Lo que necesito para saber si un servidor está bien o mal lo veo en segundos.

Hay alertas básicas configurables: te avisa por email o webhook cuando alguna métrica supera un umbral. CPU al 90% durante más de X minutos, RAM por encima de un porcentaje, disco cerca de llenarse. Para mi uso diario, esto es suficiente. Si hay algo raro a las 3 de la madrugada, recibo el ping.

Consumo de recursos
#

Esto era lo que más me preocupaba antes de instalarlo en todo el cluster. Prometheus con node_exporter y Grafana consume entre 300 y 600 MB de RAM dependiendo de cuántas métricas y dashboards tengas. Netdata anda por los 200-400 MB y bastante CPU en escaneos.

Beszel hub con 12 agentes conectados: menos de 60 MB de RAM. El proceso apenas aparece en top. Cada agente en los servidores monitorados usa menos de 10 MB y una fracción de CPU.

Para un homelab donde cada megabyte importa, esto marca la diferencia. Tengo una VM pequeña de 1 core y 512 MB de RAM dedicada al hub, y no llega ni al 15% de uso.

Lo que falta
#

Beszel tiene limitaciones claras que vale la pena conocer antes de tirarse de cabeza.

No hay alertas basadas en condiciones complejas. Si necesitas “avísame cuando la latencia de esta API supere X ms”, no es tu herramienta. Para eso sigues necesitando Prometheus y Alertmanager.

No hay métricas de aplicaciones. No scraping de endpoints, no métricas custom. Lo que ves es lo que el sistema operativo expone: CPU, RAM, disco, red.

No hay dashboards personalizables. Ves lo que Beszel quiere mostrarte, no lo que tú diseñas. Si eres de los que pasan horas montando dashboards de Grafana perfectos, esto no te va a satisfacer.

Las alertas tampoco tienen mucha granularidad temporal. No puedes hacer “avísame solo si la CPU está alta durante más de 15 minutos en horario laboral”. Es un umbral, un periodo de evaluación, y ya.

Cuándo usar Beszel y cuándo no
#

Lo uso como primera capa de monitorización. Cuando alguien me pregunta “¿está bien el servidor?”, abro Beszel y en dos segundos tengo la respuesta. CPU normal, RAM con margen, disco sin alertas.

Para análisis más profundos, debugging de rendimiento, o correlación entre métricas de aplicaciones e infraestructura, Grafana con Prometheus sigue siendo la opción. Pero no lo tengo corriendo todo el tiempo: arranco el stack cuando lo necesito y lo paro.

Esta combinación funciona bien: Beszel siempre activo para el “health check” rápido, y el stack pesado disponible cuando hay que investigar algo.

Si tienes un homelab con varios servidores y te cansa mantener infraestructura de monitorización compleja, dale una oportunidad. La instalación son veinte minutos, el consumo es marginal, y la información que te da es la que necesitas para saber si todo va bien.

Para proyectos personales y homelabs de tamaño medio, es difícil pedirle más.

Referencias
#