Dieses Tutorial ist VALID.

Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Haftungsausschluss / Disclaimer

Grafana – Monitoring Suite mit Docker und Traefik installieren

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.

Anzeige *

12 Kommentare zu „Grafana – Monitoring Suite mit Docker und Traefik installieren“

  1. 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?

    1. Peter Fiedler

      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.

      1. Ich habe die passende Datei gefunden: /etc/grafana/grafana.ini
        Dort den jeweiligen SMTP-Host definieren und in grafana noch den Bereich Alerts konfigurieren.

        1. Peter Fiedler

          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.

  2. 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

    1. Peter Fiedler

      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.

    2. 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?

      1. Peter Fiedler

        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.

          1. Peter Fiedler

            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…

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Verwendung
von Cookies

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung.

Scroll to Top