# Traefik

Ein Reverse Proxy der sich durch sehr gute Performance und leichter Konfiguration hervorhebt. Besonders einfach ist z. B. das Konfigurieren von Docker Container, um diese über den Proxy abzuschirmen. Außerdem kann Traefik native mit Let's Encrypt umgehen und Zertifikate beziehen.

# Installation

Traefik lässt sich bequem als Docker Container bereitstellen. Es wird nur ein Container für Traefik selbst benötigt, keine weiteren Zusatzdienste sind notwendig.

Eine einfache voll funktionsfähige Konfiguration als Docker Compose sieht z. B. wie folgt aus. Diese ist sehr gut für Testumgebungen geeignet, um neue Images auszuprobieren und diese auf einem Host unter einem Port (hier 80) bereitzustellen.

<p class="callout warning">Für ein produktives Setup sollte unbedingt noch Let's Encrypt mit konfiguriert werden. Auch wenn diese Konfiguration bereits reicht, um Dienste anzubieten, so währen diese jetzt noch unverschlüsselt und somit unsicher. Außerdem ist in diesem Fall mit api.insecure die Konfiguration über Port 8080 einsehbar, was ein Sicherheitsrisiko bedeutet.</p>

```yaml
services:
  traefik:
    image: "traefik"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
```

Um die Docker Compose Konfiguration auszuführen, kann am besten in das Verzeichnis der YAML Datei gewechselt werden. Danach wird je nach nach gewählter Installation `sudo docker-compose up -d` oder `sudo docker compose up -d` (keine Bindestrich zwischen docker und compose) eingegeben, um die Standard Konfiguration `docker-compose.yml` zu starten. Compose erstellt dann die gewünschten Container mit den angegeben Optionen. Sollten die Container bereits mit dieser Compose Konfiguration erstellt worden sein, so werden die Container in dieser neu erstellt, dessen Konfiguration geändert wurde.

Damit wäre Traefik nun einsatzbereit und unter [http://localhost:8080](http://localhost:8080) die Konfigurationsoberfläche erreichbar.

#### Reverse Proxy Netzwerk konfigurieren

Um nun Dienste über den Traefik erreichbar zu machen, muss dieser die Dienste innerhalb des Docker Hosts erreichen können. Da Docker für jede Compose Datei ein eigenes Default Netzwerk konfiguriert, kann Traefik diese nicht erreichen. Auch die Option alle Dienste zusammen mit Traefik in einer Compose Datei zu beschreiben, ist keine gute Idee.

Somit erstellen wir uns nun ein Netzwerk, welches unabhängig von den Compose Dateien verwaltet wird. In diesem Beispiel wird das Netzwerk mit dem Namen *traefik* erstellt. Da keine weiteren Optionen angegeben werden, ist es ein Bridge Netzwerk, welches für unseren Fall gut geeignet ist.

```bash
sudo docker network create traefik
```

Nun wird die bisherige Compose Konfiguration für den Container Traefik um folgende Zeilen erweitert, damit Traefik in das Netzwerk aufgenommen wird.

```yaml
    command:
      - "--providers.docker.network=traefik"
    networks:
      - traefik
networks:
  traefik:
    name: traefik
    external: true
```

Zum Schluss den Container mit *docker compose up -d* neu erstellen lassen und fertig. Ab jetzt können einfach weitere Container in dieses Netzwerk aufgenommen werden, damit Traefik sie erreichen und anbieten kann.

#### Konfiguration einsehen

Über den Port 8080 lässt sich die Konfiguration anzeigen: [http://localhost:8080](http://localhost:8080). Es wird ein Dashboard angezeigt, welches alle erkannten Dienste, Regeln usw. anzeigt. Hier kann nun erkundet werden, ob alles richtig übernommen wurde. Für produktive Umgebungen, die öffentlich erreichbar sind, sollte dieses Dashboard deaktiviert werden, da die gesamte Konfiguration gezeigt wird und alles offen legt.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/PGcgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/PGcgrafik.png)

# HTTPS aktivieren

Die bisherige Konfiguration von Traefik ist noch unsicher, da keine Verschlüsselung verwendet wird. Diese lässt sich jedoch nachrüsten, indem die Konfiguration angepasst wird. Traefik kann von Haus aus mit Let's Encrypt umgehen, was die Verwaltung von Zertifikaten recht einfach macht. Es sind keine zusätzlichen Tools notwendig.

<p class="callout info">Bei der Konfiguration der Challenge für die Zertifikate wird hinter certificatesresolvers der Name festgelegt. Im folgenden Beispiel wird der Name des Resolvers auf *einzelzertifikat* festgelegt, indem dieser einfach mit einem Punkt getrennt angehängt wird. Der Name ist wichtig, denn dieser wird später in allen Containern als Label angegeben werden müssen, die mit Zertifikaten von diesem Resolver versorgt werden sollen.</p>

```yaml
services:
  traefik:
    image: traefik
    container_name: traefik
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ${TRAEFIK_PFAD}/traefik_data:/traefik
    command:
      - --api.dashboard=true
      - --api.insecure=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --providers.docker.network=traefik
      - --entrypoints.webinsecure.address=:80
      - --entrypoints.websecure.address=:443
      - --entrypoints.traefik.address=:8080
# Challenge für die Zertifikate festlegen
      - --certificatesresolvers.einzelzertifikat.acme.tlschallenge=true
      - --certificatesresolvers.einzelzertifikat.acme.email=${ACME_EMAIL}
      - --certificatesresolvers.einzelzertifikat.acme.storage=/traefik/certs_einzelzertifikat/acme.json
    labels:
      - traefik.enable=true
      # HTTPS Umleitung
      - traefik.http.routers.http-catchall.entrypoints=webinsecure
      - traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)
      - traefik.http.routers.http-catchall.middlewares=redirect-to-https
      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
      # HTTP Router
      - traefik.http.routers.traefik-secure.entrypoints=websecure
      - traefik.http.routers.traefik-secure.tls=true
      - traefik.http.routers.traefik-secure.tls.domains[0].main=*.${DOMAIN}
      - traefik.http.routers.traefik-secure.tls.domains[0].sans=${DOMAIN}
      - traefik.http.routers.traefik-secure.service=api@internal
    networks:
      - traefik

networks:
  traefik:
    name: traefik
    external: true
```

<p class="callout warning">In der oben gezeigten Konfiguration ist noch das Dashboard verfügbar, welches alle Interna von Traefik anzeigt. Für ein produktives Setup, dass von außen erreichbar ist, sollte dieses besser abgeschaltet werden. Dazu die folgenden Zeilen löschen:  
 - 8080:8080  
 - --entrypoints.traefik.address=:8080  
 - traefik.http.routers.traefik-secure.rule=Host(`traefik.${DOMAIN}`)</p>

In dieser Compose Konfiguration werden Variablen verwendet, um die Einstellung zu vereinfachen. Nachdem die docker-compose.yml erstellt wurde, gilt es noch folgende .env Datei zu erstellen und anzupassen.

```bash
TRAEFIK_PFAD=/pfad/zu/traefik
ACME_EMAIL=email@beispiel.de
DOMAIN=beispiel.de
```

Bevor nun die Konfiguration angewendet wird, müssen schon der Ordner traefik\_data und darin der Unterordner für die Zertifikate erstellt werden. Zusätzlich ist die Datei für die Zertifikatskonfiguration zu erstellen und die Berechtigung anzupassen. Dazu kann das folgende Skript verwendet werden, wobei der Pfad anzupassen ist.

```bash
pfad=/pfad/zu/traefik/traefik_data/certs_einzelzertifikat
mkdir $pfad
touch mkdir $pfad/acme.json
chmod 600 $pfad/acme.json
```

Um die Docker Compose Konfiguration auszuführen, kann am besten in das Verzeichnis der YAML Datei gewechselt werden. Danach wird je nach nach gewählter Installation `sudo docker-compose up -d` oder `sudo docker compose up -d` (keine Bindestrich zwischen docker und compose) eingegeben, um die Standard Konfiguration `docker-compose.yml` zu starten. Compose erstellt dann die gewünschten Container mit den angegeben Optionen. Sollten die Container bereits mit dieser Compose Konfiguration erstellt worden sein, so werden die Container in dieser neu erstellt, dessen Konfiguration geändert wurde.

Anschließend müssen nur noch die gewünschten Dienst konfiguriert werden, damit diese von Traefik verwaltet werden können.

<p class="callout warning">In der Konfiguration ist noch die Konfigurationsübersicht unter Port 8080 erreichbar. Diese sollte in einer produktiven Umgebung deaktiviert werden.</p>

# HTTPS mit Wildcard aktivieren

Auch ein Wildcard Zertifikat kann Traefik von Let's Encrypt beantragen indem es die DNS-Challenge durchführt. Dafür sind ebenfalls keine zusätzliche Tools notwendig.

<p class="callout info">Die DNS-Challenge setzt voraus, dass der Domänenanbieter diese auch unterstützt. Bei GoDaddy ist dies der Fall, weswegen die folgenden Konfigurationen für diesen Anbieter durchgeführt werden. Für die Challenge muss ein API Key samt Secret generiert werden.</p>

Für die DNS-Challenge sind mehr Optionen zu definieren, da ein DNS-Eintrag erstellt und überprüft wird, um den Besitz einer Domäne zu verifizieren.

Wie bereits bei der "normalen" HTTPS Konfiguration wird eine *.env* Datei angelegt, um die Optionen zu verwalten. Zuerst wird die Docker Compose Konfiguration wie folgt erstellt.

```yaml
services:
  traefik:
    image: traefik
    container_name: traefik
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ${TRAEFIK_PFAD}/traefik_data:/traefik
    command:
      - --api.dashboard=true
      - --api.insecure=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --providers.docker.network=traefik
      - --entrypoints.webinsecure.address=:80
      - --entrypoints.websecure.address=:443
      - --entrypoints.traefik.address=:8080
      - --metrics.prometheus.addrouterslabels=true
      - --certificatesresolvers.wildcard-godaddy.acme.dnschallenge=true
      - --certificatesResolvers.wildcard-godaddy.acme.dnsChallenge.provider=godaddy
      - --certificatesResolvers.wildcard-godaddy.acme.dnsChallenge.delayBeforeCheck=0
      - --certificatesresolvers.wildcard-godaddy.acme.email=${ACME_EMAIL}
      - --certificatesresolvers.wildcard-godaddy.acme.storage=/traefik/certs/acme.json
      - --certificatesResolvers.wildcard-godaddy.acme.dnsChallenge.resolvers=1.1.1.1:53,8.8.8.8:53
    labels:
      - traefik.enable=true
      # HTTPS Umleitung
      - traefik.http.routers.http-catchall.entrypoints=webinsecure
      - traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)
      - traefik.http.routers.http-catchall.middlewares=redirect-to-https
      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
      # HTTP Router
      - traefik.http.routers.traefik-secure.entrypoints=websecure
      - traefik.http.routers.traefik-secure.rule=Host(`traefik.${DOMAIN}`)
      - traefik.http.routers.traefik-secure.tls=true
      - traefik.http.routers.traefik-secure.tls.certresolver=wildcard-godaddy
      - traefik.http.routers.traefik-secure.tls.domains[0].main=*.${DOMAIN}
      - traefik.http.routers.traefik-secure.tls.domains[0].sans=${DOMAIN}
      - traefik.http.routers.traefik-secure.service=api@internal
    networks:
      - traefik

networks:
  traefik:
    name: traefik
    external: true
```

Diese kann im Prinzip genau so übernommen werden, wer mag, kann noch die Namen anpassen.

<p class="callout warning">In der oben gezeigten Konfiguration ist noch das Dashboard verfügbar, welches alle Interna von Traefik anzeigt. Für ein produktives Setup, dass von außen erreichbar ist, sollte dieses besser abgeschaltet werden. Dazu die folgenden Zeilen löschen:  
 - 8080:8080  
 - --entrypoints.traefik.address=:8080  
 - traefik.http.routers.traefik-secure.rule=Host(`traefik.${DOMAIN}`)  
</p>

Wichtig sind die Optionen, die in der folgenden *.env* Datei eingestellt werden. In dieser bitte alle Variablen anpassen.

```bash
GODADDY_API_KEY=abcdefghiklmnopqrstuvwxyz
GODADDY_API_SECRET=abcdefghijklmnopqrstuvw
LEGO_DISABLE_CNAME_SUPPORT=true
TRAEFIK_PFAD=/pfad/zu/traefik
ACME_EMAIL=mail@beispiel.de
DOMAIN=beispiel.de
```

Bevor nun die Konfiguration angewendet wird, müssen schon der Ordner traefik\_data und darin der Unterordner für die Zertifikate erstellt werden. Zusätzlich ist die Datei für die Zertifikatskonfiguration zu erstellen und die Berechtigung anzupassen. Dazu kann das folgende Skript verwendet werden, wobei der Pfad anzupassen ist.

```bash
pfad=/pfad/zu/traefik/traefik_data/certs_einzelzertifikat
mkdir $pfad
touch mkdir $pfad/acme.json
chmod 600 $pfad/acme.json
```

Um die Docker Compose Konfiguration auszuführen, kann am besten in das Verzeichnis der YAML Datei gewechselt werden. Danach wird je nach nach gewählter Installation `sudo docker-compose up -d` oder `sudo docker compose up -d` (keine Bindestrich zwischen docker und compose) eingegeben, um die Standard Konfiguration `docker-compose.yml` zu starten. Compose erstellt dann die gewünschten Container mit den angegeben Optionen. Sollten die Container bereits mit dieser Compose Konfiguration erstellt worden sein, so werden die Container in dieser neu erstellt, dessen Konfiguration geändert wurde.

Anschließend müssen nur noch die gewünschten Dienst konfiguriert werden, damit diese von Traefik verwaltet werden können.

# Dienst konfigurieren

Um nun den Dienst eines anderen Containers anzubieten, wird mit den Docker Labeln gearbeitet. Diese liest Traefik automatisch laufend aus und stellt die Dienste bereit, so wie sie in den Labeln beschrieben werden. Es folgt ein Beispiel-Dienst von Traefik selbst: whoami. Dieser zeigt lediglich einige Serverinformationen an, jedoch eignet er sich hervorragend dazu, um die automatische Konfiguration zu demonstrieren.

Zunächst erstellen wir eine neue Docker Compose Konfiguration mit folgendem Inhalt.

```yaml
services:
  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
    networks:
      - traefik
 
networks:
  traefik:
    name: traefik
    external: true
```

<p class="callout info">Sofern der Dienst für HTTPS anstatt HTTP konfiguriert wird, sind folgende Label zusätzlich hinzuzufügen:  
traefik.http.routers.whoami.tls=true  
traefik.http.routers.whoami.tls.certresolver=einzelzertifikat  
Der Certresolver ist auf den Namen des Resolvers zu ändern, wie dieser in der Traefik Konfiguration angelegt wurde.  
</p>

Hier sehen wir nun 3 Label für die Traefik Konfiguration.

1. Enable: damit wird dieser Container für Traefik markiert und von diesem verwaltet
2. Rule: hier wird festgelegt, welche Regel zum Aufruf des Dienstes führt, in diesem Fall durch den Aufruf über die Domäne whoami.localhost
3. Port: Gibt den Port des Dienstes an, an welchen Traefik die Anfragen weiterleitet, sofern der Dienst nur einen Port bereitstellt, kann diese Option weggelassen werden.

<p class="callout warning">Bitte bei 2. auf die Anführungszeichen achten, es sind nicht die geraden einfachen, sondern die schrägen einzelnen Striche, die wie ein Backslash verlaufen.</p>

Damit Traefik und Whoami miteinander kommunizieren können, wird Whoami in das Netzwerk aufgenommen, zu dem bereits Traefik hinzugefügt wurde. In diesem Beispiel heißt das Netzwerk *traefik*, wie bereits in der Installationsanleitung.

Um die Docker Compose Konfiguration auszuführen, kann am besten in das Verzeichnis der YAML Datei gewechselt werden. Danach wird je nach nach gewählter Installation `sudo docker-compose up -d` oder `sudo docker compose up -d` (keine Bindestrich zwischen docker und compose) eingegeben, um die Standard Konfiguration `docker-compose.yml` zu starten. Compose erstellt dann die gewünschten Container mit den angegeben Optionen. Sollten die Container bereits mit dieser Compose Konfiguration erstellt worden sein, so werden die Container in dieser neu erstellt, dessen Konfiguration geändert wurde.

Anschließend kann mit [http://whoami.localhost](http://whoami.localhost) der neue Dienst über den Reverse Proxy getestet werden.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/TLbgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/TLbgrafik.png)

<p class="callout success">Besonders angenehm: Traefik muss nicht neu gestartet werden, sondern sobald der neue Container gestartet ist, wird dieser automatisch von Traefik erkannt und dieser konfiguriert sich selbst. Die Seite ist kurz danach bereits über Traefik erreichbar.</p>

# Dienst mit Basic Auth absichern

Traefik bietet ein Modul für Basic Auth an, um einzelne Dienste mit einem Zugangsschutz zu versehen.

Angenommen der Whoami Dienst, welcher unter [Dienst konfigurieren](https://jaeckel.one/attachments/34) erklärt wird, soll mit einem solchen Zugangsschutz versehen werden. Dann würde die Docker Compose Datei wie folgt erweitert werden.

```yaml
services:
  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
      - "traefik.http.middlewares.whoami-auth.basicauth.users=benutzername:$2a$12$74NsF8MzGC25qO5tYoGfnO1Tg9I9c5Fcbu/zwi1/paDfdYD8eeUxy"
      - "traefik.http.routers.whoami.middlewares=whoami-auth"
    networks:
      - traefik
 
networks:
  traefik:
    name: traefik
    external: true
```

Die 1. neue Zeile gibt an, wie die Logindaten für den Benutzer bzw. die Benutzer sind. Außerdem wird ein Name für das Modul vergeben, in diesem Fall *whoami-auth*. Dann wird ein Benutzername (hier: benutzername) vergeben und nach dem Doppelpunkt wird das Passwort als Hash angegeben. Am besten wird der bcrypt Hash verwendet, welcher z. B. auf der folgenden Webseite generiert werden kann: [Bcrypt-Generator](https://jaeckel.one/attachments/33)

```yaml
      - "traefik.http.middlewares.whoami-auth.basicauth.users=benutzername:$2a$12$74NsF8MzGC25qO5tYoGfnO1Tg9I9c5Fcbu/zwi1/paDfdYD8eeUxy"
```

Mit der 2. neuen Zeile wird das Modul auf den *whoami*-Dienst angewendet.

```yaml
      - "traefik.http.routers.whoami.middlewares=whoami-auth"
```

Anschließend mit docker compose up -d nochmal die Container neu erstellen lassen und fertig. Ab jetzt ploppt ein Anmeldefenster auf, wenn auf die Seite zugegriffen wird.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/79Pgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/79Pgrafik.png)

Nur wenn die richtigen Logindaten eingegeben werden, wird die Seite angezeigt, ansonsten erscheint eine Fehlerseite mit dem Fehlercode *401 Unauthorized*.

# Plugins

Von der Community gibt es einige Plugins, die zusätzliche Funktionen zu Traefik hinzufügen. Ein paar interessante und hilfreiche Plugins werden hier vorgestellt, wie z. B. das Plugin GeoBlock von Pascal Minder.

# Plugin installieren

Die Installation eines Plugins ist wie folgt.

Für eine einfache Suche nach Plugins kann die offizielle Seite von Traefik genutzt werden, diese kann im Dashboard aufgerufen werden. Hierzu oben im Menüband auf *Plugins* klicken.

[![image.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/4ADimage.png)](https://jaeckel.one/uploads/images/gallery/2024-03/4ADimage.png)

Nun öffnet sich der Plugin Dialog in einem neuen Tab. Hier kann nun nach dem gewünschten Plugin gesucht werden.

[![image.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/Y3Timage.png)](https://jaeckel.one/uploads/images/gallery/2024-03/Y3Timage.png)

Wenn ein Plugin gefunden wurde, dieses einfach anklicken, um die Dokumentation des Plugins zu öffnen. In der Dokumentation wird auch eine *Install Plugin* Schaltfläche angezeigt, die eine kurze Installationsanweisung anzeigt.

[![image.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/307image.png)](https://jaeckel.one/uploads/images/gallery/2024-03/307image.png)

Die angezeigten Schritte werden durchgeführt bzw. nur einige davon, wenn mehrere Installations und Konfigurationsmöglichkeiten angezeigt werden.

<p class="callout info">Einige Beispiele, wie Plugins installiert und konfiguriert werden, finden sich auf den anderen Seiten in diesem Kapitel</p>

[![image.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/Rrbimage.png)](https://jaeckel.one/uploads/images/gallery/2024-03/Rrbimage.png)

# GeoBlock von Pascal Minder

Ein super nützliches Plugin für alle, die häufig von Leuten aus anderen Ländern (z. B. Russland) belästigt werden, aber von dort keine Zugriffe erwarten: [GeoBlock von Pascal Minder](https://jaeckel.one/attachments/53)

Nehmen wir die Compose Konfiguration von der Seite [Installation](https://jaeckel.one/attachments/51) und den Testdienst von der Seite [Dienst konfigurieren](https://jaeckel.one/attachments/52).

Die beiden Konfigurationen werden testweise zu einer Konfigurationsdatei zusammengeführt und dann um die Einstellungen für das Plugin erweitert. Somit sieht die neue Konfigurationsdatei nun wie folgt aus.

```yaml
services:
  traefik:
    image: "traefik"
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
# Plguin GeoBlock von Pascal Minder hinzufügen
      - --experimental.plugins.geoblock.modulename=github.com/PascalMinder/geoblock
      - --experimental.plugins.geoblock.version=v0.2.7
    labels:
#      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.allowLocalRequests=true
#      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.allowUnknownCountries=false
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.api=https://get.geojs.io/v1/ip/country/{ip}
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.cacheSize=15
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.blackListMode=true
# Anfragen von russichen und chinesischen IPs blockieren
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.countries=RU,CN
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.forceMonthlyUpdate=true
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.logAllowedRequests=false
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.logApiRequests=false
      - traefik.http.middlewares.traefikgeoblock.plugin.geoblock.logLocalRequests=false
# Plugin Konfiguration Ende
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - traefik

services:
  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
# Plugin GeoBlock für whoami aktivieren
      - traefik.http.routers.whoami.middlewares=traefikgeoblock
# Plugin Aktivierung Ende
    networks:
      - traefik
 
networks:
  traefik:
    name: traefik
    external: true
```

{{@48#bkmrk-Compose-Run}}

Nachdem die Konfiguration gestartet wurde, kann über das Traefik Dashboard auch das geladene Modul eingesehen werden.

Hierzu einfach im Dashboard auf Middlewares - Explore klicken und dann traefikgeoblock@docker auswählen. Die Ansicht sieht dann in etwa wie folgt aus. Ganz unten werden alle Router dargestellt, die dieses Plugin verwenden.

[![image.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/image.png)](https://jaeckel.one/uploads/images/gallery/2024-03/image.png)

# Dynamische Konfiguration

Traefik bietet verschiedene Möglichkeiten der Konfiguration. Bisher wurden alle Konfigurationen über die Docker Compose Datei vorgenommen. Stattdessen kann auch eine dynamische Konfiguration in Form einer oder mehrerer YAML-Datei(en) verwendet werden.

Der Große Vorteil dieser YAML-Dateien liegt in der Möglichkeit, Traefik ohne Neustart anzupassen. Einfach die Datei(en) ändern und Traefik erkennt automatisch die Änderungen und lädt seine Konfiguration neu. Hierdurch gibt es keine Verbindungsabbrüche.

Zuerst erstellen wir einen Ordner samt Unterordner im Verzeichnis der Docker Compose Datei, z. B. mit den Namen *traefik\_data/conf* und wechseln in dieses*.*

```bash
mkdir traefik_data
mkdir traefik_data/conf
cd traefik_data/conf
```

Als Grundlage nehmen wir die Compose Konfiguration von der Seite [Installation](https://jaeckel.one/attachments/54) und erweitern diese um ein Volume, in welchem wir später die dynamischen Konfigurationsdateien ablegen. Zusätzlich ist unter Command noch der Pfad zu dem Ordner mit den Konfigurationsdateien im Container anzugeben. Der soeben erstellte Ordner wird als Volume eingebunden.

```yaml
services:
  traefik:
    image: "traefik"
    container_name: "traefik"
    command:
      - "--providers.file.directory=/traefik/conf"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=traefik"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /pfad/zu/traefik/traefik_data:/traefik
    networks:
      - traefik
networks:
  traefik:
    external: true
```

Um die Docker Compose Konfiguration auszuführen, kann am besten in das Verzeichnis der YAML Datei gewechselt werden. Danach wird je nach nach gewählter Installation `sudo docker-compose up -d` oder `sudo docker compose up -d` (keine Bindestrich zwischen docker und compose) eingegeben, um die Standard Konfiguration `docker-compose.yml` zu starten. Compose erstellt dann die gewünschten Container mit den angegeben Optionen. Sollten die Container bereits mit dieser Compose Konfiguration erstellt worden sein, so werden die Container in dieser neu erstellt, dessen Konfiguration geändert wurde.

Nachdem Traefik läuft, einmal die korrekte Ausführung prüfen, entweder durch den Aufruf von [http://localhost:8080](http://localhost:8080) (Dashboard) oder indem in die Docker Logs geschaut wird. Im Dashboard kann unten auf der Seite unter *Providers* geprüft werden, ob der Ordner für die Konfigurationsdateien überwacht wird. Dort sollte neben Docker nun auch File stehen.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/RC2grafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/RC2grafik.png)

Nun fügen wir einen Dienst über eine Konfigurationsdatei hinzu. Am besten nehmen wir hierzu das Beispiel von der Seite [Dienst mit Basic Auth absichern](https://jaeckel.one/attachments/55).

Angenommen wir wollen mehrere Dienste mit Basic-Auth absichern, dann wäre es am besten, die Konfiguration der Benutzer in einer dynamischen Konfigurationsdatei vorzunehmen. Wir streichen also die Zeile traefik.http.middlewares.whoami-auth.basicauth.users aus der Compose Datei und ändern den Namen der Zeile für *middlewares* ab. Die neue Compose Datei sieht wie folgt aus.

```yaml
services:
  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
      - "traefik.http.routers.whoami.middlewares=basic-auth@file"
    networks:
      - traefik
networks:
  traefik:
    name: traefik
    external: true
```

Die Compose Konfiguration kann nun gestartet werden.

Anschließend erstellen wir die Datei `traefik_data/conf/basic-auth.yml` mit folgendem Inhalt.

```yaml
http:
  middlewares:
    basic-auth:
      basicauth:
        users:
          benutzername:$2a$12$74NsF8MzGC25qO5tYoGfnO1Tg9I9c5Fcbu/zwi1/paDfdYD8eeUxy
```

Nun können wir direkt den neuen Dienst [http://whoami.localhost](http://whoami.localhost) aufrufen und es erscheint eine Login Abfrage.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/79Pgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/79Pgrafik.png)

Für die Generierung des Passworts kann folgende Seite verwendet werden: [Bcrypt-Generator](https://jaeckel.one/attachments/56)

Es können beliebige weitere Dateien erstellt werden um Plugins oder Seiten oder Dienst usw. zu konfigurieren. Die Einstellungen werden direkt angewendet, sobald die Datei gespeichert wird. Sollten Syntax-Fehler gefunden werden, bleibt die alte Konfiguration bestehen und im Docker Log werden Fehler angezeigt.