Traefik v2 installieren und einrichten
Einleitung
In dieser Anleitung installieren wir Traefik v2 als Reverse Proxy / Edge Router. Der entscheidende Vorteil von einem Reverse Proxy ist der, das dadurch mehrere Container mit Port 80 nach außen kommunizieren. So müssen wir uns keine Ports mehr merken, oder Portfreigaben erstellen. Traefik generiert obendrauf noch SSL Zertifikate und erneuert diese automatisch.
Das Routing zwischen den Containern wird über die Subdomain bewerkstelligt. Dadurch weiß Traefik in welchen Container der Benutzer gelangen soll. Ein Load Balancing lässt sich auch einrichten.
Die Installation erfolgt mit docker-compose und dem offiziellen Image von Traefik.
Traefik Installation und Konfiguration
Installation der Pakete
Im ersten Schritt müssen wir uns mit unserem Server verbinden damit wir Konsolenzugriff haben. Wichtig dabei ist das auf deinem Linux Server Docker und Docker-Compose installiert ist. Falls das nicht erledigt ist, wird hier beschrieben wie wir Docker und Docker-Compose installieren: Docker und Docker-Compose installieren.
Im nächsten Schritt müssen wir das Paket apache2-utils installieren, da wir das Tool htpasswd benötigen um später ein Kennwort für den Administrationsbenutzer zu generieren.
sudo apt-get update
sudo apt-get install apache2-utils -y
Dateien und Verzeichnisse anlegen
In diesem Schritt legen wir die benötigen Verzeichnisse und Dateien an damit wir Traefik zum laufen zu bekommen. Ich erstelle immer einen zentralen Ordner in dem ich die docker-compose Dateien nach Apps in Ordnern ablege. So kann ich schnell die Container neu starten oder um Konfigurationen vorzunehmen.
sudo mkdir /_docker
sudo mkdir /_docker/traefik
sudo mkdir -p /_docker/traefik/data
sudo touch /_docker/traefik/data/acme.json
sudo chmod 600 /_docker/traefik/data/acme.json
sudo touch /_docker/traefik/data/traefik.yml
Als zweiten Schritt müssen wir die traefik.yml etwas anpassen. Dazu öffnen wir die Datei mit einem Editor unserer Wahl. Ich verwende dafür den Editor nano.
sudo nano /_docker/traefik/data/traefik.yml
In der Datei fügen wir folgenden Inhalt ein:
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: "./dynamic_conf.yml"
certificatesResolvers:
http:
acme:
email: <empfänger>@<domain>
storage: acme.json
httpChallenge:
entryPoint: http
In der Datei müssen wir unsere E-Mail Adresse eingeben. Diese wird verwendet um euch bei eventuellen Problemen zu benachrichtigen.
Im nächsten Schritt erstellen wir die docker-compose.yml und fügen dort den Inhalt ein.
sudo nano /_docker/traefik/docker-compose.yml
version: '3'
networks:
traefik:
external: true
services:
traefik:
image: traefik:latest
container_name: traefik
restart: always
security_opt:
- no-new-privileges:true
networks:
- traefik
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
- ./data/dynamic_conf.yml:/dynamic_conf.yml
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`<subdomain>.<domain>`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=ADMIN:PASSWORT"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`<subdomain>.<domain>`)"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=http"
- "traefik.http.routers.traefik-secure.service=<api>@<internal>"
- "providers.file.filename=/dynamic_conf.yml"
- "traefik.http.routers.traefik-secure.middlewares=<secHeaders>@<file>,traefik-auth"
Wir müssen in Zeile 36 und 38 eben dann die Eckigen Klammern (<>) kurz entfernen damit die Anwendung funktioniert.
Im nächsten Schritt generieren wir das Kennwort um uns in das Webinterface einzuloggen. Dazu überlegen wir uns einen Benutzernamen und ein Kennwort. Dieses geben wir dann in den folgenden Befehl ein.
echo $(htpasswd -nb <benutzer> <passwort>) | sed -e s/\\$/\\$\\$/g
Wir erhalten dann eine Zeichenkette mit dem Benutzernamen und dem verschlüsselten Kennwort. Diese Informationen fügen wir in der docker-compose.yml in der 29. Zeile am Ende an. Dazu entfernen wir die Platzhalter ADMIN:PASSWORT und tragen dort die Ausgabe des Befehls ein.
Im letzte Schritt legen wir jetzt die dynamic_conf.yml an. Dazu geben wir folgenden Befehl ein.
sudo nano /_docker/traefik/data/dynamic_conf.yml
In der Datei fügen wir folgenden Inhalt ein.
tls:
options:
default:
minVersion: VersionTLS12
cipherSuites:
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
curvePreferences:
- CurveP521
- CurveP384
sniStrict: true
http:
middlewares:
secHeaders:
headers:
browserXssFilter: true
contentTypeNosniff: true
frameDeny: true
sslRedirect: true
#HSTS Configuration
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customFrameOptionsValue: "SAMEORIGIN"
Docker Netzwerk anlegen
Jetzt legen wir das Docker Netzwerk an. Das Docker Netzwerk hat die Funktion das die Container die Zugriff auf das Netzwerk haben, darüber miteinander kommunizieren. Traefik schiebt den Traefik in die Container über dieses Netzwerk.
sudo docker network create traefik
Docker Container starten
Als letztes müssen wir unseren Container starten, dazu geben wir folgenden Befehl ein.
docker-compose -f /_docker/traefik/docker-compose.yml up -d
Wenn wir jetzt die angegebene Domain in unseren Browser eingeben, erhalten wir ein Anmeldefenster. Wenn wir dort unsere vorhin angegebene Login Daten eingeben, gelangen wir auf das Dashboard von Traefik. Dort können wir Fehler und andere Informationen einsehen.
Wenn wir neue Services zu Traefik hinzufügen wollen müssen entsprechende DNS-Einträge auf dem DNS-Server hinterlegt sein.