(╯°□°)╯︵ uozɐɯɐ - (╯°□°)╯︵ ʞooqǝɔɐɟ - (╯°□°)╯︵ ǝlddɐ - (╯°□°)╯︵ ǝlƃoooƃ
/***************************************************************************************************
* \name Le Blog de NokiDev
* \author Timothé "NokiDev" Van Deputte
* \brief Un blog sur l'infrastructure et le developpement logiciel
* \details Décrit avec asciidoc, construit avec Hugo et hébergé sur Github.
* \note Le code source est disponible sur https://github.com/NokiDev/blog
* Si vous trouvez une coquille ou avez une question n'hésitez pas à créer une Issue :)
***************************************************************************************************/

Utiliser Traefik v2.2 pour auto-héberger votre 1er service.

Lire aussi en : English

Traefik est un reverse proxy moderne, qui s’intègres avec les solutions containeurisées comme docker et kubernetes. Pour cette article, nous allons s’intéresser a son intégration avec docker. Traefik, utilise le socket docker (local ou distant) pour récupérer des informations a propos des containers déployés sur le systême ainsi que les labels qui lui sont accrochés. (Vous pouvez utiliser docker inspect pour avoir une idée des informations a sa disposition).

Cette article demande un minimum de connaissances sur les environnements containeurisés et en particulier docker.

Disclaimer: Cette article n’as pas pour but de sécuriser votre installation, mais seulement vous permettre de commencer à utiliser Traefik et déployer un service. Nous verrons ce sujet dans l’article suivant de cette série

Mettre en place Traefik

Nous allons commencer en utilisant le docker-compose.yml suivant : (Rappel docker-compose.yml permet de décrire ses containers, a la place de la ligne de commande).

version: '3.7'

networks:
  proxy:
    external: true

services:
  traefik:
    image: traefik:v2.2.1
    restart: unless-stopped
    container_name: traefik
    ports:
      - 127.0.0.1:8888:80 # Change 127.0.0.1 by 0.0.0.0 if you try this in a VM / or distant server
      - 127.0.0.1:8080:8080
    environment:
      TZ: "Europe/Paris" # Setting Timezone.
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro # Needed to allow traefik access docker api.
      - /etc/localtime:/etc/localtime:ro # Sharing time with host OS as read only (ro).
      - ./config.yml:/etc/traefik/traefik.yml
    networks:
      - proxy

Comme vous pouvez le voir, il y’a un 'network' proxy qui est référencé dans ce fichier. Il est défini en 'external' car nous voulons que d’autres services puissent l’utiliser. Créer le réseau en externe, a un énorme avantage, celui de pouvoir déployer n’importe quel service, sans que le reverse proxy ne soit déployé (i.e docker-compose up), cela empêchera aussi docker-compose de le supprimer, si vous lancez docker-compose rm.

Pour créer le réseau 'proxy' c’est simple, il suffit d’executé la commande suivante : docker network create proxy

Parlons maintenant du volume de 'config'. Traefik peut être configuré soit par la ligne de commande, soit par des variables d’environnements soit par un fichier de configuration (Appelée static configuration dans la documentation). C’est bien cette dernière que nous allons utiliser ici. Et nous alons la créer maintenant. Je préfère utiliser le format YAML, parce qu’il évite de se répetter entre les sous sections, et que je suis flemmard.

Dans notre config nous allons définir un point d’entrée pour notre proxy (i.e port sur lequel le proxy écoute) et la section du 'provider', docker dans notre cas. Je vous conseille de jeter un petit coup d’oeuil a la documentation et de la modifier en fonction de vos besoins.

global:
  sendAnonymousUsage: false

api:
  dashboard: true ## Enable dashboard visulization on port 8080
ping: {}


providers:
  docker:
    network: proxy
    watch: true
    exposedByDefault: false

entrypoints:
  web: # This name is arbitrary you can name your entrypoint the way you want.
    address: ':80'

Enfin, nous pouvons maintenant déployer Traefik localement en éxecutant docker-compose up -d et vérifier que tout s’est bien passé en allant sur le tableau de bord de traefik disponible sur http://localhost:8080 (ou ip_of_the_machine:exposed_port si vous utilisez une machine virtuelle).

Mise en place de notre service

Le service que nous allons déployé ici, est projectSend. Je l’ai choisi parce qu’il est relativement simple a mettre en place et ne nécessite pas d’autres services pour fonctionner. C’est un projet de la fondation Mozilla qui permet d’envoyer des fichiers d’une personne a une autre.

Nous allons utiliser le docker-compose.yml suivant (Grandement inspiré par celui fait par l’équipe de linuxserver, disponible ici).

version: "3.7"

networks:
  proxy:
    external: true

services:
  projectsend:
    image: linuxserver/projectsend
    restart: unless-stopped
    container_name: projectsend
    environment:
      PUID: 1000
      PGID: 1000
      TZ: Europe/Paris
      MAX_UPLOAD: 5000
    volumes:
      - /etc/localtime:/etc/localtime:ro # Sharing time with host OS as read only (ro).
      - ./config:/config
      - ./data:/data
    ports:
      - 9999:80
    networks:
      - proxy
    labels:
      traefik.enable: true
      traefik.http.routers.projectsend.rule: Host(`127.0.0.1 or ip of your machine`)
      traefik.http.routers.projectsend.entrypoints: web
      traefik.http.services.projectsend.loadbalancer.server.port: 80

Vous avez surement remarqué que nous avons encore une fois déclaré notre réseau 'proxy' et que nous l’avons attaché a notre service (Il ne faut absolument pas l’oublier sinon la communication avec Traefik ne se fera pas.).

Notre service est exposé sur le port 9999 (map 9999:80). Nous allons l’utiliser pour debug, car l’ensemble du traffik devrait passer par Traefik et le service devrais être accessible sur le port 8888.

Bon maintenant jettons un oeil aux dictionnaires de labels. Les labels vont permettre à Traefik de proxyfier les requêtes a notre service. Ce type de configuration s’appelle 'Dynamic Configuration' dans la documentation, et plus précisément il s’agit de configurations dynamique docker. La référence complete peut être étudiée ici.

Dans cette configuration nous demandons à Traefik d’activer la route (car nous avons précisé 'exposedByDefault: false' dans la configuration statique ci-dessus).

Les deux lignes suivantes représentent deux concepts:
  • Les routeurs, qui configurent comment sont traitées et envoyées au service.

  • Les services, qui décrivent comment le service est hébergé et par quel moyen il est possible d’y accéder.

Dans notre cas la configuration est plutôt basique, nous disons au routeur appelé 'projectsend' d’écouter les requêtes provenant du point d’entrée 'web' (défini plus haut). Nous disons ensuite au routeur d’accepter les requêtes qui repecte une règle, et dans notre cas, toutes les requêtes provenant de 127.0.0.1 ou votre ip. Et enfin nous disons a Traefik qu’un service appelé 'projectsend' écoute sur le port 80, ce qui est le port exposé par notre conteneur (Nous n’utilisons pas 9999 car ce port est ouvert sur l’hôte et non dans le conteneur).

Et voila. Avec ces informations Traefik sera capable de transferer les requets venant de traefik:8888 → projectsend:80.

Nous pouvons lancer notre conteneur (docker-compose up -d) et accéder a projectsend soit par localhost:9999 ou bien localhost:8888 qui est Traefik

Félicitation, vous venez d’héberger votre premier service en utilisant Traefik !

Avant de faire des folies, et de rendre disponible quoi que ce soit sur internet, vous devez ajouter un peu de sécurité a tout ça. En particulier, établir une connection sécurisée, celà est d’autant plus vrai si vous voulez héberger des sites non statiques.

Je vous invite a consulter le prochain article de cette série : Secure your Traefik Installation

Je vous suggères également de prendre un peu de temps pour lire la documentation de Traefik, et d’expérimenter en local dans un premier temps.

C’est tout pour cette article, j’epère qu’il était satisfaisant et vous permettera de vous lancer dans l’auto-hébergement.