Grafana Grafana

Grafana mit Docker Compose und einem Provisioning-Ordner betreiben

Starte Grafana aus einer Compose-Datei, deren gesamte Konfiguration als Dateien gemountet ist.

10 min Anfänger

Diese Anleitung betreibt Grafana und eine Prometheus-Datenquelle lokal mit Docker Compose, wobei jede Einstellung über Dateien und Umgebungsvariablen geliefert wird. Du öffnest nie die UI, um etwas zu konfigurieren. Du brauchst Docker mit dem Compose-Plugin.

Das Projekt aufbauen

grafana-as-code/
├── compose.yaml
├── .env                          # Secrets und Versionen, nicht committet
├── grafana/
│   ├── grafana.ini
│   └── provisioning/
│       ├── datasources/
│       │   └── prometheus.yaml
│       ├── dashboards/
│       │   └── providers.yaml
│       ├── alerting/             # in der Alerting-Anleitung hinzugefügt
│       └── plugins/
├── dashboards/
│   └── overview.json
└── prometheus/
    └── prometheus.yml

Halte das in Git. Füge .env zu .gitignore hinzu und committe stattdessen eine .env.example.

Die Compose-Datei

compose.yaml:

services:
  grafana:
    image: grafana/grafana:13.1.0   # pinne eine Version, die du getestet hast
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD}
      GF_USERS_ALLOW_SIGN_UP: "false"
    volumes:
      - ./grafana/grafana.ini:/etc/grafana/grafana.ini:ro
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
      - ./dashboards:/var/lib/grafana/dashboards:ro
      - grafana-data:/var/lib/grafana
    depends_on:
      - prometheus

  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro

volumes:
  grafana-data:

Die wichtigen Mounts:

  • /etc/grafana/grafana.ini ist die Server-Konfigurationsdatei im offiziellen Image.
  • /etc/grafana/provisioning ist der Ort, an dem Grafana nach den Ordnern datasources, dashboards, alerting und plugins sucht.
  • /var/lib/grafana/dashboards ist ein beliebiger Ordner für Dashboard-JSON. Der Pfad muss zu dem passen, den du unten im Dashboard-Provider setzt.
  • grafana-data ist ein benanntes Volume für Grafanas SQLite-Datenbank und Plugins. Ohne es geht der Zustand verloren, wenn der Container neu erstellt wird.

Die Konfigurations-Mounts sind absichtlich schreibgeschützt: Grafana muss sie nicht beschreiben.

.env:

GRAFANA_ADMIN_PASSWORD=change-me-before-sharing

Beachte, dass GF_SECURITY_ADMIN_PASSWORD nur angewendet wird, wenn Grafana erstmals seine Datenbank anlegt. Eine spätere Änderung in der Compose-Datei hat keine Wirkung auf ein bestehendes Volume. Entferne das Volume, um von vorn zu beginnen, oder setze das Passwort mit der CLI zurück.

Eine minimale grafana.ini

[server]
http_port = 3000

[analytics]
reporting_enabled = false
check_for_updates = false

[log]
mode = console
level = info

[auth]
disable_login_form = false

Alles, was du weglässt, fällt auf Grafanas Standardwerte zurück. Die nächste Anleitung behandelt die vollständigen Regeln für grafana.ini und GF_*-Überschreibungen.

Eine Datenquelle provisionieren

grafana/provisioning/datasources/prometheus.yaml:

apiVersion: 1

datasources:
  - name: Prometheus
    uid: prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: false

Die uid ist das, worauf Dashboards und Alert-Regeln verweisen sollten, wähle also eine stabile. Die nächsten Anleitungen erklären jedes Feld.

Einen Dashboard-Provider und ein Dashboard provisionieren

grafana/provisioning/dashboards/providers.yaml:

apiVersion: 1

providers:
  - name: default
    type: file
    updateIntervalSeconds: 30
    allowUiUpdates: false
    options:
      path: /var/lib/grafana/dashboards

dashboards/overview.json (ein minimales Dashboard; siehe die Dashboards-Anleitung für die Details):

{
  "uid": "overview",
  "title": "Overview",
  "schemaVersion": 39,
  "panels": [
    {
      "id": 1,
      "type": "timeseries",
      "title": "Targets up",
      "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
      "datasource": { "type": "prometheus", "uid": "prometheus" },
      "targets": [
        { "refId": "A", "expr": "up", "datasource": { "type": "prometheus", "uid": "prometheus" } }
      ]
    }
  ]
}

Und eine winzige prometheus/prometheus.yml, damit es Daten zum Anzeigen gibt:

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

Starten und ohne UI prüfen

docker compose up -d
docker compose logs grafana | grep -i provisioning
curl -s http://localhost:3000/api/health
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/datasources | jq '.[].name'
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD "http://localhost:3000/api/search?type=dash-db" | jq '.[].title'

Der Health-Endpunkt sollte ok melden, die Datenquellenliste sollte Prometheus enthalten, und die Suche sollte Overview zurückgeben. Öffne http://localhost:3000, wenn du das Ergebnis sehen willst, aber um hierher zu kommen, wurde nichts angeklickt.

Etwas ändern und beim Anwenden zusehen

  • Bearbeite dashboards/overview.json. Innerhalb von updateIntervalSeconds greift Grafana die Änderung ohne Neustart auf.
  • Bearbeite die Datenquellen-Datei und starte neu: docker compose restart grafana. Datenquellen werden beim Start gelesen.
  • Lösche eine Dashboard-Datei. Das Dashboard wird entfernt, sofern der Provider nicht disableDeletion: true setzt.

Plugins aus der Konfiguration installieren

Plugins lassen sich beim Container-Start per Umgebungsvariable installieren, sodass sie in der Compose-Datei bleiben:

    environment:
      GF_PLUGINS_PREINSTALL: grafana-clock-panel

Ältere Versionen nutzen stattdessen GF_INSTALL_PLUGINS. Prüfe die Dokumentation für deine Version, und beachte, dass das Provisioning nur Plugins konfiguriert, die bereits installiert sind.

Aufräumen

docker compose down        # Daten-Volume behalten
docker compose down -v     # auch Grafanas Datenbank löschen

Beliebte Anleitungen