Mit Docker lassen sich sehr leicht neue Container auf einem Host erstellen. Sollen aber mehrere Container über dem Port 80 (HTTP) nach außen kommunizieren, so kann es etwas problematisch werden, da dieser Port nur einmal auf dem Server zur Verfügung steht.

Hier kann ein Reverse Proxy Abhilfe schaffen. Ein bekanntes Spiel ist Traefik.

Ich habe diese Anleitung erstellt, da die meisten Anleitungen im Netz leider nicht mehr funktionieren (Traefik v1) und es kaum aktuelle Anleitungen gibt.

Update

26.09.2021 Docker Compose Version aktualisiert, TLS Sicherheit in den Artikel eingebaut.
30.04.2021 Docker Compose Version aktualisiert.
23.01.2021 WordPress Beispiel entfernt.
30.12.2020 Kapitel neu sortiert und Anleitung getestet.
07.05.2020 Kapitel zur Docker Installation hinzugefügt.
27.03.2020 Erstellung dieser Anleitung.

Meine Anleitung bezieht sich auf die aktuelle Traefik Version 2. Dies ist wichtig, da die Konfigurationen bei Version 1 anders sind.

0. Was ist das Ziel dieser Anleitung?

  • Traefik v2 installieren
  • TLS aktivieren
  • Automatisch gültige Zertifikate von Let´s encrypt zu beziehen
  • Wissen, wie ihr neue Anwendungen zu Traefik hinzufügt.

1. Installation von Docker und Docker Compose

Nun installieren wir zuerst Docker & Docker Compose. Diese beiden Programme bilden die Grundlage.

1.1 Docker installieren

Zur Installation von Docker habe ich hier eine Anleitung geschrieben.

1.2 Docker Compose installieren

Docker Compose könnt ihr mit wenigen Zeilen Code installieren.

apt-get update
apt-get install curl
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Anschließend müsst ihr nur noch die Berechtigung anpassen.

sudo chmod +x /usr/local/bin/docker-compose

Nun könnt ihr testen, ob Docker Compose richtig installiert ist.

root@xxx:/# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

Eine ausführlichere Anleitung findet ihr direkt hier beim Hersteller.

2. htpasswd installieren

Wir installieren nun noch das Tool htpasswd. Dieses benötigen wir um uns ein Passwort für Traefik zu generieren.

apt-get update
apt-get install apache2-utils

3. Traefik installieren und konfigurieren

3.1 Verzeichnisse / Dateien anlegen

Als erstes legen wir uns ein Verzeichnis für Traefik an. Ich wähle dazu folgendes:

mkdir -p /opt/containers/traefik

Anschließend erzeugen wir uns noch ein paar Datein / Ordner, welche wir später noch benötigen.

mkdir -p /opt/containers/traefik/data
touch /opt/containers/traefik/data/acme.json
chmod 600 /opt/containers/traefik/data/acme.json
touch /opt/containers/traefik/data/traefik.yml

3.2 traefik.yml anpassen

Nun bearbeiten wir die Datei „traefik.yml“. Dabei ist wichtig, dass ihr nur Leerzeichen und keine Tabs benutzen dürft.

nano /opt/containers/traefik/data/traefik.yml

Inhalt:

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: email@example.com   #### hier eure E-Mail angeben ####
      storage: acme.json
      httpChallenge:
        entryPoint: http

Im Code müsst ihr noch eure E-Mail angeben. Ohne Anführungszeichen oder sonstigem.

3.3 docker-compose.yml anpassen

Nun legen wir unsere Docker Compose Datei an.

nano /opt/containers/traefik/docker-compose.yml

Inhalt:

version: '3'
services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    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.example.com`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=USER:PASSWORD"
      - "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.example.com`)"
      - "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:
  proxy:
    external: true

Notwendige Anpassungen:

  • Hostnamen anpassen: Hier müsst ihr noch die Zeilen mit eurem Hostnamen (traefik.example.com) anpassen.
  • Benutzer / Passwort festlegen: Ihr müsst noch euer Passwort / Benutzer festlegen. Hier in diesem Beispiel werden folgende Daten festgelegt.
  • Benutzer: user
  • Passwort: password

Ändert also bitte die nächste Code-Zeile entsprechend euren Wünschen ab. Dazu gebt ihr folgendes ein eure Shell ein:

echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g

Ausgabe: user:$$apr1$$7ciH.Uzt$$DUqDgmpLmFE2Fm7Z7VaMe/

Der Befehl wird hier beim Hersteller erklärt. Diese Zeichenkette kopiert ihr nun in eure Konfiguration:

vorher:
"traefik.http.middlewares.traefik-auth.basicauth.users=USER:PASSWORD"

nachher:
"traefik.http.middlewares.traefik-auth.basicauth.users=user:$$apr1$$7ciH.Uzt$$DUqDgmpLmFE2Fm7Z7VaMe/"

3.4 Dynamic_conf.yml anlegen

Hier legen wir nun noch eine neue Datei an. Dazu gebt ihr folgenden Code ein:

nano /opt/containers/traefik/data/dynamic_conf.yml

Kopiert nun folgenden Code in die Datei:

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"

3.5 Docker Netzwerk anlegen

Als nächstes müssen wir noch ein internes Netzwerk anlegen, über welches später unsere Docker Container mit Traefik kommunizieren sollen. Dies haben wir in unserer Compose Datei „proxy“ genannt.

docker network create proxy

4. Traefik starten

Nun können wir Traefik starten.

docker-compose -f /opt/containers/traefik/docker-compose.yml up -d

Wenn ihr nun auf traefik.euredomain.de geht, solltet ihr folgendes sehen:

Nach dem Login mit eurem oben festgelegten Passwort solltet ihr diese Übersicht sehen.

Hier sind wir jetzt fertig mit der Traefik Konfiguration und Installation.

5. Wie kann ich Anwendungen im Allgemeinen zu Traefik hinzufügen?

Im Allgemeinen ist es wichtig, dass ihr die Labels hinzufügt.

   wp:
     labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wp.entrypoints=http"
      - "traefik.http.routers.wp.rule=Host(`wordpress.euredomain.de`)"
      - "traefik.http.middlewares.wp-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.wp.middlewares=wp-https-redirect"
      - "traefik.http.routers.wp-secure.entrypoints=https"
      - "traefik.http.routers.wp-secure.rule=Host(`wordpress.euredomain.de`)"
      - "traefik.http.routers.wp-secure.tls=true"
      - "traefik.http.routers.wp-secure.tls.certresolver=http"
      - "traefik.http.routers.wp-secure.service=wp"
      - "traefik.http.services.wp.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"

Wichtig ist hier auch, dass unser Service „wp“ heißt und dementsprechend die Labels auch alle auf den Namen „wp“ angepasst werden müssen. Dies kann aber auch jeder andere Name sein. Muss nur konstant sein.

Ihr müsst immer noch das Netzwerk hinzufügen, mit dem Traefik kommuniziert. Dieses Netzwerk ist im einfachsten Fall bei jeder Anwendung identisch. In diesem Fall also „proxy“.

   wp:
     networks:
       - proxy

networks:
  proxy:
    external: true

Der Name „proxy“ wurde hier auch frei gewählt. Dort könnt ihr auch jeden anderen Namen verwenden. Wichtig hierbei ist jedoch, dass das Netzwerk unter Docker angelegt ist:

docker network create NamedesNetzwerks

6. Quellen

https://docs.traefik.io/

https://medium.com/@containeroo/traefik-2-0-docker-a-simple-step-by-step-guide-e0be0c17cfa5

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

Teile diesen Beitrag
Christian

Categories:

68 Kommentare

  1. Hi,

    sehr gut beschrieben, hat auf Anhieb geklappt.
    Aber wie bringe ich es fertig das ich das Dashboard nur aus dem lokalen Netz erreiche?
    Docker läuft bei mir im heimischen Netzt und nicht auf einem Root-Server.

  2. Moin,
    vermutlich bin ich einfach nur zu Doof, aber ich bekomme das Traefik nicht zum laufen. Mehr gesagt, es läuft aber ich kann mich nicht ein loggen.
    Ich hänge immer in der Anmeldemaske fest.

    Gruß

    • Ich hatte ein ähnliches Problem und bin an der Anmeldemaske nicht weitergekommen, weil ich einfach user und password hatte im Befehel stehen lassen und dann gewundert, dass das, was dabei rauskommt, nicht als Passwort funktioniert: echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g

      10 min später dämmerte es mir, dass ich damit ja als Login „user“ und „password“ festgelegt habe, fasste mir an den Kopf und habe user und password durch eine eigene Eingabe ersetzt (in meinem Passwortmanager hinterlegt) und den Output des Kommandos, wie in der Anleitung beschrieben, in der docker-compose.yml eingepflegt.

      • Danke für die Antwort, aber den Schritt „echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g“ habe ich auch gemacht und auch das in die dementsprechende Zeile eingefügt. Zudem habe ich auch die Domain eingetragen.

        Der jetzige Fehler ist 404 Seite nicht gefunden.

        Ich verstehe das bald alles nicht mehr.

        • So den Fehler 404 habe ich hin bekommen. habe einfach dei der einen Domain die Endung .de vergessen 🙂
          Nur die Anmeldung funktioniert leider immer noch nicht.

          Den Befehl „echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g“ habe ich ausgeführt sonst funktioniert die Anwenung nicht. Habe aber dann die Zeile wo das Passowrd und der Anwender steht gegen ein anderes Passwort geändert. Leider funktioniert es immer noch nicht.

          Selbst wenn ich die Zeile soausfülle – „traefik.http.middlewares.traefik-auth.basicauth.users=user:password“ hänge ich in einer dauer Anmeldeschleife.

          • Hallo Olaf,
            ich habe das Kapitel 3.3 etwas umgeschrieben, damit es vlt deutlicher wird. Aber in die Konfig wird KEIN Benutzername / Passwort im Klartext geschrieben.

            LG
            Christian

        • Hallo,

          Vielen Dank für diese Anleitung, ich komme aber nicht weiter.
          Was muss ich als traefik.example.com eingeben (Hostname)? ist das die von aussen sichtbare IP Adresse vom Router? Ich habe ein DDNS xxxx.dedyn.io, hab es damit versucht, klappt aber nicht (404).
          Wäre das denn traefik.xxxx.dedyn.io ? Muss man die IP Adresse vom Server (in meinem Fall RPi4) nicht mitangeben?
          übrigens steht da einmal traefik.example.com und dann traefik.example.de? Ist das beabsichtigt?

  3. Hallo Christian,

    danke für die Info. Jetzt wird auch ein Schuh draus.
    Ach noch was. Wenn ich hier ein Kommentar eintrage, kommt folgende Fehlermeldung :

    Error: You have entered an incorrect reCAPTCHA value.
    Click the BACK button on your browser and try again.

    Gruß

  4. Hallo,

    Das sind schon wirklich sehr gute Anleitungen. Danke dafür.
    Ich bekomme bei Nextcloud und Grafana im Moment leider jeweils folgenden Fehler per Traefik:

    middleware „secHeaders@file“ does not exist

    Die Einträge wie (hier bei NC)

    – „traefik.http.routers.nextcloud-app-secure.middlewares=nextcloud-dav,secHeaders@file“

    sind jeweils vorhanden.
    Kann es sich um ein Problem bei den User-Rechten handeln?
    Welchem User sollten die yml-Files denn in der Praxis zugeordnet sein und als welcher User starte ich am besten docker-compose?

    Grüsse

    • Hallo,
      soweit ist bei dir wohl alles korrekt.
      Du musst den Punkt 7 der Anleitung noch befolgen. Dann klappen alle Anleitungen bei mir aus dem Blog bei dir.

      LG
      Christian

      • Hallo,

        Habe den Fehler gefunden ..

        file:
        filename: „/dynamic_conf.yml“ in traefik.yml vergessen hinzuzufügen ….

        Nun schnurrt alles. 🙂

        Danke nochmal für die sehr guten Anleitungen.
        Beim Nextcloud werde ich noch Redis Support hinzufügen und ggf. andere Optimierungen vornehmen.

        Grüsse

  5. Hey ho, habe dies nun 2x Probiert

    Ich habe alles mehrmals überprüft

    Bleibe aber immer bei „4. Traefik starten“ stehen da ich einen „521: Web server is down“ fehler bekomme

    ich weis gerade nicht an was es liegt, falls jemand von euch es weis gebt mir gerne bescheid, ich suche fürs erste mal eine andere anleitung

    • Hallo,
      versuch mal beim Schritt 4 folgenden Befehl (also ohne -d)
      docker-compose -f /opt/containers/traefik/docker-compose.yml up

      So müsstest du die Ausgabe auf deiner Console sehen und somit auch das genaue Problem / Fehler.

      LG
      Christian

  6. Hallo!

    Ich habe die Anleitung durchgearbeitet und mehrfach die Schritte überprüft. Die Seite geht im Browser nicht auf. Traefik läuft, die Umleitung von http zu https funktioniert, aber es kommt im Browser der Fehler: ERR_SSL_PROTOCOL_ERROR

    Was mache ich falsch?

    Danke!!
    Tom

    • Irgendetwas scheint beim Abholen des Zertifikats nicht geklappt zu haben. Ich habe den Redirect herausgenommen und anschließend nochmal gestartet, und siehe da, es klappt jetzt! Vielleicht hilft die Info auch noch jemand anderem.

  7. Beim Ausführen von:
    sudo docker-compose -f /opt/containers/traefik/docker-compose.yml up -d

    erhalte ich folgenden Fehler:

    ERROR: In file ‚/opt/containers/traefik/docker-compose.yml‘, service must be a mapping, not a NoneType.

    Ich habe docker-compose.yml so erzeugt wie in der Anleitung angegeben. Wie kann ich den Fehler beheben?

  8. Hallo Christian,
    vielen Dank für die sehr ausführliche Anleitung und danke, dass du dein Know-how teilst.
    Ich freue mich auf weitere spannende Projekte von dir.

    Vielen Dank und viele Grüße,
    Koray

  9. Hallo Christian, ganz herzlichen Dank für die Tutorials. Sie sind sehr wertvoll. Da ich gerne weiß, was ich tu … könntest du den mechnismus mit den Labels etwas erklären? Leider finde ich kaum Dokumentation, wie in einem Container die labels ausgelesen werden können. Ich verstehe das so.

    1. Traefik liest von den laufenden Containern die labels aus um fesztzustellen, ob ein container für traefik relevant ist. („traefik.enable=true“). Dazu verwendet es die docker-api unter unix:///var/run/docker.sock
    2. traefik konstruiert einen Key nach dem Muster traefik.{funktion}.{containername.{funktionsparameter}. Auf diese Weise ist es möglichk, traefik an den „Ziel“ – containern zu konfigurieren

  10. Hallo Christian,
    herzlichen Dank für das anschauliche Tutorial.
    Dazu habe ich einige Fragen: Unter welchem User führe ich denn die Befehle ab Kap. 3.1 aus? Als root? Oder als einfacher User? Brauchen die Dateien dementsprechend spezielle Rechte?

    Danke Dir für eine kurze Erläuterung.

    Herzliche Grüße
    Gerrit

  11. Hallo Christian,

    auch ich darf dir ein großes Danke hier lassen!

    Alles hat geklappt bis auf das ändern von Punk „3.3 docker-compose.yml anpassen“.
    Der Zugang über die subdomain traefik.meinedomain.de klappt lediglich mit user/password – ein neustart von docker/docker-compose sowie ein löschen er alten images hat nichts bewirkt. Ich weiß nicht ob das damit zusammenhängt das mit der zweiten Anleitung „https://goneuland.de/traefik-v2-https-verschluesselung-sicherheit-verbessern/“ auch keine Effekte eintreten..

    Bin für jede Hilfe dankbar.

    Liebe Grüße Omar

    • Hallo Omar,
      dass der Zugang zu „trafik….“ nur mit Nutzername / Passwort funktioniert ist so gewollt und richtig.
      Die Zugangsdaten legst du doch in Schritt 3.3 fest. Diese musst du zum Login verwenden.

      LG
      Christian

  12. Hallo,

    Danke für die Tutorials.

    Was mir so ein bisschen sorgen macht ist die tatsache, das alle services als user root laufen.
    es gibt da wohl die möglichkeit mittels user: 1000:1000 bzw user: username das zu ändern,
    allerdings will es mir nicht gelingen, die container starten einfach nicht ( restarting )

    wäre super wenn du das evtl anpassen könntest, der sicherheit wegen 🙂

    mfg
    Thomas

    • Hallo Thomas,
      ja es ist möglich, dass man in den Containern eigene Benutzer anlegt, welche dann die Anwendungen starten.
      Einige der Container machen dies „automatisch“.

      Ich habe meine Anleitungen hier sehr „einfach“ gehalten und daher gehe ich hier auf solche Aspekte weniger ein.

      LG
      Christian

  13. Hallo 🙂

    bei mir erscheint beim Start folgende Fehlermeldung.
    root@v16015:/opt/containers/traefik# ERROR: for traefik Cannot start service traefik: driver failed programming external connectivity on endpoint traefik (75f3d202c2e22691039cd713a577ad0fe8fd4bde9d7bb3d1f581041405f5c5be): Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
    -bash: syntax error near unexpected token `(‚

    Ich denke es hat was mit den Ports zu tun. Finde aber keine Lösung.

    Weiss Du oder jemand hier vielleicht eine Lösung ?

    • Hab das gleiche Problem:

      ERROR: for traefik Cannot start service traefik: driver failed programming external connectivity on endpoint traefik (9ac4e5e40b9050d9f256ee7e3bb87b1a07267c1dc1030debe6d840cba852a795): Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use

      Wie hast du es gelöst?

  14. Hallo 🙂

    das Port Problem ist gelöst aber dann erscheint beim Aufruf der Webseite folgendes:

    Datenschutzfehler

    Ihre Verbindung ist nicht privat.
    Angreifer versuchen möglicherweise Ihre Informationen von traefik.marcos-cloud.de zu stehlen (z. B. Kennwörter, Nachrichten oder Kreditkarten).
    NET::ERR_CERT_AUTHORITY_INVALID

    Die Seite ist mit einem LetsEncrypt Zertifikat geschützt.

    Im Log des Containers steht folgendes:

    time=“2020-08-01T19:32:50+02:00″ level=error msg=“error parsing BasicUser: USER::$apr1$EWQVnN0K$8P8qBkiNHWIn3SCdqahJW/“ entryPointName=https routerName=traefik-secure@docker
    time=“2020-08-01T19:32:58+02:00″ level=error msg=“Unable to obtain ACME certificate for domains \“marcos-cloud.de\“: unable to generate a certificate for the domains [marcos-cloud.de]: error: one or more domains had a problem:\n[marcos-cloud.de] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: Invalid response from https://marcos-cloud.de/.well-known/acme-challenge/LwQQJxI9lVjrWuJeV1LkTJ8XVYAlzKP6Pjyh1pi4m7I [178.254.9.9]: \“\\r\\n404 Not Found\\r\\n\\r\\n404 Not Found\\r\\nnginx\\r\\n\“, url: \n“ routerName=traefik-secure@docker rule=“Host(`marcos-cloud.de`)“ providerName=http.acme

    Weiss jemand Rat ?

    Vielen Dank 🙂

  15. Du hast hier einige top HowTos publiziert die mri sehr geholfen haben. Ich habe eben einen kleinen Hinweis in den Logs entdeckt den du korrigieren könntest.

    dockerd[2108]: time=“2020-08-07T09:51:33.715401963+02:00″ level=warning msg=“Security options with `:` as a separator are deprecated
    and will be completely unsupported in 17.04, use `=` instead.“

    I schätze mal das sollte dann so aussehen?

    security_opt:
    – no-new-privileges=true

  16. Hallo Christian, danke für deine Anleitung / Anleitungen, super.

    Folgende Fragen zu dieser:

    Warum verwendest Du root und sudo im Tutorial abwechselnd, hat das eine Grund oder übersehen?
    Warum USER (/opt/containers/traefik/docker-compose.yml) und „user“ in der Beschreibung von Traefik, hat es einen Grund?

    Funktioniert, sollte deine Anleitung auch mit einer kostenfreien Subdomain funktionieren?

    Viele Grüße
    Matthias

    • Hallo,
      Traefik verwendet doch standardmäßig Letsencrypt Zertifikate. Ich verstehe die Frage nicht so richtig.

      Einfach der Anleitung folgen, dann sollte es klappen 🙂

      LG
      Christian

  17. So nun habe ich mal wieder ein Problem.

    habe alles gemacht wie sonst. ur komme ich nicht auf den Traefik.

    wenn ich mich auf dem Server einlogge und docker ps eingeben, sehe ich zwar das der Docker läuft, aber er hat keine IP. Bei Port sethet 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

    Wo liegt nun wieder das Problem?

  18. Hallo Christian,
    erst einmal danke für deine tollen Tutorials, die haben mir schon sehr geholfen. Ich habe hier dank dir aktuell auf Ubuntu 20.04 Docker mit Traefik, Nextcloud, Portainer und Bitwarden laufen.
    Ich wollte auch gerne Hass.io (Home Assistant Supervised (mit Addon Store)) ans laufen bekommen. Ich habe ewig einen Weg gesucht es per Docker Compose ans laufen zu bekommen, bin aber immer gescheitert.
    Dann habe ich doch den Weg über ein Skript nach dieser Anleitung gewählt (https://www.smarthomebeginner.com/install-hass-io-on-docker-linux/), was auch wunderbar funktioniert hat. Im Heimnetz ist Home Assistant erreichbar, aber ich scheiter kläglich an der Integration in Traefik, da ich hier keine Docker Compose File habe 🙁
    Laut dieser Seite gibt es auch die möglichkeit über „rules“ Treafik entsprechend zu konfigurieren, damit es klappt. Blöderweise hat der Autor Traefik anders konfiguriert als du in deiner und ich kann (verstehe) es nicht so intigrieren wie er. Er bindet .yml files ein per CLI arguments im Docker-Compose.yml von Treafik.
    Gibt es eine andere möglichkeit, z.B. über die Labels im Docker Compose von Traefik?

    Es wäre der Hammer wenn du mir da auf die Sprünge helfen könntest, weil ich da bei weitem nicht genug Backgroundwissen habe um da durch zu steigen.

    Gruß Bert

  19. Hallo,
    ich bin jetzt zu Netcup gewechselt und weiss nicht, wo welche Eintragungen erfolgen müssen.
    (Ich war zuvor bei ionos, da hat es wunderbar geklappt…).
    Welche DNS-Einstellungen muss ich dort vornehmen?
    Ich hatte zuvor getrennte Einstellmöglichekeiten für meinedomain.de sowie der Subdomain seite.meinedomain.de
    Für meinedomain.de hatte ich das A record sowie das AAAA record gesetzt, für traefik.meinedomain.de die AAAA records für die Subdomain, das war´s und es lief problemlos.

    Mich verwirrt das *, @ cname etc, diese gab es bei ionos nicht.
    Muss ich im Webhosting Control Panel eine subdomain traefik.meinedomain.de einrichten und diese dann weiterleiten?

    Momentan erhalte ich von traefik im log folgende Fehlermeldung:
    2021/01/05 10:37:01 command traefik error: field not found, node: resolvers

    Ich bin nach dem Wechsel völlig verwirrt und wäre für eine genaue Erklärung sehr dankbar.

    Jürgen Dingslaken

  20. Hallo,
    ich bin neu in dieser Materie. Nutze zu Hause einen neu aufgelegten Server mit Debian 10 und OMV5 (NGINX). Ich habe bei netcup eine de-Domain und würde gerne über eine Subdomain traefik erreichen. Gibt es dazu Anleitungen? Oder wer kann mir helfen?

  21. Hi,
    bis hier herr hat alles super geklappt. Bei wordpress ist der Wurm drin.

    bekomme immer die Meldung: Error establishing a database connection

    meine docker-compose.yml für wordpress sieht so aus:

    version: ‚3‘
    services:
    db:
    image: mariadb:latest
    volumes:
    – /opt/containers/wordpress/db-daten:/var/lib/mysql
    environment:
    MYSQL_ROOT_PASSWORD: xxx
    WORDPRESS_DB_NAME: wordpress
    MYSQL_USER: wordpress
    MYSQL_PASSWORD: xxx
    MYSQL_INITDB_SKIP_TZINFO: 1
    networks:
    – default
    restart: unless-stopped
    wp:
    image: wordpress:latest

    volumes:
    – /opt/containers/wordpress/wp-daten:/var/www/html
    labels:
    – „traefik.enable=true“
    – „traefik.http.routers.wp.entrypoints=http“
    – „traefik.http.routers.wp.rule=Host(`xxxx.duckdns.org`)“
    – „traefik.http.middlewares.wp-https-redirect.redirectscheme.scheme=https“
    – „traefik.http.routers.wp.middlewares=wp-https-redirect“
    – „traefik.http.routers.wp-secure.entrypoints=https“
    – „traefik.http.routers.wp-secure.rule=Host(`xxx.duckdns.org`)“
    – „traefik.http.routers.wp-secure.tls=true“
    – „traefik.http.routers.wp-secure.tls.certresolver=http“
    – „traefik.http.routers.wp-secure.service=wp“
    – „traefik.http.services.wp.loadbalancer.server.port=80“
    – „traefik.docker.network=proxy“
    networks:
    – default
    – proxy
    environment:
    WORDPRESS_DB_HOST: db:3306
    WORDPRESS_DB_PASSWORD: xxx
    WORDPRESS_DB_NAME: wordpress
    MYSQL_USER: wordpress
    restart: unless-stopped
    networks:
    proxy:

    Jemand eine Idee ?

  22. Hallo Christian,

    wirklich eine sehr gute Anleitung. Der Docker-Container fährt auch hoch und wird im Traefik-Dashboard auch korrekt angezeigt.

    Rufe ich die URL auf, kommt aber immer die Meldung:

    curl https://nextcloud.yyyyyyyyy.duckdns.org -I
    HTTP/2 504
    content-type: text/plain; charset=utf-8
    content-length: 15
    date: Sat, 30 Jan 2021 14:23:53 GMT

    Ich habe die docker-Netzwerke wie im Tutorial angegeben, konfigueriert.

    Hast Du eine Idee, wie man da weiterkommt?

    Beste Grüße, Klaus

  23. Hallo, super Anleitung! Aber braucht man immer auch einen A-Record für traefik.DOMAIN.TLD?
    Wenn man Jitsi.DOMAIN.TLD und Ilias.DOMAIN.TLD auf verschiedenen Servern ausprobiert, muss man dann bei traefik.DOMAIN.TLD mit traefik-1.DOMAIN.TLD und traefik-2.DOMAIN.TLD usw arbeiten? Oder kann man für den Zugriff auf die Traefik-Oberfläche auch irgendwie Ports nutzen und nur A-Records für zB Ilias.DOMAIN.TLD und jitsi.DOMAIN.TLD vergeben und Traefik über Ilias.DOMAIN.TLD:12345 und jitsi.DOMAIN.TLD:12345 erreichen?

  24. Hallo Christian,
    auf meinem Server laufen nach deiner Anleitung diverse Docker in Verbindung mit Taefik. Das funktioniert sehr gut und auf meiner Fritzbox habe ich lediglich die Ports 80 und 443 für Traefik geöffnet.
    Ich würde jetzt gern verhindern, dass jemand von außen unberechtigt auf meine Docker zugreift. Siehst Du eine Möglichkeit, eine Firewall in das System einzbinden, die z. B. bestimmte Adressbereiche von außerhalb blockieren kann?
    Ich habe schon UFW (ohne Docker) installiert, bekomme es damit aber nicht hin.

    Viele Grüße und danke für deine Webseite

    Werner

  25. Guten Morgen,
    mein Problem ist, dass ich nicht verstanden habe, in welcher Form ich jetzt neue Container einbinden kann. Traefik läuft ohne Probleme auf einer Subdomain, aber wie und wo füge ich neue Container hinzu? Packe ich den Service in dieselbe Datei oder erstelle ich dafür auch einen Container-Ordner?

    Mit freundlichen Grüßen

    • Hallo Stefan,
      das ist eigentlich ganz einfach. Du schaust hier im Blog einfach nach Anleitungen, die dich interessieren.
      Hier findest du die Anleitungen: https://goneuland.de/category/docker/

      Diese arbeitest du einfach ab. Dann hast du später verschiedene Container laufen und alles sollte funktionieren.

      Bei Docker wird für jede Anwendung immer ein eigener / mehrere Container erstellt.

      LG
      Christian

  26. Hi Christian,

    vielen Dank für die vielen guten Anleitungen rund um Docker. Leider bleibe ich bei traefik bei der Erzeugung der Zertifikate hängen; die Seiten sind nicht zu erreichen.
    Ich nutze einen Server hinter meiner Fritzbox; die Box ist über einen DynDNS Eintrag xxx.spdns.eu zu erreichen.
    Folglich sind die Einträge in der docker-compose.yml
    – „traefik.http.routers.traefik.rule=Host(`traefik.xxx.spdns.eu`)“
    und
    – „traefik.http.routers.traefik-secure.rule=Host(`traefik.xxx.spdns.eu`)“

    Im log des traefik Containers findet sich die Fehlermeldung:

    time=“2021-04-08T19:16:32+02:00″ level=error msg=“Unable to obtain ACME certificate for domains \“traefik.xxx.spdns.eu\“: unable to generate a certificate for the domains [traefik.xxx.spdns.eu]: error: one or more domains had a problem:\n[traefik.xxx.spdns.eu] acme: error: 400 :: urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for traefik.xxx.spdns.eu – check that a DNS record exists for this domain\n“ rule=“Host(`traefik.xxx.spdns.eu`)“ providerName=http.acme routerName=traefik-secure@docker

    Das die Namesaufösung nicht klappt finde ich logisch – traefik.xxx.spdns.eu ist ja nur intern bekannt.
    Lasse ich das traefik vor xxx.spdns.eu weg, dann klappt die Erzeugung des Zertifikats – das ist ja aber nicht Sinn der Sache.

    Hast Du eine Idee, wie ich das Problem los werden kann?
    Vielen Dank schon mal
    Andreas

    • … antworte ich mir mal selbst.
      so wie’s aussieht „kann“ spdns.eu keine Wildcard Zertifikate. Habe einen neuen Account bei duckdns.org angelegt – jetzt geht’s

  27. Hallo,

    ich bekomme immer folgende Fehler:
    traefik | time=“2021-04-21T15:18:26+02:00″ level=info msg=“Configuration loaded from file: /traefik.yml“
    traefik | time=“2021-04-21T15:18:26+02:00″ level=error msg=“The ACME resolver \“http\“ is skipped from the resolvers list because: unable to get ACME account: unexpected end of JSON input“
    traefik | time=“2021-04-21T15:18:27+02:00″ level=error msg=“the router traefik-secure@docker uses a non-existent resolver: http“

    Ich bin recht neu auf dem Gebiet und wüsste gerne einen Rat ^^

    Vielen Dank im Voraus!

  28. Hallo,
    Ich habe ein Problem bei der Anmelde makse.
    Ich habe sowohl meinen eigenen String da eingetragen (Server:…)
    als auch den der hier stand (user:$$apr1$$7ciH.Uzt$$DUqDgmpLmFE2Fm7Z7VaMe/)
    aber immer wenn ich das Passwort angebe passiert nichts bzw ich soll die daten neu angeben.
    Kann es eventuell an Portainer liegen ?
    und als nächste frage habe ich wenn ich auf traefik.[Text].duckdns.org bekomme ich 1. unsichere Verbindung 2. Fehler 404.
    Wenn ich auf [Text].duckdns.org gehe bekomme ich 1. unsichere Verbindung 2. Die endlose Anmeldemaske

    Wenn ich es aber richtig verstanden habe sollte die Maske doch eigentlich auf traefik.[Text].duckdns.org kommen oder?

    Ich hoffe man versteht mein Problem und kann mir eventuell Helfen.

    • Habe selber die Lösung gefunden.
      „echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g“ funktioniert bei mir nicht muss
      „echo $(htpasswd -nb user password)“ nutzen

  29. Die Anleitung sieht gut aus. Nur eine Frage: Ich habe bereits AdGuard Home unabhängig von Docker installiert und möchte das auch ganz gerne so beibehalten. Die Ports 80 und 443 sind also bereits belegt. Kann ich die hier vergebenen Ports einfach durch andere, z.B. 8042, 8043…. ersetzen oder klemmt es dann?

    • Hallo Martin,
      der „Sinn“ von Traefik ist ja, dass genau diese beiden Ports 80,443 „mehrmals“ genutzt werden können. Wenn du diese hier aber nicht nutzen möchtest, dann brauchst du eigentlich auch kein Traefik zu installieren. Du musst halt im Webbrowser bei anderen Ports wie 80,443 immer diesen dazu angeben.

      LG
      Christian

  30. Hallo Christian,

    zunächst mal vielen Dank für die sehr gute Hilfestellung. Ich bin aktuell dabei eine bestehende nextcloud-nginx-reverse-proxy docker Konfiguration umzustellen (Zielsetzung: nginx reverse proxy mit traefik ersetzen, um weitere Services einfacher umsetzen zu können). Mit Hilfe deiner Beschreibung bin ich bereits ein gutes Stück weiter gekommen. Nur noch ein Hinweis, was bei mir zu etwas Verwirrung gesorgt hat (da ich mich mit traefik noch Null auskenne – also eigentlich mein Fehler, aber vielleicht würde eine etwas ausführlichere Erklärung an der Stelle auch anderen helfen):

    Die Benennung der „entrypoints“ und „certificateresolvers“ zusammen mit labels wie beispielsweise „traefik.http.middlewares.traefik-https-redirect.redirectscheme=https“ haben bei mir dazu geführt, dass ich nicht wusste an welcher Stelle im label was gemeint ist. Konkret: Bezieht sich das erste „http“ auf einen entrypoint, einen certificateresolver oder ist es schlicht Teil der label-Syntax, die von traefik so gefordert wird? Gleiche Fragestellung gilt für das letzte „https“ im obigen Beispiellabel…

    Vielen Dank nochmal!

  31. Hi Christian,

    erst einmal: DANKE für deine Mühen und die easy Anleitungen! Dank deiner Seite habe ich jetzt an zwei Tagen endlich das erreicht, was ich eigentlich schon seit längerem einführen wollte. Hab bei mir jetzt mailcow (war bis dato nur standalone), Portainer, BitWarden (wollte schon länger von 1Password wechseln) und einige WordPress-Instanzen hinter Traefik! Danke in Form einer Spende geht nachher mal raus… 🙂

    Aber mal eine Frage zu Traefik selbst:
    Nach der initialen Installation hat es mich noch nach dem Login gefragt… Mittlerweile aber nicht mehr. Hab gerade noch in der docker-compose.yml einen neuen Login erstellt und den Container mal neugebaut – trotzdem lande ich sofort im Dashboard. Selbst im Inkognito-Modus meines Browsers.

    Hast du da ’ne Idee zu?

    VG
    Dawid

  32. Hallo,

    ich habe deine Anleitung befolgt und bin dir sehr dankbar für das HowTo.
    Leider stehe ich gerade etwas auf dem Schlauch und bräuchte Unterstützung.

    Folgendes habe ich vor:

    Docker inkl Docker Compose ist auf einem vServer im Internet installiert.
    Traefik ist über das Docker Compose File Online und soweit funktional.

    Nun habe ich z.B einen Raspi daheim stehen, welcher via Wireguard mit dem vServer verbunden ist.

    Was müsste ich Docker / Traefik seitig denn nun konfigurieren, damit ich über den vServer zu meinem Homepi komme?

    Also Traefik hält den FQDN myhomepi.domain.tld und soll diese an die Wireguard IP Adresse 10.172.55.13 weiterleiten.

    Traefik sollte in diesem Falle als Reverse Proxy dienen und ein LE Zertifikat beziehen.
    Muss ich hier Anpassungen in der docker-compose.yml vornehmen?

    Recht wäre es mir, wenn ich eine zweite .yml Datei anlegen, wo die Config dann drin steht, so gesehen, dass für jeden „vHost“ eine Datei im Traefik eingelesen wird.

    Vielen Dank für eure Hilfe

  33. Hallo Christian, tolles Tutorial, hat auch fast alles geklappt. Traefik ( -Webkonsole) ist extern erreichbar, und zeigt keine Fehler. Also Home Assistant einbinden. Ich habe die Anleitung aus Deinem obigen Beispiel benutzt.
    Die einigen Änderungen, die ich vorgenommen habe, sind meine Domain- Namen und bei mir heißt das Netz nicht „proxy“ sondern „traefik“, und der Serverport ist 8123.

    Der docker-compose.yaml Abschnitt sieht so aus:


    homeassistant:
    container_name: homeassistant
    image: homeassistant/home-assistant:stable
    volumes:
    – „homeassistant:/config“
    – „/etc/localtime:/etc/localtime:ro“
    network_mode: host
    devices:
    – „/dev/ttyACM0:/dev/ttyACM0“
    restart: unless-stopped
    labels:
    – „traefik.enable=true“
    – „traefik.http.routers.homeassistant.entrypoints=http“
    – „traefik.http.routers.homeassistant.rule=Host(`homeassistant.xxx.xxx.xxx`)“
    – „traefik.http.middlewares.homeassistant-https-redirect.redirectscheme.scheme=https“
    – „traefik.http.routers.homeassistant.middlewares=homeassistant-https-redirect“
    – „traefik.http.routers.homeassistant-secure.entrypoints=https“
    – „traefik.http.routers.homeassistant-secure.rule=Host(`homeassistant.xxx.xxx.xxx.org`)“
    – „traefik.http.routers.homeassistant-secure.tls=true“
    – „traefik.http.routers.homeassistant-secure.tls.certresolver=http“
    – „traefik.http.routers.homeassistant-secure.service=homeassistant“
    – „traefik.http.services.homeassistant.loadbalancer.server.port=8123“
    – „traefik.docker.network=traefik“

    Allerdings bekomme ich nur ein mageres „501 Bad Gateway“.

    In der Anleitung steht, dass man das Netzwerk von Traefik noch zufügen soll. Wenn ich das allerdings tue, bekomme ich die Fehlermeldung: „network mode: host“ and „networks“ are incompatible!“ Ich gehe davon aus, dass dies die Ursache für den Fehle ist.

    Ich muss aber Home Assistant aber im Network Mode „Host“ laufen lassen , da es die Protokolle nDNS / Bonjour, SSDP, zeroconf, … benötigt. Irgendeine Idee, wie das gelöst werden kann?

    Vielen Dank im Voraus!

    Hans – Thomas

  34. Hallo Christian,
    besten Dank für deine wirklich guten Anleitungen! Mit deren Hilfe hab ich einen Server mit Docker/Docker Compose und Traefik als reverse-proxy auf Anhieb zum laufen gebracht. Die Kirsche auf der Torte wäre jetzt noch eine jupyterhub-Installation (https://jupyter.org/hub). Damit könnte ich vielen lernwütigen Menschen jupyter-Notebooks zur Verfügung stellen, ohne dass die was installieren müssten. Leider sind Anleitungen in dem Gebiet nicht häufig. Hast du da einen Tipp für mich der unter der von dir vorgeschlagenen Konfiguration läuft?

    Vielen Dank,
    Markus

  35. Hallo Christian,

    zunächst vielen Dank für Deine gute Anleitung.

    Ich habe TRAEFIK damit auf Anhieb zum Laufen bekommen (hinter einer FritzBox mit eigener Domäne ‚Traefik.mydomain.de‘). Nun möchte ich TRAEFIK zusätzlich nutzen, um weitere Server (z. B. „http://192.168.1.22:8080“) von „außen“ über weitere Subdomains (z. B. ’service1.mydomain.de‘) in meiner lokalen Umgebung zu erreichen. Das SSL-Zertifikat soll dabei jeweils von TRAEFIK gemanaged werden.

    Meine Versuche, Services in einer dynamischen Konfigurationsdatei anzulegen scheitern dabei jeweils und führen üblicherweise dazu, dass auch das Dashboard nicht mehr erreichbar ist. Hast Du da einen Tipp für mich oder eine Idee, wo ich nachlesen kann.

    Vielen Dank und viele Grüße
    Jens

Schreibe einen Kommentar

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