Comment rediriger http vers https avec les étiquettes Traefik 2.0 et Docker Compose?

14

Veuillez noter qu'il s'agit d'une question Traefik V2. J'avais une solution sur V1 mais V2 est un remaniement total.

Ce qui précède est censé rediriger http://whoami.mysite.com vers http s : //whoami.mysite.com.

  • Le http s fonctionne bien.
  • Le http ne redirige pas vers https et génère une erreur 404.

Il n'y a pas d'autre fichier. Tout est dans ce Docker-compose.yml pour le moment car c'est un test pour préparer un déploiement ultérieur.

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"
      - "[email protected]"
      - "--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"
Thib
la source

Réponses:

10

Il y a maintenant une solution de travail dans un tutoriel de Gérald Croës à:

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"  
Martin Hryniewiecki
la source
1
Voici le docker-compose.yml de l'article github.com/containous/blog-posts/blob/master/…
TheOneRing
1
Notez qu'avoir un acme.json existant peut empêcher le middleware de rediriger vers HTTPS. Supprimez-le s'il existe déjà au démarrage de Traefik.
AymDev
7

Vous n'avez pas besoin de configurer le service Traefik lui-même. Sur Traefik, il vous suffit d'avoir des points d'entrée à: 443 (Web-Secure) et: 80 (Web)

Parce que Traefik agit uniquement en tant que point d'entrée et ne fera pas la redirection, le middleware sur le service cible le fera.

Configurez maintenant votre service cible comme suit:

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

Donc, fondamentalement, le flux se passe comme suit:

Demande: http://sub.domain.com:80 -> traefik (service) -> mywebserver-web (routeur, règle http) -> mywebserver-redirect-web-secure (middleware, redirection vers https) - -> mywebserver-web-secure (routeur, règle https) -> mywebserver (service)

Lars
la source
Pas sûr que ce soit l'exigence. De la façon dont vous l'avez décrit, il semble que les requêtes soient envoyées dans le port traefik 80 et que le schéma soit modifié en https avant d'être transmis au service backend. Mais le service backend ne fait pas de terminaison https, donc cela échouera. L'idée serait de faire une véritable redirection http afin que la demande retourne à traefik sur le port 443 en préservant l'hôte. Dans Traefik v1, cela se faisait facilement via une configuration statique.
Andrei Dascalu
Cela marche. Cela devrait être dans la documentation. Il vous suffit de créer un routeur pour la version http et d'y mettre le middleware de redirection.
milosa
2

Ok, trouvé ... J'ai supposé que les middlewares pouvaient être déclarés au niveau Traefik mais ils devaient être déclarés au niveau du service.

Cette ligne :

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

Doit être dans les étiquettes du service whoami.

Un autre point, qui n'est pas lié au problème décrit, est que le défi http doit être fait sur le port 80.

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

Supprimez le "sécurisé" dans "Web sécurisé".

Thib
la source
C'est étrange. J'ai un middleware de redirection déclaré sur le service Traefik et référencé à partir du service d'application et cela fonctionne.
Izydorr
Avec le code précédent, il semble fonctionner, mais le http ne redirige pas réellement vers https.
Thib
Comment vous référez-vous au middleware de l'application?
Thib
En service traefik je une étiquette définissant le middleware: traefik.http.middlewares.https-only.redirectscheme.scheme=https et service app - je une étiquette: traefik.http.routers.myapp.rule=Host($ {} APP_HOST ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr
1
J'ai tout dans les étiquettes. Si je comprends bien, l'utilisation de middleware nécessite deux étiquettes: une pour la déclaration / configuration (traefik.http.middlewares.https-only.redirectscheme.scheme = https), puis l'appliquer au service (traefik.http.routers.myapp.middlewares = https uniquement). La déclaration peut se trouver soit dans le service d'application soit dans le service treafik par exemple - tout comme je le fais. Notez que même si vous déclarez un middlewawe dans le service d'application, vous le voyez dans le tableau de bord avec d'autres middlewares déclarés dans d'autres endroits. Peut-être que je me trompe, mais je pense que vous pouvez utiliser n'importe lequel d'entre eux dans n'importe quel service.
Izydorr
1

Je cherchais cette réponse lorsque je cherchais comment tout rediriger vers HTTPS via Traefik v2.2 et la meilleure option pour moi était d'ajouter ces variables ENV à Traefik et il redirige automatiquement tout le trafic vers HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Avec cela, je n'ai pas besoin d'ajouter quoi que ce soit au middleware.

fperk
la source