8 votes

Utiliser le middleware traefik de manière globale

J'essaie de déclarer une redirection https à l'intérieur de l'interface utilisateur. traefik.yml fichier. Pour l'instant, j'ai essayé d'ajouter ces règles dans le fichier traefik service en docker-compose.yml . Cela a marché comme sur des roulettes. Bien que je préférerais configurer cette redirection globale et middleware à l'intérieur de l'interface de l'utilisateur. traefik.yml et ensuite le référencer dans le service traefik sur docker-compose.yml .

Ce que j'avais avant

version: '3'

networks:
  web:
    external: true

services:
  traefik:
    image: traefik:v2.1
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./.traefik/traefik.yml:/traefik.yml
      - ./.traefik/acme.json:/acme.json
    networks:
      - web
    labels:
       - "traefik.enable=true"
       - "traefik.http.routers.traefik.rule=Host(`$HOSTNAME`)"
       - "traefik.http.routers.traefik.service=api@internal"
       - "traefik.http.routers.traefik.tls.certresolver=le"
       - "traefik.http.routers.traefik.entrypoints=https"
       # Global redirect to https
       - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
       - "traefik.http.routers.http-catchall.entrypoints=http"
       - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
       # Middleware redirect
       - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

Cela a fonctionné facilement et a redirigé tous les autres domaines de http à https.

Ce que je veux maintenant

Je veux déclarer ces redirections à l'intérieur du fichier traefik.yml .

Jusqu'à présent, j'ai fait cela.

api: {}

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

log:
  level: DEBUG

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

http:
  # Global redirect to https
  routers:
    http-catchall:
      rule: hostregexp(`{host:.+}`)"
      entrypoints:
        http
      middlewares:
        - redirect-to-https
  # Middleware redirect
  middlewares:
    redirect-to-https:
      redirectScheme:
        scheme: https

certificatesResolvers:
  le:
    acme:
      email: john@doe.com
      storage: acme.json
      # Activate for Development: Certificate will not be valid. It's only for testing if it can be obtained.
      #caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      httpChallenge:
        entryPoint: http

Comme vous pouvez le voir, j'ai déclaré les paramètres http.

Ma question est maintenant comment puis-je référencer ces paramètres dans mon service traefik ?

Je l'ai essayé avec

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

- "traefik.http.middlewares.redirect-to-https"

- "traefik.http.middlewares.traefik=redirect-to-https@file"

Aucun d'entre eux ne fonctionne. Certains affichent l'intergiciel dans le tableau de bord, mais il n'est lié à aucun paramètre.

Quelqu'un a-t-il trouvé une solution à ce problème ? Je n'ai rien trouvé dans la documentation à ce sujet. Je pense que cela doit être lié d'une manière ou d'une autre à l'option @file .

Merci.

12voto

Einar Points 61

@file signifie que l'intergiciel a été défini dans le fournisseur de fichiers.

Vous pouvez ajouter un fournisseur de fichiers comme ceci dans traefik.yml.

providers:
  file:
    directory: "/path/to/dynamic/conf"

Créez un fichier dans ce répertoire avec l'intergiciel.

http:
  middlewares:
    redirect-to-https:
      redirectScheme:
        scheme: https

Vous pouvez désormais faire référence à redirect-to-https@file dans vos étiquettes.

- "traefik.http.middlewares.traefik=redirect-to-https@file"

NOTE : Une partie de votre configuration dans traefik.yml pourrait avoir besoin d'être déplacée vers votre nouveau fichier yml. Je suis nouveau sur Traefik et je n'ai pas encore compris pourquoi.

Voir les sections suivantes dans la documentation :

6voto

Vasyl Zhuryk Points 633

En fait, vous n'avez pas besoin de configurer ce middleware en traefik dans le bloc de labels. Si vous avez une telle configuration dans votre traefik.yml :

http:
  routers:
    http-catchall:
      rule: hostregexp(`{host:.+}`)
      entrypoints:
        - http
      middlewares:
        - redirect-to-https

  middlewares:
    redirect-to-https:
      redirectScheme:
        scheme: https
        permanent: false

Cela signifie - tout le trafic qui est venu au point d'entrée http devrait utiliser un intergiciel redirect-to-https et être redirigé vers un autre point d'entrée : https . Cette configuration est globale.

Ainsi, il suffit de définir votre conteneur à https point d'entrée (comme vous l'avez fait, dans votre exemple)

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.traefik.entrypoints=https"
  - "traefik.http.routers.traefik.rule=Host(`traefik.mydomain.ua`)"
  - "traefik.http.routers.traefik.tls=true"
  - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"
  - "traefik.http.routers.traefik.service=api@internal"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X