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

Mit Docker alleine können wir nur genau eine Internetseite auf einem Server zum Laufen bringen und diese „vernünftig“ per Domain anbinden. Wir wollen mehr? Dazu brauchen wir dann vorgeschaltet einen „Reverse Proxy“.

Nachdem Traefik in Version 1.7 ganz vernünftig gearbeitet hat, aber irgendwann einmal ausläuft, können wir jetzt auf Version 2.1 umsteigen. Endlich sind genügend „HowTo“s im Umlauf, welche die neuen Konfigurationsmuster ausreichend erklären…

Was ist ein Reverse-Proxy und was machen wir damit?

Der ganze Text, warum und wofür wir Traefik benutzen, steht in der Anleitung zu Traefik v1.7. Aus „Duplicate Content“ Gründen kopiere ich das hier nicht noch mal hin. Bei Interesse einfach schnell nachlesen…

In aller Kürze: Den ganzen Aufwand betreiben wir nur aus einem einzigen Grund: Wir können bestimmte Ports auf unserem Server genau einmal nach außen vergeben. Port 80 und 443 zum Beispiel kümmern sich um http und https – sprechen quasi den Webserver auf unserer Maschine an. Vergeben wir die Ports an unseren ersten Docker-Container, sind die „verbraucht“. Jede weitere Anwendung müsste dann mitsamt ihrer alternativen Portnummer angesprochen werden. Und genau das macht man nicht. Mit „https“ hätten wir sowieso ein Problem, da dieser Dienst wirklich auf Port 443 festgenagelt ist und Alternativen böse Fehler im Browser werfen. Niemand würde unsere Seite besuchen, wenn erst mal eine dicke Sicherheits-Warnung auftaucht.

Die Lösung: Traefik wird per Port 80 und 443 direkt ans Internet angebunden und kümmert sich danach um die Weiterleitung der Verbindung an die „richtigen“ Container. Alle unsere Docker-Container hängen dann nicht direkt am Internet, sondern durchqueren den Traefik-Container, der die Verbindungen durchschleift. Und zwar transparent – von außen „sehen“ wir Traefik gar nicht, sondern nur den Ziel-Container.

Traefik v1 ./. v2

Wie damals angekündigt, ist die Config von Version 1 zu Version 2 komplett anders. Ich war allerdings mit der 1er Version schon fertig. Es gab absolut keine Chance, dass ich die 2er Config mit den paar Beispielen durchdringe, die zu dem Zeitpunkt verfügbar waren. Außerdem versprachen die Entwickler, dass die Version 1 noch mindestens ein Jahr lang mit Updates versorgt wird. Darum waren die Anleitungen dann alle auf die „v1“ ausgerichtet…

Mittlerweile sind zum Glück einige Tutorials und Beispiele vernünftig dokumentiert, damit der Umstieg auf „v2“ glückt. Das war zwar immer noch nicht schön und ein einziges Gefluche, aber es läuft jetzt…

Da die Test- und Produktivsysteme nun zwei bzw. einen Monat durchgehalten haben, dürfte der Beweis erbracht sein, dass die neue Version vernünftig arbeitet. Aus diesem Grund baue ich jetzt alle meine Anleitungen auf die Zusammenarbeit mit Traefik v2.1 um.

Traefik einrichten, installieren und starten

Traefik v2.1 kommt bei uns auch in einem Docker-Container zum Einsatz. Zu dem Container erstellen wir noch folgende Dateien:

  • .htpasswd – die enthält verschlüsselt das Passwort für den Zugang zum Traefik-Dashboard.
  • traefik.yml – das ist die Konfigurationsdatei, in der wir die „globalen“ Sachen regeln, die für Traefik selbst und alle damit verwalteten Container gelten.
  • middleware.yml – hier stehen Infos zur http/https Weiterleitung, Header-Daten und die Minimalversion von TLS, welche Traefik verwenden darf. Im Grunde legen wir in dieser Datei Funktionen an, auf die wir später in den Containerdefinitionen mit einer Zeile zugreifen können. Wir sparen uns damit einiges an Schreiberei ;)
  • acme.json – hier werden später alle Zertifikate abgelegt, die Traefik von Let’s Encrypt erhält.
  • docker-compose.yml – mit der Datei wird der Traefik-Container konfiguriert, gestartet und mit unserem Host-System verbunden.
  • /var/log/traefik.log – wir leiten die Traefik Logs lokal auf den Host aus, damit wir die schnell betrachten und über unsere Backup Scripts mitsichern können.

An sich ist die Konfiguration schön übersichtlich und in sich logisch. Da gebe ich den Entwicklern Recht, wenn sie das für die 2er Version über den Haufen geworfen und neue strukturiert haben.

Traefik Installation vorbereiten

Als Grundlage für die folgende Installation brauchen wir ein laufendes Grundsystem mit Docker und docker-compose, wie wir es im Basis-System Tutorial eingerichtet haben.

Für Traefiks „Dashboard“-Zugang brauchen wir noch eine Benutzername / Passwort Kombination, um diesen nach außen abzusichern. Sonst könnte jeder einfach nachsehen, was bei uns im Netz so los ist. Das wäre… Nicht so toll, ja.

Und wir definieren in Docker noch zwei Netzwerke. Ein internes, in dem unsere Container mit der Datenbank sprechen, und ein externes, in dem Traefik als Brücke ins „World Wide Web“ fungiert.

Im folgenden legen wir einen DNS-Eintrag für das Traefik Dashboard an, erstellen die Konfigurationsdateien, lassen den Traefik-Container von Docker laden und starten unser Setup.

DNS für Traefik Dashboard einrichten

Wir legen einen DNS-Eintrag für das Traefik Dashboard an. Dazu wechseln wir in die Oberfläche unseres Domain-Anbieters. In meinem Fall das „Customer Control Center“ von Netcup. Hier wechseln wir auf unsere Domain, die wir editieren möchten, und dort in den Reiter „DNS“. Wir erstellen eine Sub-Domain „traefik“. Für diesen Test-Server heißt die volle Domain dann „traefik.xp-server.de“. Das wird ein Domain-Eintrag, also vom Typ „A“. Noch die IP des Servers eingeben und die DNS-Einstellung abspeichern.

Nach dem Anlegen des DNS-Eintrags dauert es ein Weilchen, bis sich dieser durch die Schichten des DNS-Systems im Internet ausbreitet. Aber nach 15 bis 45 Minuten sollte der Eintrag „sichtbar“ sein. Überprüfen kann man das mit einem „Ping“ auf den Domainnamen.

Docker-Netzwerke erstellen

Achtung! Alle Konfigurationen werden hier mit dem Benutzer „root“ vorgenommen. Entweder wir arbeiten schon als „root“ oder müssen via „sudo -i“ von unserem normalen Anwender auf den „root“ umschalten. Alternativ können wir auch vor jedes Kommando einen „sudo“ setzen, was aber doch recht umständlich ist…

Jetzt erstellen wir zwei Docker-Netzwerke, um unsere Container darüber untereinander und über Traefik mit dem Internet zu verbinden. Für dieses Setup nenne ich das eine „intern“ und das andere „web“.

docker network create -d bridge intern
docker network create -d bridge web

docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
350ddc77215e        bridge              bridge              local
f9529610d206        host                host                local
f1b72d63a1cc        intern              bridge              local
b909a2157716        none                null                local
c236fa4ed157        web                 bridge              local

Damit haben wir die beiden Netzwerke als „Brücken“ angelegt und mit dem „docker network ls“-Kommando überprüfen wir, ob diese auch korrekt angelegt worden sind. In Deinem Beispiel werden die Netzwerk-IDs natürlich anders lauten…

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