Wie leite ich http mit Traefik 2.0- und Docker Compose-Labels zu https um?


14

Bitte beachten Sie, dass es sich um eine Traefik V2-Frage handelt. Ich hatte eine Lösung für V1, aber V2 ist ein totaler Rewamp.

Dies oben soll http://whoami.mysite.com zu http s : //whoami.mysite.com umleiten.

  • Das http s funktioniert gut.
  • Das http leitet nicht zu https um und löst einen Fehler 404 aus.

Es gibt keine andere Datei. Im Moment befindet sich alles in dieser Docker-compose.yml, da es sich um einen Test handelt, um die weitere Bereitstellung vorzubereiten.

version: "3.3"

services:

  traefik:
    image: "traefik:v2.0"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web-secure.address=:443"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
      #- "--certificatesresolvers.myhttpchallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myhttpchallenge.acme.email=me@mail.com"
      - "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.middlewares=redirect-to-https@docker"
      - "traefik.http.routers.whoami-secured.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami-secured.entrypoints=web-secure"
      - "traefik.http.routers.whoami-secured.tls=true"
      - "traefik.http.routers.whoami-secured.tls.certresolver=myhttpchallenge"

Antworten:


10

In einem Tutorial von Gérald Croës finden Sie jetzt eine funktionierende Lösung unter:

https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

services:  
  traefik:  
    image: "traefik:v2.0.0"  
    # ...  
    labels:  
      # ...        
      # middleware redirect  
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"  
      # global redirect to https  
      - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"  
      - "traefik.http.routers.redirs.entrypoints=web"  
      - "traefik.http.routers.redirs.middlewares=redirect-to-https"  

1
Hier ist die docker-compose.yml aus dem Artikel github.com/containous/blog-posts/blob/master/…
TheOneRing

1
Beachten Sie, dass eine vorhandene acme.json die Umleitung der Middleware zu HTTPS blockieren kann. Entfernen Sie es, wenn es beim Start von Traefik bereits vorhanden ist.
AymDev

7

Sie müssen den Traefik-Dienst nicht selbst konfigurieren. Auf Traefik benötigen Sie nur Einstiegspunkte für: 443 (web-sicher) und: 80 (web)

Da Traefik nur als entryPoint fungiert und die Umleitung nicht ausführt, übernimmt die Middleware des Zieldienstes dies.

Konfigurieren Sie nun Ihren Zieldienst wie folgt:

version: '2'
services:
  mywebserver:
    image: 'httpd:alpine'
    container_name: mywebserver
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.mywebserver-redirect-web-secure.redirectscheme.scheme=https
      - traefik.http.routers.mywebserver-web.middlewares=mywebserver-redirect-web-secure
      - traefik.http.routers.mywebserver-web.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web.entrypoints=web
      - traefik.http.routers.mywebserver-web-secure.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web-secure.tls.certresolver=mytlschallenge
      - traefik.http.routers.mywebserver-web-secure.tls=true
      - traefik.http.routers.mywebserver-web-secure.entrypoints=web-secure
      # if you have multiple ports exposed on the service, specify port in the web-secure service
      - traefik.http.services.mywebserver-web-secure.loadbalancer.server.port=9000

Im Grunde geht der Fluss also so:

Anfrage: http://sub.domain.com:80 -> traefik (Dienst) -> mywebserver-web (Router, http-Regel) -> mywebserver-Redirect-Web-Secure (Middleware, Weiterleitung zu https) - -> mywebserver-web-Secure (Router, https-Regel) -> mywebserver (Dienst)


Ich bin mir nicht sicher, ob das die Voraussetzung ist. So wie Sie es beschrieben haben, scheinen die Anforderungen in Traefik-Port 80 zu gehen und das Schema wird in https geändert, bevor es an den Backend-Dienst weitergeleitet wird. Der Backend-Dienst beendet jedoch keine https-Beendigung, sodass dies fehlschlägt. Die Idee wäre, eine tatsächliche http-Umleitung vorzunehmen, damit die Anforderung an Traefik auf Port 443 zurückkehrt und der Host erhalten bleibt. In Traefik v1 war dies einfach über die statische Konfiguration möglich.
Andrei Dascalu

Das funktioniert. Dies sollte in der Dokumentation enthalten sein. Sie müssen nur einen Router für die http-Version erstellen und die Redirect-Middleware darauf platzieren.
Milosa

2

Ok, gefunden ... Ich nahm an, dass Middlewares auf Traefik-Ebene deklariert werden könnten, aber diese müssen auf Service-Ebene deklariert werden.

Diese Linie :

- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

Muss auf den Etiketten des whoami-Dienstes stehen.

Ein weiterer Punkt, der nicht mit dem beschriebenen Problem zusammenhängt, ist, dass die http-Abfrage an Port 80 durchgeführt werden muss.

- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"

Entfernen Sie das "sichere" in "web-sicher".


Es ist komisch. Ich habe Umleitungs-Middleware für den Traefik-Dienst deklariert und vom App-Dienst verwiesen, und es funktioniert.
Izydorr

Mit dem vorherigen Code scheint es zu funktionieren, aber der http leitet tatsächlich nicht zu https um.
Thib

Wie verweisen Sie in der App auf die Middleware?
Thib

In traefik Service habe ich ein Etikett mit der Middleware zu definieren: traefik.http.middlewares.https-only.redirectscheme.scheme=https und in App - Service habe ich ein Label: traefik.http.routers.myapp.rule=Host($ {APP_HOST} ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr

1
Ich habe alles in Etiketten. Soweit ich weiß, erfordert die Verwendung von Middleware zwei Bezeichnungen: eine für die Deklaration / Konfiguration (traefik.http.middlewares.https-only.redirectscheme.scheme = https) und die anschließende Anwendung auf den Dienst (traefik.http.routers.myapp.middlewares) = nur https). Die Deklaration kann sich beispielsweise entweder im App-Service oder im Treafik-Service befinden - genau wie ich. Beachten Sie, dass selbst wenn Sie eine Middlewawe im App-Service deklarieren, diese zusammen mit anderen an anderen Stellen deklarierten Middlewares im Dashboard angezeigt wird. Vielleicht irre ich mich, aber ich denke, Sie können jeden von ihnen in jedem Dienst verwenden.
Izydorr

1

Ich habe nach dieser Antwort gesucht, als ich gesucht habe, wie alles über Traefik v2.2 zu HTTPS umgeleitet werden kann. Die beste Option für mich war, diese ENV-Variablen zu Traefik hinzuzufügen und den gesamten Datenverkehr automatisch zu HTTPS umzuleiten.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Damit muss ich der Middleware nichts hinzufügen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.