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