Docker Compose & Traefik, répondre sur une URL et ses sous-domaines

Posté le Mercredi 13 novembre 2019 - 09:19

J'utilise maintenant docker-compose pour l'ensemble de mes projets, principalement avec la formidable pile « docker4drupal ».

Cette pile utilise Traefik pour comme router, qui n'écoute par défaut que sur une URL.

Dans un contexte d'usine à site ou de multi-sites, on a parfois besoin d'écouter sur une URL ainsi que ses sous-domaines. Par exemple :

  • monsite.test
  • fr.monsite.test
  • ...

Attention la syntaxe est différente entre la version 1 et la version 2 de traefik.

Dans mon cas, je définis la variable PROJECT_BASE_URL dans mon fichier .env, mais vous pouvez la substituer avec le nom de domaine en direct.

Traefik 1.*, dans la section labels de votre service « web » (nginx, apache...) :

  1. labels:
  2. - 'traefik.frontend.rule=HostRegexp:{subdomain:[a-z-]+}.${PROJECT_BASE_URL}'

Traefik 2.*, dans la section labels de votre service « web » (nginx, apache...) :

  1. labels:
  2. - "traefik.http.routers.${PROJECT_NAME}_nginx.rule=HostRegexp(`${PROJECT_BASE_URL}`, `{subdomain:[a-z]+}.${PROJECT_BASE_URL}`)"
 

Commentaires

Marc

Posté le Mercredi 13 novembre 2019 - 09:50

J'ajouterais qu'il est oportun d'utiliser les priorités au risque que ton container nginx prenne la main même sur les autres sous-domaines (genre adminer ou portainer)

- "traefik.http.routers.${PROJECT_NAME}_nginx.priority=1"

Et en plus tu peux utiliser mon super hosts updater qui met à jour ton fichier hosts quand tu fais un make up ;)
https://hub.docker.com/r/dankastudio/docker-hosts-updater

Marc

Posté le Mercredi 13 novembre 2019 - 09:51

La suite pour adminer par exemple...

labels:
- "traefik.http.routers.${PROJECT_NAME}_adminer.rule=Host(`adminer.${PROJECT_BASE_URL}`)"
- "traefik.http.routers.${PROJECT_NAME}_adminer.priority=2"

kgaut

Posté le Mercredi 13 novembre 2019 - 10:26

pas mal, mais perso, je mets tous les autres services transverses (adminer, mailhog, portainer...) sur le même sous-domaine pour tous mes projets (ex : mailhog.localhost) comme ça j'ai des marques-pages qui fonctionnent pour tous mes sites. Dans la théorie ça m’empêche de lancer deux projets en simultané mais ça ne m'a jamais gêné. Et on est de toute façon bloqué par le port écouté par traefik (8000 pour moi).

Pour ce qui est des hosts, j'utilise dnsmasq pour rediriger tous les *.test et *.localhost sur ma machine locale, donc pas besoin d'un fichier hosts de 4km de long ! cf : https://kgaut.net/blog/2013/rediriger-automatiquement-un-tld-sur-sa-mac…

Clément

Posté le Jeudi 26 mars 2020 - 15:39

Merci pour ce petit tuto :)
Dès que je met une variable d'environnement dans la rule 'HostRegexp', je vois ça dans l'admin Treafik : HostRegexp(``, `{subdomain:[a-z]+}.`), et il matche n'importe quel domaine.

Je ne comprends pas pourquoi ... ma variable d'environnement existe bien. Est-ce pareil chez vous ?

kgaut

Posté le Jeudi 26 mars 2020 - 20:35

C'est normal car ta regex est :

  1. Treafik : HostRegexp(``, `{subdomain:[a-z]+}.`)

alors que cela devrait être un truc genre :

  1. Treafik : HostRegexp(``, `{subdomain:[a-z]+}.DOMAIN.TLD`)

ou avec une variable d'environnement :

  1. Treafik : HostRegexp(``, `{subdomain:[a-z]+}.${PROJECT_BASE_URL`)

 

 

Clément

Posté le Dimanche 29 mars 2020 - 18:20

Merci pour ta réponse :)
Je me suis mal exprimé, ma regex est : HostRegexp(`${BASE_HOST}`, `{subdomain:[a-z]+}.${BASE_HOST}`). Et quand je vais dans l'admin de traefik, je vois ça : HostRegexp(``, `{subdomain:[a-z]+}.`)
Pourtant, BASE_HOST est bien défini dans mon .env

Clément

Posté le Dimanche 29 mars 2020 - 18:20

Merci pour ta réponse :)
Je me suis mal exprimé, ma regex est : HostRegexp(`${BASE_HOST}`, `{subdomain:[a-z]+}.${BASE_HOST}`). Et quand je vais dans l'admin de traefik, je vois ça : HostRegexp(``, `{subdomain:[a-z]+}.`)
Pourtant, BASE_HOST est bien défini dans mon .env

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...