docker-compose.yml Datei:
nano /var/www/grafana/docker-compose.yml ##START version: '3' services: mon_prometheus: image: prom/prometheus:latest container_name: mon_prometheus restart: unless-stopped volumes: - /var/www/grafana/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - /var/xp.grafanadata/prometheus:/prometheus user: "472" #=> grafana User ID vom Grafana Container... command: - '--storage.tsdb.retention.time=16w' #nach 16 Wochen werden alte Daten gelöscht. - '--storage.tsdb.wal-compression' #Daten werden komprimiert gespeichert. - '--config.file=/etc/prometheus/prometheus.yml' #Den Speicherort der prometheus.yml explizit angeben, da die Config sonst nicht gefunden wird und Fehler im Log wirft. depends_on: - mon_node-exporter - mon_cadvisor networks: - default mon_node-exporter: image: prom/node-exporter:latest container_name: mon_node-exporter restart: unless-stopped volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--path.rootfs=/rootfs' - '--collector.filesystem.ignored-mount-points="^(/rootfs|/host|)/(sys|proc|dev|host|etc|media)($$|/)"' - '--collector.filesystem.ignored-fs-types="^(sys|proc|auto|cgroup|devpts|ns|au|fuse\.lxc|mqueue|nfs)(fs|)$$"' networks: - default mon_cadvisor: image: google/cadvisor:latest container_name: mon_cadvisor restart: unless-stopped volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro command: # - '--allow_dynamic_housekeeping=true' - '--global_housekeeping_interval=1m0s' - '--housekeeping_interval=10s' networks: - default mon_grafana: image: grafana/grafana:latest container_name: mon_grafana restart: unless-stopped volumes: - /var/xp.grafanadata/grafana:/var/lib/grafana ports: - 3000:3000 user: "472" #=> grafana User ID vom Container... depends_on: - mon_prometheus labels: - "traefik.enable=true" - "traefik.http.routers.grafana.entrypoints=http" - "traefik.http.routers.grafana.rule=Host(`grafana.xp-server.de`)" #Domain anpassen - "traefik.http.routers.grafana.middlewares=https-redirect@file" - "traefik.http.routers.grafana-sec.entrypoints=https" - "traefik.http.routers.grafana-sec.rule=Host(`grafana.xp-server.de`)" #Domain anpassen - "traefik.http.routers.grafana-sec.tls=true" - "traefik.http.routers.grafana-sec.tls.certresolver=le" - "traefik.http.routers.grafana-sec.tls.options=myTLSOptions@file" - "traefik.http.services.grafana-sec.loadbalancer.server.port=3000" networks: - web - default networks: web: external: true default: driver: bridge ##EOF
Zur Erläuterung:
Zeilen 7-23: Prometheus Container. Prometheus wurde von SoundCloud ins Leben gerufen und ist ein Monitoring und Alerting Toolkit. Der sammelt Daten und speichert sie. Allerdings sind das „nur“ nackte Zahlen. Grafana beauskunftet von Prometheus die gespeicherten Daten und macht dann Grafiken daraus.
Der Container hängt ab von „node-exporter“ und „cadvisor“. In der „prometheus.yml“-Datei wird konfiguriert, über welchen Weg und in welchem Intervall Prometheus Daten vom mon_node-exporter- und mon_cadvisor-Container zieht.
Änderung zum Original:
Zeile 12: Pfad wird voll ausgeschrieben, nicht über eine Variable zur Verfügung gestellt. Wirft keine Fehler.
Zeile 13: Wir speichern die Daten von Prometheus außerhalb des Containers auf unser Host-System unter /var/xp.grafanadata/prometheus ab.
Zeile 14: Die User-ID stellen wir auf „472“, damit der Prometheus-Container auf dem Host schreiben kann.
Zeile 16: Hier stellen wir ein, dass Prometheus 16 Wochen lang Daten speichert (=4 Monate) und dann beginnt, die alten durch neue zu ersetzen. Also keine Angst – das System läuft uns nicht irgendwann voll, sollten wir uns entscheiden, das Monitoring permanent laufen zu lassen…
Zeile 17: Der Befehl komprimiert die geschriebenen Daten von Prometheus um rund die Hälfte. Laut Beschreibung ohne nennenswerte Last.
Zeile 18: Wir geben explizit die Position der prometheus.yml-Datei an. Seltsamerweise hat das Log Fehler geworfen, dass die Datei nicht gefunden wird, wenn wir das nicht machen.
Zeilen 25-40: Node-Exporter Container. Der Container saugt Statistik-Daten von unserem Host System ab und liefert sie an Prometheus. In den Zeilen 30-32 werden die Zugriffe auf „proc“, „sys“ und das „root-Dateisystem“ (alle nur lesend) gesetzt. Hier sollte klar werden, warum ich das mit einem mulmigen Gefühl mache. Voller lesender Zugriff auf das komplette Dateisystem? Spooky, wenn da was schief geht…
Zeilen 42-56: cAdvisor Container. Google hat den gebaut. Der analysiert und leitet Performancedaten von allen auf unserem System laufenden Containern weiter an Prometheus.
Änderung zum Original:
Zeilen 53+54: Das „Housekeeping“ wird anstelle der Automatik an fixe Zahlenwerte gekoppelt. Scheinbar hat der Container es mit den Zugriffen übertrieben, was zu einer permanenten Last von rund 15% auf dem Host führt. Mit der Änderung des Housekeeping-Intervalls auf 10 Sekunden reduziert sich die Last auf gute 10%. Immer noch eine ganze Menge, aber 5% weniger, ohne dass mir aufgefallen wäre, dass die Daten darunter leiden. In der Anleitung zum Container wird das Phänomen beschrieben und gesagt, man soll ein wenig mit den Werten spielen…

Zeilen 58-82: Grafana Container. Der Container hängt von mon_prometheus ab und ist damit der letzte in der Kette.
Änderung zum Original:
Zeile 63: Kleine Anpassung am Pfad des Host-Systems.
Zeile 66: Wir stellen die User-ID auf 472, die dem Grafana-User des Containers entspricht.
Zeilen 69-79: Die Traefik-Label, angepasst an unsere Traefik Installation. Hier bitte zwei Mal Deine Domain eintragen…
Zeilen 80-88: Die Docker-Netzwerke sind auch an unsere Traefik-Installation angepasst („web“).
Grafana starten
Über das bekannte „docker-compose“ holen wir uns nun die Images aus dem Netz und starten danach die Container:
docker-compose -f /var/www/grafana/docker-compose.yml pull docker-compose -f /var/www/grafana/docker-compose.yml up -d Creating network "grafana_default" with driver "bridge" Creating mon_node-exporter ... done Creating mon_cadvisor ... done Creating mon_prometheus ... done Creating mon_grafana ... done
Die Container wurden erstellt und hochgefahren. Nach einer kurzen Wartezeit für den ersten „Init“ und das Einrichten des Zertifikats durch Traefik geben wir im Browser unsere Internet-Adresse ein, die wir für Grafana vergeben haben.
ich würde gerne von nextcloud (extern) die Daten ebenfalls anzeigen lassen. Ich habe es mal mit dem unter System > Externes Überwachungsprogramm probiert mit folgendem:
https://xxx.xxx.de/ocs/v2.php/apps/serverinfo/api/v1/info?format=json
weiss jemand, welches Plugin man dazu benötigt, resp. kann es auch in prometheus eingebunden werden?
Gruss Jakob
Tolle Sache…
Sinvolle wäre es noch wenn man Benachrichtigt(Mail) wird wenn ein Wert wie beispielsweise CPU oder Memory überschritten wird.
Hast du das schon ausprobiert?
Alerting hab ich noch nicht ausprobiert.
Die haben das ganz schön beschrieben:
https://www.metricfire.com/blog/grafana-alerting
Interessant wäre, ob die Mail wirklich auslöst.
Leider hab ich momentan „die Hütte voll“ und kann mich deshalb nur stiefmütterlich um Projekt-Rootserver kümmern. Aber ich schreib das auf meine ToDo, dass wir das auch mal getestet bekommen.
Wünsch Dir einen schönen Sonntag!
Peter.
Ich habe die passende Datei gefunden: /etc/grafana/grafana.ini
Dort den jeweiligen SMTP-Host definieren und in grafana noch den Bereich Alerts konfigurieren.
Super, vielen Dank, Olaf!
Wenn die Hütte nicht mehr so lichterloh brennt, bau ich das nach und füge das direkt ins Tutorial ein.
Liebe Grüße
Peter.
Cool das du deine Anleitungen immer wieder ausbaust.
Danke für das super Tutorial. Hat einwandfrei geklappt.
Grafana bietet zwar eine Art bruteforce Schutz für den Login. Allerdings nur, wenn der Angreifer den richtigen Benutzernamen benutzt. Ansonsten werden die Anfragen weiter verarbeitet.
Ich persönlich habe noch zusätzlich per fail2ban abgesichert. Gibt mir persönlich noch ein bisschen mehr Ruhe beim Schlafen. :)
Ansonsten wie immer sehr gut gemacht.
Gruß
Jan
Freut mich, dass es wieder geklappt hat, Jan!
Wenn Du Lust hast und es teilen möchtest würde ich mich – und viele Leser sicher auch – sehr über Deine Installation von fail2ban freuen. Das hatte ich früher auf der „Bare Metal“ Kiste auch am Laufen und konnte wirklich ruhiger schlafen… Einfach an fiedler@cpf.de.
Wünsch Dir noch einen schönen Sonntag!
Peter.
Eine Idee wäre es auch noch fail2ban über grafana zu monitoren. Um Zugriffe beispielsweise einzusehen. Hast du das vielleicht bei dir schon umgesetzt und kannst Erfahrungen teilen?
Peter vielleicht eine Idee für dich?
Hi Juno,
die Idee ist gut. Allerdings müsste man dazu den Output der fail2ban-Log-Datei irgendwie in Prometheus bekommen.
Aber „first things first“ – ich muss erst mal fail2ban überhaupt vernünftig zum Laufen bringen, bevor wir da Daten rausziehen können ^^
Beste Grüße
Peter.
Ich habe folgendes mal durch Zufall gefunden
https://github.com/jangrewe/prometheus-fail2ban-exporter
Grafana Dashboard: Fail2ban by ochorocho
Wird eine Anleitung über deine Konfiguration über fail2ban hier auf dem Blog kommen?
Interessantes Script. Schau ich mir an. Könnte klappen, wenn der mon_node-exporter Container den Input frisst…
fail2ban „abschließend“ zu behandeln wird mir einiges an Zeit und Kraft abtrotzen. Ich werde daran arbeiten, kann Dir aber nichts versprechen. Also weder „ob“ noch „wann“.
Ich mein, SSH mit fai2ban absichern – geschenkt. Aber die Logs der anderen Anwendungen aus den Container ziehen und dafür eigene Regex-Regeln schreiben? Wenn Du mich hören könntest, würdest Du mich jetzt in binär weinen hören…