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

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...) :

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

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

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

Commentaires

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

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"

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…

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 ?

C'est normal car ta regex est :


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

alors que cela devrait être un truc genre :


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

ou avec une variable d'environnement :


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

 

 

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

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é
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...