Traefik est un Edge Router (pour obtenir toutes les informations qu'il propose, vous pouvez consulter la documentation). En gros, cela signifie qu'il écoute tout le trafic entrant sur un serveur particulier et l'envoie ensuite à différents endroits.

Il possède de nombreuses fonctionnalités, dont certaines dont je ne parlerai pas encore, mais il m'aide à faire des choses localement ou à les mettre en production de différentes manières dont nous allons parler.

Pourquoi auriez-vous besoin d'un routeur de périphérie ?

Les adresses sur un serveur

En tant qu'utilisateur, vous avez l'habitude de taper un nom pour accéder au site web que vous voulez voir (comme https://google.com). Toutefois, ce n'est pas ainsi qu'Internet vous donnera le numéro de l'appartement que vous cherchez à atteindre. Il vous indiquera principalement quel bâtiment le contiendra. Lorsque vous recherchez un nom, certains serveurs de Domain Name System traduisent le texte en une adresse IP réelle. Vous savez donc maintenant où se trouve l'immeuble et comment vous rendre au bon appartement ?

C'est là que le routeur de bord va, plus ou moins, fonctionner comme un valet de chambre. Lorsque vous arrivez dans le bon immeuble et que vous demandez le numéro de l'appartement avec le nom de l'endroit que vous essayez de rejoindre, il vous donne la destination précise.

Dépensez moins d'argent !

Si vous avez besoin de plusieurs sites web (relatifs aux appartements dont nous venons de parler), il est plus abordable de louer un immeuble ! Si l'immeuble n'a qu'une adresse générale, il vous faudra juste quelqu'un à l'entrée qui pourra dire aux gens à quel étage et à quel numéro d'appartement ils doivent se rendre.

Comment cela fonctionne-t-il ?

Lorsque vous utilisez un serveur avec une seule adresse IP à laquelle vous voulez envoyer plusieurs adresses, l'idée est de faire lire à quelqu'un tous les messages qui arrivent dans l'immeuble et de les distribuer aux bons endroits à l'intérieur de celui-ci.

C'est pourquoi notre serveur va écouter tout ce qui arrive par ses ports 80 et 443 directement par Traefik. Voici les itinéraires par lesquels les messages arriveront dans notre bâtiment. Il lira ensuite le nom réel qui a été demandé et enverra le message à la bonne boîte aux lettres.

Passons aux aspects techniques

C'est la façon générale dont je pense à ce genre de choses. Voyons comment nous mettons cela en place techniquement.

Tout d'abord, l'essentiel pour nous est que la plupart de nos projets se dérouleront sur des conteneurs Docker (c'est un petit type de machine virtuelle dont nous parlerons bientôt). Ceux-ci représenteront les appartements de notre bâtiment. Le voiturier, Traefik, fonctionnera également à l'intérieur d'un conteneur Docker.

Cela signifie que tout le trafic principal devra d'abord passer devant lui. Pour ce faire, nous mettrons en place une configuration "docker-composite" qui garantira que tous les messages provenant du port 80 ou 443 lui parviendront en premier :

version: "3"

services:
  traefik:  
    image: traefik:1.7
    restart: always
    ports:
      - 80:80      
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.toml:/traefik.toml
    networks:
      - web
    labels:
      - traefik.enable=true
      - traefik.backend=traefik
      - traefik.frontend.rule=Host:traefik.mywebsite.org
      - traefik.frontend.protocol=https
      - traefik.frontend.redirect.entryPoint=https
      - traefik.frontend.headers.SSLRedirect=true
      - traefik.frontend.auth.basic=me@email.com:$$apr1$$efgdfegdf$$fbfdggdfgdfgdfz.
      - traefik.port=8080

networks:
  web:
    external: true 

Quelques choses à voir ici. Les ports 80 et 443 du conteneur de docker sont liés à ceux du serveur. Cela signifie que tout ce qui arrive de ces ports sur le serveur sera envoyé au conteneur de docker Traefik.

Ensuite, il y a les réseaux, cela nous permettra de créer des réseaux virtuels à l'intérieur du serveur pour permettre à plusieurs conteneurs de dockers différents de se parler sans être entendus par tout le monde.

Enfin, il y a quelques étiquettes intéressantes. En gros, elles indiquent à Traefik comment transférer les messages. C'est pourquoi nous pouvons nous demander pourquoi nous le faisons parler à lui-même.

Traefik a un backend !

Il y a une page web qui vous montrera ce que Traefik fait et s'il y a des erreurs ou des avertissements qui l'empêchent de faire son travail. Par défaut, elle fonctionne à l'intérieur du conteneur sur le port 8080. Cela signifie que lorsque vous l'exécutez localement, vous pourrez l'atteindre via "localhost:8080" dans votre navigateur. Cependant, comme c'est son travail de définir et de pointer vers les adresses, faisons-lui faire cela par lui-même.

Examinons donc de plus près les étiquettes que nous venons de voir :

- traefik.enable=true
- traefik.backend=traefik
- traefik.frontend.rule=Host:traefik.mywebsite.org
- traefik.frontend.protocol=https
- traefik.frontend.redirect.entryPoint=https
- traefik.frontend.headers.SSLRedirect=vrai
- traefik.frontend.auth.basic=me@email.com:$$apr1$$efgdfegdf$$fbfdggdfgdfgdfz.
- traefik.port=8080

La première consiste à dire à Traefik de commencer à jeter un coup d'œil sur ce conteneur Docker. La ligne suivante consiste à définir le nom du backend que nous voulons montrer.

Les trois suivantes définiront l'url qui nous permettra d'y accéder et définiront le protocole que nous voulons utiliser. Aujourd'hui, nous voulons bien sûr utiliser "HTTPS" pour ajouter un peu de sécurité. C'est aussi pourquoi nous redirigerons automatiquement tout le trafic HTTP vers HTTPS.

Le label "traefik.frontend.auth.basic" est important. Le tableau de bord contiendra un grand nombre d'informations sensibles et nous ne voulons donc pas qu'elles soient visibles par tout le monde. Ce label vous obligera à entrer un nom d'utilisateur et un mot de passe avant de pouvoir accéder au tableau de bord. Si vous avez déjà utilisé les fichiers Apache .htpasswd dans le passé, c'est un peu la même chose. La seule chose que vous devez garder à l'esprit est que le mot de passe dans l'étiquette a besoin de doubles signes $ (ce qui, je pense, est dû à la façon dont le langage Go les interprète mais je n'ai pas vraiment regardé, désolé). Sous Linux, pour créer un utilisateur et un mot de passe, vous pouvez utiliser l'outil CLI htpasswd :

htpasswd -nb motdepasse utilisateur

Si vous voulez le mettre au format correct pour les étiquettes Traefik, vous pouvez utiliser sed :

htpasswd -nb motdepasse utilisateur | sed -s "s/[$]/&&/g

Enfin, il y a la partie importante concernant le port. Si les éléments que vous voulez montrer ne se trouvent pas sur le port 80 à l'intérieur de votre conteneur, vous pouvez définir le port qu'il utilise ici afin que Traefik redirige le trafic du port 80 ou 443 vers celui-ci.

Le futur (déjà parmi nous)

Il m'a fallu une éternité pour terminer l'écriture de ce texte et Traefik a avancé avec sa deuxième version. Cependant, migrer de la V1 à la V2 peut être assez ennuyeux et faire baisser un peu vos sites changera les étiquettes sur chacun des conteneurs Docker qui les servent.

Bientôt, j'écrirai un peu plus sur la deuxième version et j'expliquerai pourquoi il était vraiment ennuyeux de migrer à l'époque et comment la V2.2 a beaucoup aidé.

J'expliquerai également comment et pourquoi j'utilise Traefik localement pour tous mes différents projets afin d'éviter de devoir tout faire tourner sur localhost avec de nombreux ports différents, ce qui me fait oublier comment accéder à un projet spécifique.

Merci pour votre lecture !