LibreNMS mit Docker Compose: SNMP-Netzwerk-Monitoring für KMU selbst hosten
LibreNMS überwacht Switches, Router, Firewalls und USV per SNMP. Die Anleitung zeigt das offizielle Docker-Compose-Setup (getestet mit 26.10.1), sichere Zugangsdaten, Assistent, erstes Gerät, Reverse Proxy, Backup und Updates.
Geprüft am 21.10.2026 · für LibreNMS 26.10.1
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

In kleinen Firmennetzen fallen schleichende Probleme oft erst beim Ausfall auf: ein Uplink, der mit 100 statt 1000 MBit läuft, oder eine USV mit Batteriefehler. LibreNMS sammelt per SNMP (Simple Network Management Protocol) Daten von Switches, Routern, Firewalls, Servern, Druckern und USV-Anlagen, erkennt Ports und Sensoren selbständig und zeichnet den Verlauf über Monate auf. Diese Anleitung nutzt das offizielle Compose-Beispiel des Projekts librenms/docker. Grundlage ist ein eigener Test am 01.10.2026 mit LibreNMS 26.9.1 (Image-Tag 26.9.1.1) auf Ubuntu 26.04 mit Docker 29.1.3 und Compose 2.40.3, nachgetestet am 21.10.2026 mit dem Update auf LibreNMS 26.10.1.
Voraussetzungen
- Linux-Server mit Docker Engine und Compose-Plugin v2; getestet auf amd64, das Image gibt es laut README auch für arm64.
- 2 CPU-Kerne und 4 GB RAM als Minimum, bei über 50 Geräten 4 Kerne; 40 GB Speicher, bei vielen Ports mehr, denn die RRD-Dateien wachsen mit der Portanzahl. Im Test belegten die sieben Container im Leerlauf 450 bis 670 MiB.
- Netzwerkzugang per UDP 161 vom Server zu den Geräten und SNMP-Zugangsdaten (Community oder SNMPv3-Benutzer) für jedes Gerät.
- Per NTP synchronisierte Hostuhr; der Selbsttest prüft die Zeit von PHP und Datenbank.
- Ein SMTP-Konto für Alarmmails und für den Zugriff von außen eine Domain mit Reverse Proxy.
| Eckdaten | Wert |
|---|---|
| Images | librenms/librenms:26.10.1, mariadb:10, redis:7.2-alpine, crazymax/msmtpd |
| Dienste | db, redis, msmtpd, librenms, dispatcher, syslogng, snmptrapd |
| Ports | 8000/TCP (Weboberfläche), 514 TCP/UDP (Syslog), 162 TCP/UDP (SNMP-Traps) |
| Daten | ./db (MariaDB), ./librenms (RRD-Dateien, Anwendungsschlüssel) |
| Im Test gemeldet | PHP 8.4.21, MariaDB 10.11.19, RRDTool 1.9.0, Net-SNMP 5.9.5.2 |
Schritt 1: Vorlagendateien herunterladen
Laden Sie die Vorlagen aus dem Release-Tag statt aus dem Hauptzweig. So passen Compose-Datei und Image-Version zusammen, auch wenn das Projekt später umbaut. Der Docker-Tag 26.10.1-r1 gehört zu LibreNMS 26.10.1.
sudo mkdir -p /opt/librenms
cd /opt/librenms
B=https://raw.githubusercontent.com/librenms/docker/26.10.1-r1/examples/compose
for f in compose.yml .env librenms.env msmtpd.env; do sudo curl -fsSL -o "$f" "$B/$f"; done
Die compose.yml definiert sieben Dienste. Der Container librenms liefert die Weboberfläche, dispatcher fragt die Geräte ab (SIDECAR_DISPATCHER=1), syslogng und snmptrapd nehmen Syslog-Meldungen und SNMP-Traps an. Alle vier nutzen dasselbe Image und dasselbe Datenverzeichnis.
Verifizieren: ls -la /opt/librenms zeigt compose.yml, .env, librenms.env und msmtpd.env, und grep -c 'image:' compose.yml gibt 7 aus.
Schritt 2: Zugangsdaten und Version festlegen
Die Vorlagen enthalten öffentlich bekannte Beispielwerte wie asupersecretpassword und die Community librenmsdocker. Ersetzen Sie diese, bevor Sie starten. Erzeugen Sie ein Datenbankpasswort mit openssl rand -hex 24 und tragen Sie es in die .env ein:
TZ=Europe/Berlin
PUID=1000
PGID=1000
MYSQL_DATABASE=librenms
MYSQL_USER=librenms
MYSQL_PASSWORD=IHR_LANGES_DB_PASSWORT
In librenms.env ändern Sie LIBRENMS_SNMP_COMMUNITY; in msmtpd.env tragen Sie Ihren SMTP-Server, Benutzer, Passwort und Absender ein. Die übrigen Werte der Vorlage (PHP-Grenzen, Redis als Cache und Sitzungsspeicher) bleiben. Ersetzen Sie zum Schluss in allen vier Image-Zeilen librenms/librenms:latest durch die feste Version:
sudo sed -i 's#librenms/librenms:latest#librenms/librenms:26.10.1#' compose.yml
sudo chmod 600 .env msmtpd.env
Verifizieren: grep -rE 'asupersecretpassword|librenmsdocker|smtp.gmail.com' .env librenms.env msmtpd.env liefert keine Ausgabe, und grep 'librenms/librenms:' compose.yml zeigt viermal 26.10.1.
Schritt 3: Port 8000 an localhost binden
Die Vorlage veröffentlicht die Weboberfläche unverschlüsselt auf allen Adressen. Ergänzen Sie im Dienst librenms unter ports die Zeile host_ip:
ports:
- target: 8000
published: 8000
host_ip: 127.0.0.1
protocol: tcp
Syslog (514) und SNMP-Traps (162) lauschen weiterhin auf allen Adressen und sollten nur aus dem Verwaltungsnetz erreichbar sein. Brauchen Sie beide Funktionen nicht, kommentieren Sie die Dienste syslogng und snmptrapd aus; im Test sparte das rund 120 MiB RAM.
Verifizieren: sudo docker compose config | grep -B3 'target: 8000' zeigt host_ip: 127.0.0.1. Die aufgelöste Konfiguration gibt host_ip vor target aus, ein grep -A findet die Zeile deshalb nicht. Nach dem Start in Schritt 4 zeigt sudo ss -tlnp | grep 8000 nur 127.0.0.1:8000.
Schritt 4: Stack starten
cd /opt/librenms
sudo docker compose up -d
sudo docker compose logs -f librenms
Direkt nach dem Start antwortet die Oberfläche noch nicht, weil der Container die Datenbankstruktur anlegt. Im Test erschien nach 40 bis 90 Sekunden ready to handle connections im Protokoll. Beenden Sie die Logansicht mit Strg+C.
Verifizieren: sudo docker compose ps zeigt sieben Container mit Status Up, und curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8000/ liefert 302.
Schritt 5: Assistent abschließen und erstes Gerät aufnehmen
Öffnen Sie die Oberfläche über einen SSH-Tunnel (ssh -L 8000:127.0.0.1:8000 admin@server) unter http://localhost:8000. Der erste Aufruf leitet auf /install/user. Legen Sie dort den Administrator an und bestätigen Sie den Abschluss. Ein nur per Kommandozeile mit lnms user:add angelegter Administrator schließt den Assistenten nicht ab: Im Test leiteten danach weiterhin alle Seiten auf /install um.
Als erstes Gerät eignet sich der LibreNMS-Container selbst. Befehle mit lnms laufen als Benutzer librenms:
sudo docker compose exec -u librenms librenms \
lnms device:add --v2c --community IHRE_COMMUNITY librenms
sudo docker compose exec -u librenms librenms lnms device:poll librenms
Im Test meldete der erste Befehl Added device librenms (1), der zweite Polled librenms (1) in 1.470 seconds, und unter librenms/rrd/librenms/ entstanden die ersten RRD-Dateien. Weitere Geräte nehmen Sie über „Gerät hinzufügen“ in der Oberfläche auf. SNMPv2c überträgt die Community im Klartext; nutzen Sie über unsichere Strecken SNMPv3 und begrenzen Sie den SNMP-Zugriff auf den Geräten per Zugriffsliste auf den LibreNMS-Host.
Verifizieren: sudo docker compose exec librenms grep INSTALL /opt/librenms/.env liefert keine Ausgabe mehr, die Anmeldung führt auf das Dashboard, und lnms device:poll endet mit Polled … in … seconds.
Schritt 6: Selbsttest und Poller prüfen
sudo docker compose exec -u librenms librenms php /opt/librenms/validate.php
sudo docker compose logs --tail 20 dispatcher
Warnungen zu fehlenden Geräten oder Updates sind direkt nach der Installation normal. Die [FAIL]-Meldungen zu Python-Wrapper-Pollern und Scheduler verschwanden im Test nach etwa zwei Minuten. Der Dispatcher meldet wiederkehrend Completed alerting run for alerts; fehlt diese Zeile, läuft kein Poller. Einzelne Geräte testen Sie direkt per SNMP; eine falsche Community quittiert snmpget mit Timeout: No Response from ….
sudo docker compose exec -u librenms librenms \
snmpget -v2c -c IHRE_COMMUNITY -t 2 -r 1 ZIEL sysDescr.0
Verifizieren: validate.php zeigt nach einigen Minuten keine [FAIL]-Zeilen mehr, und ls /opt/librenms/librenms/rrd/librenms/ | head listet Dateien wie availability-604800.rrd.
Schritt 7: Reverse Proxy mit TLS einrichten
Ein Reverse Proxy terminiert TLS und reicht Anfragen an 127.0.0.1:8000 weiter. Ein Beispiel für nginx mit einem Zertifikat von Let's Encrypt:
server {
listen 443 ssl;
http2 on;
server_name monitoring.example.de;
ssl_certificate /etc/letsencrypt/live/monitoring.example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monitoring.example.de/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Tragen Sie in librenms.env Basisadresse und Proxy ein. Bei REAL_IP_FROM und APP_TRUSTED_PROXIES gehört nur Ihr eigener Proxy hinein, denn vertrauenswürdige Hosts können laut README jede Kopfzeile setzen. Danach erstellen Sie die Container mit sudo docker compose up -d neu.
LIBRENMS_BASE_URL=https://monitoring.example.de
REAL_IP_FROM=127.0.0.1/32
APP_TRUSTED_PROXIES=127.0.0.1
Verifizieren: curl -I https://monitoring.example.de liefert von einem anderen Rechner eine Antwort mit gültigem Zertifikat, und curl -m 5 http://IHRE-SERVER-IP:8000/ scheitert.
Schritt 8: Backup, Wiederherstellung und Update
Zu sichern sind die Datenbank und das Datenverzeichnis mit RRD-Historie und /data/.env. Diese Datei enthält den Anwendungsschlüssel; ohne ihn sind verschlüsselte Werte unlesbar. Das Image mariadb:10 bringt mariadb-dump mit, --single-transaction sichert konsistent ohne Tabellensperren:
sudo mkdir -p /var/backups/librenms
cd /opt/librenms
sudo docker compose exec -T db mariadb-dump -u librenms -p'IHR_DB_PASSWORT' \
--single-transaction librenms > /var/backups/librenms/librenms-db-$(date +%F).sql
sudo tar czf /var/backups/librenms/librenms-data-$(date +%F).tar.gz -C /opt/librenms librenms
Die Wiederherstellung wurde im Test durchgespielt, das Gerät kam danach samt Historie zurück. Stoppen Sie Anwendung und Poller, die Datenbank läuft weiter:
sudo docker compose stop librenms dispatcher syslogng snmptrapd
sudo docker compose exec -T db mariadb -u librenms -p'IHR_DB_PASSWORT' librenms \
< /var/backups/librenms/librenms-db-JJJJ-MM-TT.sql
sudo mv /opt/librenms/librenms /opt/librenms/librenms.alt
sudo tar xzf /var/backups/librenms/librenms-data-JJJJ-MM-TT.tar.gz -C /opt/librenms
sudo chown -R 1000:1000 /opt/librenms/librenms
sudo docker compose start librenms dispatcher syslogng snmptrapd
Für ein Update lesen Sie die Release Notes, erstellen einen frischen Datenbankabzug, setzen in der compose.yml den neuen Image-Tag und führen sudo docker compose pull sowie sudo docker compose up -d aus. LibreNMS hebt das Datenbankschema beim Start an. Ein älteres Image allein ist deshalb kein Rückweg, nur zusammen mit dem Abzug von vor dem Update.
Update von 26.9.1.1 auf 26.10.1: Die vier Vorlagendateien sind in den Tags 26.9.1.1-r1 und 26.10.1-r1 identisch, es reicht der neue Image-Tag in allen vier Zeilen. Laut Release Notes entfernt 26.10.0 die collectd-Anbindung (Breaking Change für Installationen, die collectd-Graphen einbinden) sowie undokumentierte Kommandozeilenbefehle; 26.10.1 nimmt eine Änderung zurück, die mit alten fping-Versionen Probleme machte. Im Test am 21.10.2026 hob der Start die Zahl der Migrationen von 403 auf 408, Gerät und Benutzer blieben erhalten, validate.php meldete Database Schema is current ohne Fehler, die Anmeldung mit dem bestehenden Konto führte auf das Dashboard, ein falsches Passwort wieder auf /login, und der Dispatcher meldete Completed alerting run for alerts.
Verifizieren: grep -c "CREATE TABLE" /var/backups/librenms/librenms-db-$(date +%F).sql liefert über 150, tar tzf … | grep -E 'rrd/|\.env$' zeigt RRD-Dateien und .env, und nach einem Update meldet validate.php keine Fehler.
Typische Fehler
| Fehlerbild | Ursache | Lösung |
|---|---|---|
| Oberfläche antwortet nach dem Start nicht | Container legt noch die Datenbank an | Auf ready to handle connections warten (im Test 40 bis 90 s) |
Do not run validate.php as root (im Test) | Befehl ohne Benutzerangabe | -u librenms bei validate.php und lnms |
Oberfläche ohne Formatierung, Formulare und Assistent senden an http:// | Aufruf über einen HTTPS-Proxy, bevor die Einträge aus Schritt 7 gesetzt sind (im Test beobachtet) | Assistent per SSH-Tunnel abschließen, dann LIBRENMS_BASE_URL, REAL_IP_FROM und APP_TRUSTED_PROXIES setzen |
Alles leitet auf /install um | Assistent nicht abgeschlossen (INSTALL=user,finish in /opt/librenms/.env) | Abschluss im Browser bestätigen |
Could not ping … beim Hinzufügen (im Test) | Gerät nicht erreichbar | Erreichbarkeit prüfen; --force nur bewusst einsetzen |
| Keine Graphen | Dispatcher läuft nicht oder SNMP-Zugangsdaten falsch | SIDECAR_DISPATCHER=1 prüfen, Community und Paketfilter testen |
| Container startet nicht | Ports 8000, 514 oder 162 belegt, oder ./librenms gehört nicht PUID/PGID | Port freimachen, sudo chown -R 1000:1000 /opt/librenms/librenms |
Häufige Fragen
Für welche Geräte eignet sich LibreNMS?
Für alles, was SNMP spricht: Managed Switches, Router, Firewalls, Access Points, USV-Anlagen und NAS-Systeme. Server lassen sich per SNMP-Agent mit CPU, RAM, Platten und Interfaces einbinden. Container-Metriken, Anwendungs-Performance oder Erreichbarkeit von Webseiten aus Kundensicht deckt LibreNMS nicht ab; dafür ergänzen Sie einen Uptime-Monitor.
Wie entfernen Sie LibreNMS vollständig?
sudo docker compose down entfernt Container und Netzwerke; die Daten in ./db und ./librenms bleiben. Erst nach geprüfter Sicherung löschen Sie sie mit sudo rm -rf /opt/librenms/db /opt/librenms/librenms. Das ist unumkehrbar.
Wer bekommt die Alarme?
Klären Sie vorab, wer Alarme außerhalb der Bürozeiten erhält, und hinterlegen Sie die Empfänger in den Alarmregeln. Testen Sie den Mailversand über das msmtpd-Relais, bevor das erste produktive Gerät überwacht wird.
Fazit
Mit dem offiziellen Compose-Beispiel steht LibreNMS in wenigen Minuten, und schon bei einer Handvoll Switches deckt es Portfehler und halbierte Uplinks auf, bevor Nutzer sie bemerken. Wichtig sind eine feste Image-Version, eigene Zugangsdaten statt der Vorlagenwerte, eine nur lokal gebundene Oberfläche hinter TLS, der abgeschlossene Assistent und eine Sicherung, die auch den Anwendungsschlüssel enthält.


