Server im Blick behalten – ohne Overhead

Grafana, Prometheus, Netdata alle leistungsfähig, alle aufwendig. Wer einfach wissen möchte ob ein Server noch läuft, wie viel RAM ein Container verbraucht und eine E-Mail bekommt wenn die Disk voll wird, braucht keinen Monitoring-Stack mit stundenlanger Konfiguration.

Beszel ist ein Open-Source-Monitoring-Tool, geschrieben in Go, mit einem schlanken PocketBase-Dashboard. Der Agent benötigt nur 6 MB RAM, der Hub etwa 23 MB – ein Bruchteil dessen, was Netdata oder ein Prometheus-Stack verbrauchen.

💡 Niveau: Einsteigerfreundlich. Docker und Docker Compose werden vorausgesetzt.


Was überwacht Beszel?

Beszel erfasst CPU-Auslastung von Host und Containern, RAM-Verbrauch inklusive Swap und ZFS ARC, Disk-Nutzung auf mehreren Partitionen, Disk-I/O, Netzwerkverkehr, Load Average, Temperaturen, GPU-Auslastung (Nvidia, AMD, Intel), S.M.A.R.T.-Festplattengesundheit sowie Status und Metriken aller laufenden Docker- und Podman-Container.

Dazu kommen:

  • 🔔 Alerts – konfigurierbare Schwellenwerte für CPU, RAM, Disk, Netzwerk, Temperatur
  • 👥 Multi-User – jeder Nutzer verwaltet eigene Systeme, Admins können teilen
  • 🔐 OAuth/OIDC – Unterstützung für viele OAuth2-Provider, Passwort-Auth abschaltbar
  • 💾 Automatische Backups – auf Disk oder S3-kompatiblen Speicher
  • 📡 REST API – Metriken in eigenen Skripten und Anwendungen nutzbar

Architektur – Hub & Agent

Beszel besteht aus zwei Hauptkomponenten: dem Hub und dem Agent.

┌─────────────────────────────────────────────┐
│              Beszel Hub (Port 8090)         │
│                                             │
│  Web-UI · PocketBase · Alerting · Auth      │
│  ./beszel_data  → Datenbank & Konfiguration │
│  ./beszel_socket → Unix Socket              │
└──────────────────────┬──────────────────────┘
                       │ Unix Socket
                       │ (lokaler Agent)
┌──────────────────────▼──────────────────────┐
│           Beszel Agent (network_mode: host) │
│                                             │
│  Sammelt: CPU · RAM · Disk · Netzwerk       │
│  ./beszel_socket → Socket zum Hub           │
│  /var/run/docker.sock → Container-Metriken  │
└─────────────────────────────────────────────┘

Der Hub ist die zentrale Schaltstelle – er aggregiert Metriken von allen Agents, stellt die Web-Oberfläche bereit und versendet Alerts.

Der Agent läuft auf jedem zu überwachenden Server, sammelt Systemmetriken und schickt sie an den Hub. In dieser Konfiguration laufen Hub und Agent auf demselben Host und kommunizieren über einen Unix Socket statt über das Netzwerk – effizienter und ohne offene Ports.

Der Agent läuft mit network_mode: host. Er sieht damit die echten Netzwerkinterfaces des Hosts und kann Netzwerkstatistiken korrekt erfassen.


Vorbereitung

mkdir -p /opt/beszel
cd /opt/beszel

docker-compose.yml

services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel
    restart: unless-stopped
    ports:
      - 8090:8090
    volumes:
      - ./beszel_data:/beszel_data
      - ./beszel_socket:/beszel_socket

  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./beszel_agent_data:/var/lib/beszel-agent
      - ./beszel_socket:/beszel_socket
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      LISTEN: /beszel_socket/beszel.sock
      HUB_URL: http://localhost:8090
      TOKEN: <token>
      KEY: "<key>"

volumes – beszel

volumes:
  - ./beszel_data:/beszel_data
  - ./beszel_socket:/beszel_socket

beszel_data enthält die PocketBase-Datenbank mit allen Metriken, Einstellungen und Nutzerdaten – das wichtigste Verzeichnis für Backups. beszel_socket ist ein geteiltes Verzeichnis zwischen Hub und Agent für die Socket-Kommunikation.

volumes – beszel-agent

volumes:
  - ./beszel_agent_data:/var/lib/beszel-agent
  - ./beszel_socket:/beszel_socket
  - /var/run/docker.sock:/var/run/docker.sock:ro

Der Docker Socket wird mit :ro (read-only) gemountet – der Agent muss Container nur beobachten, nicht steuern. beszel_socket ist dasselbe Verzeichnis wie beim Hub – darüber findet die Kommunikation statt.

environment – beszel-agent

environment:
  LISTEN: /beszel_socket/beszel.sock
  HUB_URL: http://localhost:8090
  TOKEN: <token>
  KEY: "<key>"

LISTEN definiert den Socket-Pfad über den der Hub den Agent erreicht. HUB_URL zeigt auf den lokalen Hub. TOKEN und KEY werden beim ersten Start in der Hub-Oberfläche generiert – sie dürfen nicht im Repository landen.


Start & Erstkonfiguration

docker compose up -d

# Logs beobachten
docker compose logs -f

Die Web-Oberfläche ist unter http://server-ip:8090 erreichbar. Beim ersten Aufruf wird ein Admin-Account angelegt.

Token & Key einrichten

  1. Im Hub-Dashboard auf Add System klicken
  2. Den generierten TOKEN und KEY kopieren
  3. In die compose.yml eintragen
  4. Container neu starten:
docker compose up -d --force-recreate beszel-agent

Danach erscheint der lokale Server in der Hub-Übersicht und Metriken beginnen einzulaufen.


Alerts konfigurieren

Alerts werden pro System über das Glocken-Symbol im Dashboard konfiguriert. Verfügbare Schwellenwerte: CPU, RAM, Disk, Netzwerkbandbreite, Temperatur, Load Average und Container-Status.

Für E-Mail-Benachrichtigungen muss ein SMTP-Server in PocketBase konfiguriert werden – erreichbar unter http://server-ip:8090/_/ mit den Admin-Zugangsdaten.


Traefik-Integration

services:
  beszel:
    # ...
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.beszel.rule=Host(`beszel.docker.example.com`)"
      - "traefik.http.routers.beszel.entrypoints=websecure"
      - "traefik.http.routers.beszel.tls.certresolver=hetzner"
      - "traefik.docker.network=proxy"
    networks:
      - proxy
      - default

networks:
  proxy:
    name: proxy
    driver: bridge
    external: true

⚠️ Das Web-Interface muss über HTTPS erreichbar sein damit die “Copy Docker Compose”-Funktion im Dashboard funktioniert – Clipboard-Zugriff ist im Browser nur über sichere Verbindungen erlaubt.


Weitere Systeme überwachen

Beszel ist nicht auf einen einzelnen Server beschränkt. Für jeden weiteren Server wird nur der Agent deployed. Im Hub-Dashboard auf Add System klicken – Beszel generiert automatisch den passenden Compose-Block für den neuen Agent, inklusive Key.

Für entfernte Server kommuniziert der Agent per SSH mit dem Hub statt über einen Unix Socket:

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           # Port auf dem der Agent lauscht
      KEY: "<hub-public-key>"

Der Port muss in der Firewall des entfernten Servers freigegeben sein – oder über ein privates Netzwerk (VPN, Tailscale) erreichbar gemacht werden.


Updates & Wartung

# Images updaten
docker compose pull
docker compose up -d

# Backup der Datenbank
cp -r beszel_data/ beszel_data_backup_$(date +%Y%m%d)/

Da alle Daten in ./beszel_data liegen, ist ein Backup so einfach wie das Kopieren dieses Verzeichnisses.


Fazit

Beszel füllt eine Lücke: leichter als Netdata, einfacher als Prometheus+Grafana, mehr als ein simpler Uptime-Monitor. Mit über 16.500 GitHub-Stars seit dem Launch 2024 hat sich Beszel schnell als beliebte Wahl für Homelab-Umgebungen etabliert. Wer mehrere Server im Blick behalten und bei Problemen sofort informiert werden möchte, ist mit Beszel in Minuten startklar.