Back to Blog
docker traefik ssl tutorial

Traefik als Reverse Proxy

Traefik ist mein Go-To Reverse Proxy für Docker. Einmal aufsetzen, nie wieder SSL manuell konfigurieren.

Warum Traefik?

  • Auto-Discovery: Findet Container automatisch via Docker Labels
  • Auto-SSL: Let's Encrypt Zertifikate automatisch
  • Zero Downtime: Hot-Reload bei Container-Änderungen
  • Dashboard: Übersicht über alle Routes

Basis-Setup

Verzeichnis-Struktur

traefik/
├── docker-compose.yml
├── traefik.yml
├── .env
└── data/
    ├── acme.json
    └── .gitkeep

docker-compose.yml

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=https"
      - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.traefik.tls=true"
      - "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=${TRAEFIK_AUTH}"

networks:
  proxy:
    external: true

traefik.yml

api:
  dashboard: true

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: proxy

certificatesResolvers:
  letsencrypt:
    acme:
      email: dein@email.de
      storage: acme.json
      httpChallenge:
        entryPoint: http

Setup

# Netzwerk erstellen
docker network create proxy

# acme.json mit richtigen Rechten
touch data/acme.json
chmod 600 data/acme.json

# Basic Auth Password generieren
htpasswd -nb admin sicheres-passwort
# Output in .env als TRAEFIK_AUTH

# Starten
docker compose up -d

Container anbinden

Jetzt das Beste: Andere Container brauchen nur Labels!

Beispiel: Web-App

services:
  app:
    image: myapp
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.myapp.entrypoints=https"
      - "traefik.http.routers.myapp.rule=Host(`app.example.com`)"
      - "traefik.http.routers.myapp.tls=true"
      - "traefik.http.routers.myapp.tls.certresolver=letsencrypt"
      - "traefik.http.services.myapp.loadbalancer.server.port=3000"

networks:
  proxy:
    external: true

Das war's. App ist unter https://app.example.com erreichbar. SSL automatisch.

Wildcards & Subdomains

Für alle Subdomains:

labels:
  - "traefik.http.routers.app.rule=Host(`app.example.com`) || Host(`www.app.example.com`)"

Middlewares

Redirect www zu non-www

labels:
  - "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www\\.(.+)"
  - "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://$${1}"
  - "traefik.http.routers.app.middlewares=redirect-www"

Rate Limiting

labels:
  - "traefik.http.middlewares.rate-limit.ratelimit.average=100"
  - "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
  - "traefik.http.routers.app.middlewares=rate-limit"

Headers

labels:
  - "traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000"
  - "traefik.http.middlewares.secure-headers.headers.stsIncludeSubdomains=true"

Dashboard

Nach dem Setup erreichbar unter https://traefik.example.com (mit Basic Auth).

Zeigt:

  • Alle Routers
  • Alle Services
  • Alle Middlewares
  • Zertifikat-Status

Debugging

# Logs
docker logs traefik -f

# Config testen
docker exec traefik traefik healthcheck

Tipps

  1. exposedByDefault: false - Nur Container mit traefik.enable=true
  2. Externes Netzwerk - Alle Apps müssen im proxy Netzwerk sein
  3. acme.json Rechte - Muss 600 sein, sonst Fehler
  4. DNS zuerst - Domain muss auf Server zeigen bevor SSL klappt

Fazit

Traefik + Docker = Magie. Einmal konfiguriert, funktioniert SSL für immer automatisch.

Made with by Daniel Hiller

|