Skip to main content

Traefik v2 als Reverse Proxy installieren

Einleitung

Traefik ist ein sogenannter Reverse Proxy. Das bedeutet, dieser nimmt alle Anfragen auf den angegeben Entrypoints an und routet die Anfragen in die entsprechenden Docker Container. Dies hat den Vorteil das keine Virtuellen Hosts oder du dir unterschiedliche Port-Nummern merken musst. Deine Anfragen kannst du automatisch auf einen angegebenen Port routen. 

Mehr Informationen: https://hub.docker.com/_/traefik/

Installation

Wenn wir nun Traefik installieren wollen, musst du Docker installiert haben. Wie du das machst, habe ich hier erklärt. Im ersten Schritt installieren wir das Tool htpasswd

sudo apt-get update
sudo apt-get install apache2-utils

Im nächsten Schritt legen wir ein Verzeichnis für Traefik an. In meinem Beispiel haben wir unter dem root Verzeichnis, ein Verzeichnis mit dem Namen _docker. Dort liegen alle Daten für die Docker Container. In diesem Verzeichnis legen wir einen Ordner für Traefik an. 

sudo mkdir -p /_docker/traefik

Im nächsten Schritt erstellen wir ein paar Verzeichnisse und Dateien die zur späteren Konfiguration oder Dateiablage benötigt werden. 

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

im vierten Schritt bearbeiten wir nun die traefik.yml. Dies ist eine Konfigurationsdatei. Mit dieser kannst du Traefik konfigurieren damit es so arbeitet wie du es brauchst. Dort musst du nur die E-Mail Adresse verändern. Da die Zertifikate per Let's Encrypt beantragt werden, kannst du damit deine E-Mail gleich für weitere Rückfragen hinterlegen. Dort fügst du dann folgende Konfiguration ein.

sudo nano /_docker/traefik/data/traefik.yml
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: beispiel@beispiel.de   # <--- E-Mail Adresse für Rückfragen
      storage: acme.json
      httpChallenge:
        entryPoint: http

Im Anschluss erstellen wir die docker-compose.yml. Diese Datei ist quasi die Konfigurationsdatei von Applikationen die du mit Docker erstellst. Aus dieser Datei erstellst du Anwendungen und gibst die entsprechenden Parameter mit. 

sudo nano /_docker/traefik/docker-compose.yml
version: '3'
services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: unless-stopped
    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(`traefik.beispiel.de`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:Pa$$w0rd"
      - "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(`traefik.beispiel.de`)"
      - "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"
networks:
  traefik:
    external: true

Jetzt erstellen wir einen Benutzer und geben dem ein entsprechendes Passwort mit. Es wird dringend empfohlen dieses zu ändern! In der Konfigurationsdatei sind momentan die Platzhalter admin und Pa$$w0rd dort eingetragen. Der Benutzername und das Kennwort werden durch ein : voneinander getrennt. Wir generieren jetzt ein neues Kennwort mit dem Tool htpasswd. Dort ersetzt du den Benutzernamen und das Kennwort durch deine eigenen Daten. 

echo $(htpasswd -nb admin Pa$$w0rd) | sed -e s/\\$/\\$\\$/g

Du bekommst beim ausführen dieses Befehls eine Ausgabe, diese Ausgabe trägst du in das entsprechende Label in der docker-compose.yml ein. 

Vorher:

- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:Pa$$w0rd"

Nachher:

- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$ofCridn5$$94xGJcgJ0qoSOtZUHN.gP/"

Als nächstes erstellen wir eine weitere Konfigurationsdatei. Diese erstellen wir mit dem folgenden Befehl und fügen dann wieder einen Inhalt ein.

sudo nano /_docker/traefik/data/dynamic_conf.yml
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"

Im vorletzten Schritt legen wir das Docker Netzwerk an indem Traefik mit den anderen Containern kommuniziert. 

sudo docker network create traefik

Und im letzten Schritt starten wir den Container mit dem docker-compose Befehl. 

sudo docker-compose -f /_docker/traefik/docker-compose.yml up -d

Wenn du jetzt deinen Webbrowser öffnest und auf den entsprechenden Hostnamen navigierst, wirst du dich mit den vorhin angegebenen Daten anmelden müssen. Wenn du das gemacht hast, bist du auf dem Traefik Dashboard angemeldet. Dort findest du alle Informationen über Verbindungen, Entrypoints und andere Dienste.