⚡ weretrade IT
DevOps • Observability & Infrastructure

DevOps Monitoring Stack: Docker, Prometheus & Grafana [2026]

⚡ Executive Summary: Das 3-Säulen-Fundament für Ausfallsicherheit

  • Zero-Trust Mesh & Private Tailscale Binding: Binden Sie Überwachungs-Ports (Prometheus 9090, Alertmanager 9093, Node Exporter 9100) niemals an 0.0.0.0 im offenen Internet. Binden Sie Dienste strikt an Loopback (127.0.0.1) oder verschlüsselte Tailscale-VPN-IPs (100.x.x.x). Der Zugriff auf Dashboards erfolgt abgesichert über ein Caddy Mesh Gateway mit Cloudflare Access JWT-Prüfung.
  • TSDB Retention & Volume-Sizing gegen Plattenüberlauf: Ungedrosselte Metriken-Engines füllen Festplatten in Tagen. Definieren Sie in den Prometheus-Flags sowohl Zeit- als auch Speicherdeckel: --storage.tsdb.retention.time=15d und --storage.tsdb.retention.size=40GB. Kombiniert mit Docker Daemon Log-Rotation (max-size: 50m, max-file: 3) bleibt der Host dauerhaft stabil.
  • Intelligente Hysterese & Alert-Deduplizierung: Vermeiden Sie Pager-Müdigkeit durch transiente CPU-Spitzen bei Cronjobs oder Container-Neustarts. Setzen Sie Alertmanager-Regeln mit for: 3m (Warning) und for: 5m (Critical) auf Basis von gleitenden Durchschnitten (rate(...[5m])) und bündeln Sie Benachrichtigungen für Slack und PagerDuty.

1. Architektur-Topologie: Multi-Node Telemetrie & Alarmierung

Der weretrade DevOps-Standard trennt Erfassung, Speicherung, Visualisierung und Alarmierung in isolierte, fehlertolerante Ebenen über private VPN-Netzwerke:

[ Target Hosts & Fleet Nodes ] [ Monitoring Core (lair404 / Central) ] +--------------------------------+ +-----------------------------------------------+ | Host A: Node Exporter (:9100) | ---TLS--> | Prometheus TSDB (Port :9090, 15d Retention) | | Container: cAdvisor (:8080) | (Tailnet) | |-> Scrape Loop (30s Interval, Bearer Auth) | | App Health: /metrics (:9002) | | |-> Rule Engine: alert_rules.yml | +--------------------------------+ +-----------------------------------------------+ | | Metrics API Alert Webhook v v +------------------+ +-------------------+ | Grafana v11 | | Alertmanager | | Dashboard Engine | | Deduplizierung | | (Auth via Caddy) | | (Inhibition Rule) | +------------------+ +-------------------+ | Slack / PagerDuty

2. Production-Pattern: Ready-to-Run docker-compose.monitoring.yml

Der folgende vollständige Compose-Stack initialisiert den gehärteten Monitoring-Verbund mit persistenten Volumes, isoliertem Bridge-Netzwerk, automatischen Healthchecks und striktem Loopback-Binding:

docker-compose.monitoring.yml YAML
# Production-Ready DevOps Monitoring Stack
# Architecture: Prometheus + Grafana + Node Exporter + cAdvisor + Alertmanager
# Security: Bound to private network & Tailscale mesh; strict TSDB volume caps.

version: '3.8'

networks:
  monitoring-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

volumes:
  prometheus_data:
    driver: local
  grafana_data:
    driver: local
  alertmanager_data:
    driver: local

services:
  # 1. Prometheus Metrics Engine & Time Series Database
  prometheus:
    image: prom/prometheus:v2.54.1
    container_name: devops-prometheus
    restart: unless-stopped
    user: "65534:65534"
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=15d'
      - '--storage.tsdb.retention.size=40GB'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
      - '--web.enable-lifecycle'
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./alert_rules.yml:/etc/prometheus/alert_rules.yml:ro
      - prometheus_data:/prometheus
    networks:
      - monitoring-net
    ports:
      # Expose only on loopback or private Tailnet IP (never 0.0.0.0)
      - "127.0.0.1:9090:9090"
    healthcheck:
      test: ["CMD-SHELL", "wget -q --tries=1 -O- http://localhost:9090/-/healthy || exit 1"]
      interval: 15s
      timeout: 5s
      retries: 3

  # 2. Node Exporter (Host Hardware & OS Telemetry)
  node-exporter:
    image: prom/node-exporter:v1.8.2
    container_name: devops-node-exporter
    restart: unless-stopped
    pid: host
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    networks:
      - monitoring-net
    ports:
      - "127.0.0.1:9100:9100"

  # 3. cAdvisor (Live Docker Container Performance)
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.49.1
    container_name: devops-cadvisor
    restart: unless-stopped
    privileged: true
    devices:
      - /dev/kmsg:/dev/kmsg
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    networks:
      - monitoring-net
    ports:
      - "127.0.0.1:8080:8080"

  # 4. Grafana Unified Visualization & Dashboards
  grafana:
    image: grafana/grafana:11.2.0
    container_name: devops-grafana
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_USER=\${GRAFANA_ADMIN_USER:-admin}
      - GF_SECURITY_ADMIN_PASSWORD=\${GRAFANA_ADMIN_PASSWORD}
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_SERVER_ROOT_URL=https://monitoring.weretrade.com
      - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
    networks:
      - monitoring-net
    ports:
      - "127.0.0.1:3000:3000"
    depends_on:
      prometheus:
        condition: service_healthy

  # 5. Alertmanager (Notification Deduplication & Slack Routing)
  alertmanager:
    image: prom/alertmanager:v0.27.0
    container_name: devops-alertmanager
    restart: unless-stopped
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
      - alertmanager_data:/alertmanager
    networks:
      - monitoring-net
    ports:
      - "127.0.0.1:9093:9093"

3. Performance-Vergleich: Ressourcenbedarf der Monitoring-Komponenten

Komponente RAM Footprint CPU-Last (Idle/Scrape) Messintervall Primäre Telemetrie
Node Exporter 15–25 MB < 0.2% Single-Core 30s Pull Host CPU, RAM, Disk I/O, Netzwerk, Filesystem
cAdvisor 40–80 MB 0.5–1.2% Core 30s Pull Container Limits, Throttle, OOM-Events, Docker Socket
Prometheus TSDB 250–600 MB (Head Chunk) 1–3% Core (Scrape/Rule Eval) 15–30s Eval Metriken-Aggregierung, WAL, Komprimierung
Grafana v11 120–250 MB < 0.5% (Spitzen bei Rendern) On-Demand UI Visualisierung, Provisionierte Dashboards, Auth
Alertmanager 20–35 MB < 0.1% Core Ereignisgesteuert Deduplizierung, Alert-Silence, Slack/Email Webhooks

4. Häufig gestellte Fragen (DevOps Monitoring FAQ)

Wie sichern wir Prometheus und Node Exporter gegen unbefugten Zugriff im Web ab?

In Produktionsumgebungen darf kein Exporter öffentlich auf 0.0.0.0 lauschen. Node Exporter und cAdvisor binden wir ausschließlich an das interne Docker-Netzwerk oder die private Tailscale-IP (100.x.x.x). Für zentrale Prometheus-Instanzen, die Dashboards bereitstellen, schalten wir einen Caddy Reverse Proxy vor, der Anfragen über Cloudflare Access mit Authentifizierungstoken (mTLS oder OIDC-Session) validiert.

Wie verhindert man False Positives bei nächtlichen Cronjobs und Spike-Workloads?

Kurze CPU- oder I/O-Spitzen sind bei Datenbank-Backups oder Batch-Aufgaben normal. In den Prometheus Alert Rules verwenden wir stets rate(container_cpu_usage_seconds_total[5m]) > 0.85 mit einem expliziten Zeitfenster von for: 5m. Erst wenn die Auslastung über die volle Dauer von 5 Minuten durchgehend überschritten wird, löst der Alertmanager eine Slack-Benachrichtigung aus.

Welche Storage-Engine und Retention-Limits verhindern Festplattenüberlauf?

Prometheus verwendet standardmäßig nur Zeitlimits (15 Tage). Bei stark dynamischen Container-Umgebungen mit hoher Label-Kardinalität kann dies die Festplatte dennoch füllen. Durch das zusätzliche Setzen von --storage.tsdb.retention.size=40GB löscht die TSDB die ältesten Blöcke automatisch, sobald der Speicherdeckel erreicht wird, unabhängig vom Alter der Daten.

Wie lässt sich der Stack für Multi-Host-Umgebungen über WireGuard / Tailscale erweitern?

Über das Tailscale-Mesh-Netzwerk erhält jeder Server eine feste, isolierte IP (z. B. 100.100.10.10). In der zentralen prometheus.yml tragen wir diese Knoten als statische Ziele unter scrape_configs ein. Der Datenverkehr wird durch WireGuard auf Kernel-Ebene Ende-zu-Ende verschlüsselt, ohne dass Firewall-Ports nach außen geöffnet oder komplexe VPN-Gateways eingerichtet werden müssen.

DevOps & Monitoring Stack Audit anfragen

Planen Sie den Aufbau eines hochverfügbaren Observability-Stacks mit Docker, Prometheus, Grafana und automatisiertem Alerting? weretrade IT unterstützt Sie bei Architektur, Hardening und maßgeschneiderten Dashboards.

Unverbindliches Beratungsgespräch anfragen