Heim Hosting mit Traefik, Grafana und Prometheus: Der perfekte Einstieg mit Docker Compose
Im Zeitalter der Digitalisierung ist der Wunsch nach Unabhängigkeit von Cloud-Anbietern für viele Technikbegeisterte groß. Warum also nicht die wichtigsten Tools für Monitoring, Tracing und Service-Discovery selbst hosten? Und das ganz bequem von zu Hause aus? In diesem Blogartikel zeige ich, wie man mit einem einzigen Docker compose-File einen leistungsfähigen Home-Hosting-Stack aus Traefik, Prometheus, Grafana, Jaeger und cAdvisor aufsetzt.

Was ist Home-Hosting?
Beim Home-Hosting betreibt man eigene Serverdienste im privaten Netzwerk, um zum Beispiel Webseiten, Monitoring oder interne Dashboards unabhängig von externen Cloud-Angeboten zu betreiben. Das gibt volle Kontrolle über Daten, Sicherheit und Infrastruktur und macht Spaß beim Lernen!

Unsere Bausteine im Überblick
  • Traefik: Moderner Reverse Proxy und Load Balancer mit automatischer Let's Encrypt SSL Verwaltung.
  • Prometheus: Leistungsstarkes Monitoring- und Alarming-System für Metriken.
  • Grafana: Visualization-Tool für Metriken und Logs.
  • Jaeger: Open-Source Distributed Tracing für Microservices.
  • cAdvisor: Ressourcennutzung und Performance-Analyse für Container.

Der Compose Stack im Detail

1. Traefik
Traefik lauscht auf HTTP (80) und HTTPS (443), kümmert sich um SSL mit automatischen Let's Encrypt Zertifikaten und bietet ein sicheres Dashboard. Durch die Definition einer entsprechenden middleware lässt sich der Zugriff auf das Dashboard auf einen lokalen IP-Bereich einschränken. Es integriert sich automatisch mit den anderen Docker-Services.

		traefik:
			image: traefik:v3.6.2
			container_name: traefik
			command:
			  - "--log.level=INFO"
			  - "--accesslog"
			  - "--entrypoints.websecure.address=:443"
			  - "--entrypoints.web.address=:80"
			  - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
			  - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
			  - "--providers.docker"
			  - "--providers.docker.exposedByDefault=false"
			  - "--api.dashboard=true"
			  - "--api.insecure=false"
			  - "--certificatesresolvers.leresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"
			  - "--certificatesresolvers.leresolver.acme.email=${DOMAIN_EMAIL}"
			  - "--certificatesresolvers.leresolver.acme.storage=/letsencrypt/acme.json"
			  - "--certificatesresolvers.leresolver.acme.httpchallenge=true"
			  - "--certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web"
			  #Prometheus Metrics
			  - "--metrics.prometheus=true"
			  - "--metrics.prometheus.addEntryPointsLabels=true"
			  - "--metrics.prometheus.addServicesLabels=true"
			  #Jaeger tracing
			  - "--tracing.otlp=true"
			  - "--tracing.otlp.grpc.endpoint=jaeger:4317"
			  - "--tracing.sampleRate=1.0"
			ports:
			  - "80:80"
			  - "443:443"
			volumes:
			  - "./traefik/acme.json:/letsencrypt/acme.json"
			  - "/var/run/docker.sock:/var/run/docker.sock"
			labels:
			  - "traefik.enable=true"
			  # Dashboard Route
			  - "traefik.http.routers.traefik.rule=Host(`traefik.${DOMAIN}`)"
			  - "traefik.http.routers.traefik.service=api@internal"
			  - "traefik.http.routers.traefik.tls.certresolver=leresolver"

			  # Restrict dashboard to local IPs
			  - "traefik.http.routers.traefik.middlewares=local-ipallowlist"
			  - "traefik.http.middlewares.local-ipallowlist.ipallowlist.sourcerange=192.168.0.0/16"
			restart: unless-stopped
			networks:
			  - servicenet
		
2. Prometheus
Prometheus sammelt Metriken von anderen Diensten (z.B. Traefik oder cAdvisor) und stellt sie unter dem `prometheus.${DOMAIN}/metrics` Endpunkt bereit. Über das Traefik-Label wird Prometheus automatisch sicher erreichbar, das Traefik Compose Label sorgt für die Weiterleitung mit Zertifikaten.

		prometheus:
			image: prom/prometheus:latest
			container_name: prometheus
			command:
			  - "--web.enable-lifecycle"
			  - "--web.enable-admin-api"
			  - "--config.file=/etc/prometheus/prometheus.yml"
			volumes:
			  - ./prometheus.yml:/etc/prometheus/prometheus.yml
			labels:
			  - "traefik.enable=true"
			  - "traefik.http.routers.prometheus.rule=Host(`prometheus.${DOMAIN}`)"
			  - "traefik.http.routers.prometheus.entrypoints=websecure"
			  - "traefik.http.routers.prometheus.tls.certresolver=leresolver"
			  - "traefik.http.services.prometheus.loadbalancer.server.port=9090"
			  - "traefik.http.routers.prometheus.middlewares=local-ipallowlist"
			restart: unless-stopped
			networks:
			  - servicenet
		

3. Grafana
Grafana visualisiert die von Prometheus gesammelten Daten als Dashboards unter `grafana.${DOMAIN}`. Die Zugangsdaten werden über Umgebungsvariablen gesetzt.

		grafana:
			image: grafana/grafana:latest
			container_name: grafana
			environment:
			  - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMINUSER}
			  - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
			labels:
			  - "traefik.enable=true"
			  - "traefik.http.routers.grafana.rule=Host(`grafana.${DOMAIN}`)"
			  - "traefik.http.routers.grafana.entrypoints=websecure"
			  - "traefik.http.routers.grafana.tls.certresolver=leresolver"
			  - "traefik.http.services.grafana.loadbalancer.server.port=3000"
			  - "traefik.http.routers.grafana.middlewares=local-ipallowlist"
			restart: unless-stopped
			networks:
			  - servicenet
	

4. Jaeger
Jaeger dient dem verteilten Tracing und kann insbesondere mit Traefik zur detaillierteren Analyse von Anfragen genutzt werden.

			jaeger:
				image: jaegertracing/all-in-one:latest
				container_name: jaeger
				labels:
				  - "traefik.enable=true"
				  - "traefik.http.routers.jaeger.rule=Host(`jaeger.${DOMAIN}`)"
				  - "traefik.http.routers.jaeger.entrypoints=websecure"
				  - "traefik.http.routers.jaeger.tls.certresolver=leresolver"
				  - "traefik.http.services.jaeger.loadbalancer.server.port=16686"
				  - "traefik.http.routers.jaeger.middlewares=local-ipallowlist"
				networks:
				  - servicenet
		
5 cAdvisor
cAdvisor schreibt Container- und Systemmetriken für Prometheus und ist damit das Auge für die Hardware-Ressourcenüberwachung.

			cadvisor:
				image: gcr.io/cadvisor/cadvisor:latest
				container_name: cadvisor
				ports: 
				  - "127.0.0.1:8080:8080"
				volumes:
				  - /:/rootfs:ro
				  - /var/run:/var/run:ro
				  - /sys:/sys:ro
				  - /var/lib/docker/:/var/lib/docker:ro
				restart: unless-stopped
				networks:
				  - servicenet
		

Schritt-für-Schritt-Anleitung

Vorbereitung
  • Domain anpassen:
    Setze eine Variable `DOMAIN` mit deiner gewünschten Domain oder trage sie im compose file direkt ein.
    Beispiel:
    export DOMAIN=meine-home-domain.de

  • Traefik vorbereiten:
    Erstelle das Verzeichnis und die Datei für die ACME-Zertifikate einmalig:
    
    					  mkdir -p traefik
    					  touch traefik/acme.json
    					  chmod 600 traefik/acme.json
    				  
  • Prometheus konfigurieren Konfigurations Datei für Prometheus:
    
    					

    Prometheus Config File here!

  • Stack starten
    
    			docker compose up -d
    		

    Das war's! Nach wenigen Minuten sind alle Dienste erreichbar.
    Übersicht und Zugriffe auf Dienste
    Service/Dashboard URL Hinweis
    Traefik https://traefik.${DOMAIN} nur über LAN (192.168..0/16) erreichbar
    Prometheus https://prometheus.${DOMAIN} via Traefik LAN beschränkt
    Grafana https://grafana.${DOMAIN} via Traefik LAN beschränkt
    Jaeger https://jaeger.${DOMAIN} via Traefik LAN beschränkt
    cAdvisor http://localhost:8080 Nur von der Maschine selbst aus erreichbar
    Fazit
    Mit minimalem Aufwand entsteht so eine flexible Home-Hosting-Plattform für Überwachung, Visualisierung und modernes Service-Management. Traefik übernimmt dabei fast die gesamte Reverse Proxy Magie, während Prometheus und Grafana wertvolle Einblicke in dein System bieten. Diese Compose-Datei eignet sich hervorragend als Ausgangsbasis. Mit Hilfe von Traefiks automatischem Discovery feature lassen sich weitere Anwendungen ganz einfach über Docker Labels integrieren und verwalten. Probiere es aus und bringe Home-Hosting auf das nächste Level!