Dieses Tutorial ist VALID.

Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Haftungsausschluss / Disclaimer

Traefik v2.1 mit Docker als Reverse-Proxy und Let’s Encrypt Provider

Traefik Configs anlegen

mkdir -p ~/docker/traefik-v2/data

Wir legen unterhalb von „/root“ das Verzeichnis „docker“ an. Darin erstellen wir gleich „traefik-v2“ und „data“.

Benutzername / Passwort Datei für den Dashboard-Zugang erstellen:

htpasswd -bcB ~/docker/traefik-v2/data/.htpasswd username supersicherespasswort
cat ~/docker/traefik-v2/data/.htpasswd

username:$2y$15$eY.1HB7xGh8UdZv6moBZZ.1l.fUNCs9HUUmCFt/X.o76lvLugJbDq

Mit dem Kommando „htpasswd“ lassen wir eine Datei mit einem verschlüsselten Passwort für den Benutzer „username“ und dem Passwort „supersicherespasswort“ erstellen.

-b bedeutet, dass wir das Passwort gleich in die Kommandozeile schreiben.
-c legt eine neue Passwort-Datei „.htpasswd“ in dem angegebenen Verzeichnis an.
-B verwendet „bcrypt“ anstelle von „MD5“ als Verschlüsselungsalgorhytmus. Dieser ist sicherer…

Am Rande: Hardy hat mich in einem Kommentar darauf hingewiesen: Beim Passwort geht kein „Dollar“ als Symbol. Auch ein Hochkomma macht glaub ich Probleme. Im Zweifel testen und bei einem Fehler weglassen. Die Datei können wir nach Belieben neu erzeugen lassen…

Sollte das Kommando „htpasswd“ nicht vorhanden sein, bitte die „apache2-utils“ nachinstallieren:

apt install --no-install-recommends -y apache2-utils

Mit „cat“ lassen wir uns den Inhalt der gerade erstellten Datei ausgeben. Dies dient nur der Anschauung, weil wir die ganze Passwort-Datei in die Traefik-Config einhängen und Traefik die Daten daraus direkt extrahiert.

Steuerdateien von Traefik anlegen:

touch /var/log/traefik.log

touch ~/docker/traefik-v2/data/acme.json
chmod 0600 ~/docker/traefik-v2/data/acme.json

nano ~/docker/traefik-v2/data/traefik.yml

Wir erzeugen mit „touch“ je eine leere Datei Namens „traefik.log“ in „/var/log“ und „acme.json“ im „data“-Verzeichnis von Traefik. Dieser nehmen wir im Anschluss die „Gruppen“- und „Alle“-Rechte, so dass nur noch der Benutzer „root“ auf die Datei Zugriff bekommt. Das ist wichtig, denn sollte Traefik feststellen, dass noch andere Benutzer diese Datei lesen können, wird er das Speichern der Zertifikate darin aus Sicherheitsgründen unterbinden.

Dann erstellen wir die Datei „traefik.yml“. Das ist die Haupt-Konfigurationsdatei von Traefik, die wir mit folgendem Inhalt füllen:

##START
global:
  checkNewVersion: true
  sendAnonymousUsage: true

api:
  dashboard: true
  debug: true

log:
### Default Level ist ERROR. Alternative Log-Level lauten (je weiter rechts desto mehr Info) PANIC, FATAL, ERROR, WARN, INFO, DEBUG
  level: INFO
  filePath: "/traefik.log"

entryPoints:
  http:
    address: "0.0.0.0:80"
  https:
    address: "0.0.0.0:443"

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

  file:
    filename: /middleware.yml

certificatesResolvers:
  le:
    acme:
      email: deine@e-mail.adresse
      storage: acme.json
      tlsChallenge: {}
##EOF

Hinweis: .yml-Dateien vertragen keinen Tabulator! Alle Platzhalter sind „Leerzeichen“. Tabulatoren erzeugen einen Syntax-Error!

Gehen wir wie Config mal durch…

Zeile 3: „checkNewVersion: true“ – traefik überprüft, ob eine neue Version zur Verfügung steht und schreibt das ins Log, falls dem so wäre.

Zeile 4: „sendAnonymousUsage: true“ – sendet anonyme Nutzungsstatistiken an die Macher von Traefik. Kann nicht schaden, damit die Entwicklung voran geht und wir damit ein wenig helfen.

Zeilen 6-8: Wir konfigurieren das interne „Dashboard“, damit wir Traefik später beauskunften können. Diese Funktion nennen wir „api“.

Zeilen 10-13: Den Log-Level stellen wir hier auf „Info“. Das ist ein guter Kompromiss. Für mehr Text „debug“, für weniger dann evtl. „error“ aufwärts. Die Log-Datei wird auf „traefik.log“ festgelegt. Diese werden wir dann später im docker-compose-File an „/var/log“ ausleiten…

Zeilen 15-19: Definiert unsere beiden Standard-Einstiegspunkte „http“ und „https“. Wir weisen Port 80 dem Einstiegspunkt „http“ und Port 443 dem Einstiegspunkt „https“ zu. Wir könnten die Punkte nennen, wie wir lustig sind, aber http und https bieten sich hier gut an, weil wir ja wissen, was damit gemeint ist.

Zeile 21: Wir legen unsere „Provider“ fest, mit denen sich Traefik ins Benehmen setzt:

Zeilen 22-25: Der „Docker“ Provider. Hier sagen wir Traefik, dass Docker unter der Datei „/var/run/docker.sock“ beauskunftet werden kann. Wir weisen allen Docker-Containern, für die Traefik verantwortlich ist, das Netzwerk „web“ zu (dann brauchen wir das nicht mehr einzeln in jedem Container in den Labels machen) und sagen Traefik, dass er nicht automatisch alle gefundenen Docker-Container ins Internet durchschleifen soll (exposedByDefault: false), sondern nur, wenn wir das explizit in dem jeweiligen Container so eingestellt haben (mittels „traefik.enable=true“).

Zeilen 27+28: Neu in der v2 ist auch, dass wir einen „File“-Provider definieren können. Diese Datei enthält Steuerungsanweisungen, die wir in allen Containern brauchen. Das beschleunigt das Einrichten der Container, weil wir dann dort auf die jeweilige Stelle in der Datei Bezug nehmen können und nicht alle Befehle voll ausschreiben müssen. Ich hab die Datei „middleware.yml“ genannt, weil wir dort genau diese „Middlewares“ konfigurieren.

Zeilen 30-35: Diese Konfiguration schaltet die Kommunikation zwischen Traefik und Let’s Encrypt ein. Das geht deutlich kürzer als in v1…
Zeile 31: Wir definieren den Namen unseres ACME-Providers, den wir später in den docker-compose-Dateien aufrufen. „le“ steht hier als Abkürzung für „let’s encrypt“.
Zeile 32: Nun legen wir fest, dass die Zertifikate über das „ACME“ Protokoll angefordert werden sollen.
Zeile 33: Deine E-Mail Adresse, über die alle Zertifikate später bei Let’s Encrypt registriert werden, gehört in diese Zeile.
Zeile 34: Die Zertifikate werden in der Datei „acme.json“ abgelegt.
Zeile 35: Wir wünschen das „TLS-Challenge“-Verfahren. Also nicht „Plain-http“.

Nun legen wir die „middleware.yml“-Datei an:

nano ~/docker/traefik-v2/data/middleware.yml

##START
http:
  middlewares:
    https-redirect:
      redirectScheme:
        scheme: https

    default-headers:
      headers:
        CustomFrameOptionsValue: "SAMEORIGIN"
        sslRedirect: true
        browserXssFilter: true
        contentTypeNosniff: true
        forceSTSHeader: true
        stsSeconds: 315360000
        stsIncludeSubdomains: true
        stsPreload: true

    matomo-headers:
      headers:
        sslRedirect: true
        browserXssFilter: true
        contentTypeNosniff: true
        forceSTSHeader: true
        stsSeconds: 315360000
        stsIncludeSubdomains: true
        stsPreload: true

tls:
  options:
    myTLSOptions:
       minVersion: VersionTLS12
##EOF

Hier definieren wir genau drei Sachen, auf die wir später in den Container-Dateien zurückgreifen:

Zeilen 6-8: Das ist eine Weiterleitung von http auf https. Wir nennen sie „https-redirect“.
Zeilen 10-19: Wir legen die „Standard-Header“ fest, die wir in den Containern haben wollen. Diese nennen wir „default-headers“.
Zeilen 21-29: Für Matomo brauchen wir extra Header ohne eine Einschränkung für iframes. Wir nennen sie „matomo-headers“.
Zeilen 31-34: Hier sagen wir Traefik, dass er mindestens TLS Version 1.2 verwenden soll. Diese Option taufen wir „myTLSOptions“.

Anzeige *

24 Kommentare zu „Traefik v2.1 mit Docker als Reverse-Proxy und Let’s Encrypt Provider“

  1. Habe seit Tagen versucht den Fehler in meiner eigenen Config zu finden – bin jetzt einfach auf deine umgestiegen und alle Services laufen auf anhieb. Besten Dank für die super Anleitung!
    Jetzt hat mein Dashboard sogar endlich mal ein Passwort ^^

    1. Peter Fiedler

      Servus Jan,
      hey, das freut mich, wenn Dir die Anleitung geholfen hat und Dein Server schnurrt ^^
      Noch viel Spaß damit und einen schönen Sonntag!
      Peter.

  2. Hallo Peter,

    ich würde gerne alle Container unter einer Domain veröffentlichen, sprich xxx.duckdns.org/containerA und xxx.duckdns.org/containerB usw.. Ist sowas überhaupt möglich? Wenn ja könnte man diese Anleitung als Basis nehmen?
    Danke im Voraus.

    Gruß
    Yassine

    1. Peter Fiedler

      Bei Subfolders statt Subdomains glaub ich macht Traefik nicht mit.
      DynDNS und let’s encrypt ist auch eine endlose Geschichte. Da wäre am Besten, wenn Du den DNS-Challenge machst. Aber der ist mir – jedenfalls bei netcup – wegen der API und dem Vollzugriff auf die Domainverwaltung zu heiß.

      Tut mir leid, wenn ich Dir da nicht weiterhelfen kann, aber dieses Szenario hab ich noch nie probiert…

      1. Bernhard Schaper

        Hallo Grundsätzlich geht das, ich habe es unter Traefik 1 am laufen, aber das ist ganz schön gefrickel. Das Geheimnis lautet bei der Domain Deklarierung muss PathPrefix oder PathPrefixStrip mit angegeben werden.
        Das Upgrade auf Traefik 2 steht bei mir direkt bevor, danach kann ich mehr dazu sagen.

  3. Hallo Peter,

    danke für die super gute Anleitung. Selten wo man eine ausführliche und funktionfähige (Auf Anhieb) Anleitung findet.
    Chapeaux.

    Gruß
    Yassine

    1. Peter Fiedler

      Freut mich sehr, wenn Dir die Anleitung gefallen und geholfen hat, Yassine.

      Ich wünsche Dir ein schönes Wochenende!
      Peter.

  4. Das ganze läuft ja schon prima auf meinem Netcup Host.
    Ich würde gerne aber auf meinem Raspberry PI daheim noch mit Traefik arbeiten. Sodass ich beispielsweise traefik.localhost die Anwendung erreiche.
    SSL geschützt wird das wahrscheinlich nicht funktionieren.

    Danke für deine Hilfe!

  5. Siegfried Fischer

    Hut ab. Bin begeistert. Alles auf Anhieb geklappt. DANKE!
    Deine Beschreibung der Config- Dateien – einfach Super!

    lg
    Siegfried

    1. Peter Fiedler

      Hallo Siegfried,
      freut mich sehr, wenn alles funktioniert hat.
      Ich wünsch Dir noch viel Freude mit dem Server!
      Beste Grüße
      Peter.

  6. Hallo,
    Tolle Anleitung, ich habe jedoch eine Frage zu den Docker – Networks!
    Aus welchem Grund werden die Netzwerke extern angelegt? Es reicht im docker-compose.yml unter networks ein eigenes einzutragen. Bzw. wieso wird das „Intern“ Netzwerk dann nicht auch auf external:true gesetzt?
    Alle Docker-Container welche Content im WWW bereitstellen müssen mit dem web Netzwerk verbunden sein, falls diese weitere z.B. Datenbank-Container benötigen, werden diese über intern verbunden. Habe ich das richtig verstanden?
    Danke,
    Chris

    1. Peter Fiedler

      Hi Chris,

      wir setzen die Netzwerke extern, damit sie nicht beim Beenden von Containern von Docker entfernt werden.

      Im Traefik-Setup wird das „interne“ Netzwerk nicht in der docker-compose benutzt. Darum brauchen wir das „unten“ auch nicht aufführen. Nur die Netzwerke, die wir „oben“ auch verwenden.

      Genau:
      Das „web“ Netzwerk verbindet unsere Container mit Traefik, die darüber ins Internet umgeleitet werden.
      Das „intern“ Netzwerk hat hier nur die Verbindung zur Datenbank, weil die nicht über das Netz nach draußen geleitet werden soll, sondern nur mit den Containern kommuniziert.

      Beste Grüße
      Peter.

  7. Hi Peter!
    Sehr gute Anleitung, DANKE! Hat alles auf Anhieb geklappt.
    Wollte als erstes Portainer PULLen und UPen, jedoch bekommt der mit meinem docker-compose.yml kein SSL-Cert von LE. Fehler ist wohl:
    „2020-02-28T09:18:15Z“ level=error msg=“the router portainer-secure@docker uses a non-existent resolver: http“
    Kannst du zuuuufällig noch eine Beispiel YML für einen Service posten?!?
    Hast du vielleicht auch noch einen Hinweis, um dedizierte Server, z.B. einen Nextcloud-Server, in Traefik einzubinden? Damals bei TraefikV1 ging das irgendwie über nen FILE.
    DANKE und VG
    Andre

    1. Servus Andre,

      Portainer hab ich noch nie was mit gemacht. Schick mir mal bitte Deine docker-compose.yml an fiedler@cpf.de dann schau ich mal drüber. Adhoc sagt mir der Fehler nichts.

      Nextcloud ist ein Tutorial am Start mit Traefik v2.1

      Beste Grüße
      Peter.

      1. Hi PETER! ;)
        Vielen Dank für deine schnelle Antwort. Habe mal wieder feststellen müssen, dass zu schnelles lesen nicht hilfreich für Problembehandlung ist.
        Hab das Beispiel vom WordPress Tutorial genommen, UND? es hab geklappt.
        Es lag an den Verweisen auf das file, also @file „traefik.http.routers.portainer.middlewares=portainer-https-redirect“
        VVVVV
        „traefik.http.routers.portainer-secure.middlewares=default-headers@file“

        Meine Hausaufgabe, erstmal die ganzen Seiten von dir durchforsten und schlauer werden.
        Ich melde mich! Besten Dank
        VG
        Andre
        PS: guck mal auf https://www.c-rieger.de/nextcloud-installationsanleitung/
        so hätte ich das ganz gerne im Docker. Möchte aber auch noch über NFS von meinem NAS Daten mit einbinden.

        1. Gut, dass Du das lösen konntest.

          Hab mir den Link angesehen. Da steht am Schluss eine „normale“ Nextcloud Installation. Noch ein wenig besser gesichert mit fail2ban und einer Firewall, aber im Grunde müsste mein Tutorial auch eine vernünftige Nextcloud Installation hinkriegen.
          Dein NAS per NFS in den Server einhängen ist dann schon nicht mehr ganz so trivial…

  8. Hallo,
    ich habe einen vserver am laufen. Habe ihn mit docker/docker-compose bestückt.Dann lt. Eurer super Anleitung Traefik v2.1 installiert. Hat alles bestens geklappt. (danke, tolle Arbeit!) (Hinweis: wenn beim Erstellen der .htpasswd ein „$“ im supergeheimenpasswort ist, klappt der Login anschließend nicht – jedenfalls bei mir.)

    Nun würde ich auch gern Mailcow und WordPress einrichten. Aber schon beim Prüfen mit „netstat -tulpn | grep -E -w ’25|80|110|143|443|465|587|993|995′ “ sind durch Traefik v2.1 die Ports 80 und 443 belegt.
    Was muss ich tun um Mailcow und WordPress zum Laufen zu bringen? Ist die Mailcow-Anleitung mit Traefik v2.1 kompatibel?

    VG Hardy

    1. Servus Hardy,
      danke für den Hinweis mit dem „Dollar“-Zeichen, den baue ich noch ein. Einige Sonderzeichen können solche Passworteingaben empfindlich stören. Hochkommas sind da auch sehr gefährlich.

      Mailcow und Traefik beißen sich. Darum mach ich entweder Mailcow oder die Anwendungen auf meinen Maschinen.
      Mailcow hat auch seinen eigenen Let’s Encrypt Challenge und da pfusch ich nicht rein.

      Beste Grüße
      Peter.

      1. Aha.
        Heißt also, dass Mailcow einen kompletten Vserver allein braucht. – Schade (doppelte Kosten)

        Traefik v2.1 / mehrere WordPress-Instanzen / Portainer usw müssten ohne Mailcow laufen?

        Danke und VG hardy

        1. Das bekommt man sicher irgendwie miteinander zum Laufen, aber ich hab mich da nicht lang damit beschäftigt.
          Die Jungs von Mailcow empfehlen selbst eine eigene Maschine nur für den Mailserver. Und ich hab da eine andere Backup Strategie. Außerdem ist der Hostname auch seltsam für „nicht Mailserver“.

          Schau mal, dass Du Dir so einen Netcup Karneval vServer schnappst, der kostet 3,33 Euro im Monat. Angebot ist leider gerade aus. Aber vielleicht füllen sie das noch mal nach. Da halten sich die Kosten dann in Grenzen ;)

    2. Hallo zusammen,
      zum Thema mit den $-Zeichen aus htpasswd: Die Zeichenkette funktioniert dann tatsächlich nicht, kann aber gelöst werden, indem man $ durch $$ ersetzt (also doppeln).
      Kurzbefehl aus der Doku dazu: echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g
      [https://docs.traefik.io/middlewares/basicauth/]

      -> Hat hier schon mal jemand versucht, die echten IP-Adressen an die einzelnen Container zu übermitteln? Also beispielsweise für fail2ban und ähnliche Aktionen? Logischerweise werden ja nur die Gateway-IPs hinter traefik/dem reverse-proxy weitergegeben, was für Bans, etc. nicht sehr hilfreich ist.

      viele Grüße
      Marc

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Verwendung
von Cookies

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung.

Scroll to Top