{{indexmenu_n>38}}
## Comment on utilise Traefik ?
On va reprendre là où on en était resté avec notre [[technique:tech_team:pres_compose|premier fichier Compose]]. On avait alors un serveur web accessible à l'adresse `pica01-test.picasoft.net:8001`, et on voulait plusieurs choses :
- Une URL qui claque un peu plus, genre `quentin.test.picasoft.net`
- Une sécurisation via HTTPS
On a vu dans la [[technique:tech_team:traefik|page sur Traefik]] qu'il fallait utiliser deux outils Docker pour ce faire : les **labels** et les **réseaux**.
### Labels Docker
Les labels sont des simples éléments clé-valeur attaché à un conteneur. Il en existe pas mal de base, même sans avoir à en rajouter. La commande `docker inspect` me permet de les voir :
```
docker inspect quentin
[...]
"Labels": {
"com.docker.compose.config-hash": "5a156a0c24e4cd4fefc3b4fb1e35608826ecb6a72de130d7d1b03029f9ab363e",
"com.docker.compose.container-number": "1",
"com.docker.compose.oneoff": "False",
"com.docker.compose.project": "qduchemi",
"com.docker.compose.project.config_files": "docker-compose.yml",
"com.docker.compose.project.working_dir": "/home/users/qduchemi",
"com.docker.compose.service": "quentin",
"com.docker.compose.version": "1.27.3"
}
[...]
```
On voit que Compose a déjà ajouté plein de labels sans qu'on ne s'en rende compte.
Traefik surveille en permanence les nouveaux conteneurs et se sert de leurs labels pour savoir s'il doit les prendre en compte, et que faire d'eux. En particulier, Traefik a besoin de trois informations essentielles :
- À quelle URL répond le conteneur ?
- Quel est le port du conteneur sur lequel envoyer les requêtes qui lui sont destinées ?
- Faut-il activer le HTTPS sur le conteneur (_i.e._ déclencher automatiquement la procédure de certification...) ?
On voit ça juste après.
### Réseaux Docker
Les réseaux Docker ne sont pas très différents des réseaux classiques : ils permettent à des conteneurs de communiquer entre eux (ou au contraire, d'être isolés).
Prenons cet exemple :
{{ :technique:tech_team:networks_docker.png |}}
Mattermost et sa base de données sont isolés au sein d'un même réseau, comme Etherpad et sa base de données. Chaque application peut communiquer avec sa base de données, mais il est impossible de communiquer entre la base de données de Mattermost et celle d'Etherpad.
Ça a du sens, notamment en cas de compromission, puisque la base de données de Mattermost n'a aucune raison de parler à celle d'Etherpad. On limite ainsi la casse d'une faille de sécurité potentielle.
Traefik agit comme un reverse proxy pour les services web ; il a donc besoin d'être dans le même réseau qu'eux. Un conteneur peut être dans plusieurs réseaux. La situation ressemblait alors à ceci :
{{ :technique:tech_team:networks_docker_traefik.png |}}
Or par défaut, tous les conteneurs d'un fichier Compose sont dans leur propre réseau. Il faut donc les rajouter au réseau de Traefik.
Ce réseau s'appelle `proxy`, c'est fixé et ça ne bougera plus.
S'assurer que Traefik est bien lancé sur la machine de test :
```
cd /DATA/docker/services/traefik
docker-compose up -d
```
Ici, on commence à toucher à la manière dont Picasoft gère ses services, on ne rentre pas dans les détails, il y a une [[technique:docker:picasoft:dockerfiles|section dédiée]].
Au niveau de notre dernier fichier Compose, ça se traduit par ceci :
```yaml
networks:
proxy:
external: true
services:
quentin:
[...]
networks:
- proxy
```
On indique qu'on veut utiliser un réseau Docker qui existe par ailleurs (d'où le `external: true`), et on indique que notre service participe à ce réseau.
### Alors, comment on fait ?
Il existe déjà une [[technique:docker:good_practices:traefik|page qui résume l'utilisation de Traefik]] sur le wiki, tu peux aller la lire si tu veux!
Le point noir, c'est que les labels sont compliqués à comprendre, et qu'on ne peut pas les expliquer sans rentrer profondément dans les [détails de Traefik](https://doc.traefik.io/traefik/routing/overview/). Alors, on va juste se dire que « c'est comme ça ».
Et on reprend notre exemple. Pour rappel, on avait un serveur web qui tournait sur `pica01-test.picasoft.net:8081` grâce au fichier Compose suivant :
```yaml
version: "3.7"
services:
quentin:
image: nginx:quentin
container_name: quentin
ports:
- 8081:80
volumes:
- ./website:/var/www/html
```
On va donc ajouter `quentin` dans le réseau `proxy`, lui indiquer qu'on veut répondre à l'adresse `quentin.test.picasoft.net`, rediriger vers le port 80 du conteneur et activer HTTPS. Le fichier final est comme suit :
```yaml
version: "3.7"
networks:
proxy:
external: true
services:
quentin:
image: nginx:quentin
container_name: quentin
networks:
- proxy
labels:
traefik.enable: true
traefik.http.routers.quentin.entrypoints: websecure
traefik.http.routers.quentin.rule: Host(`quentin.test.picasoft.net`)
traefik.http.services.quentin.loadbalancer.server.port: 80
volumes:
- ./website:/var/www/html
```
On a supprimé le mapping de port entre l'hôte et le conteneur, puisque désormais c'est Traefik qui s'occupe de tout !
### Let's go !
{{ :technique:tech_team:traefik_https.gif |}}
On constate deux choses :
- Le conteneur est accessible via sa propre URL, qui donne beaucoup plus envie que celle composée du nom de la machine et du port.
- Cette fois ci, un `curl` simple renvoie un code HTTP 302 (`Moved Permanently`). Si on demande à `curl` de suivre les redirections (`-L`), on arrive à la bonne page.
Pourquoi cette redirection ?
C'est lié à la ligne :
```
traefik.http.routers.quentin.entrypoints: websecure
```
Qui indique à Traefik que tout ce qui arrive à destination de ce conteneur doit passer par le point d'entrée `websecure`, c'est-à-dire par HTTPS dans notre configuration.
Or quand on fait un `curl quentin.test.picasoft.net`, Traefik reçoit la requête sur le port 80. HTTPS est sur le port 443, alors il nous renvoie une redirection qui veut dire « reviens sur le port 443 et on pourra parler de manière sécurisée.
Toute l'opération de certification pour activer HTTPS s'est faite automatiquement et en quelques secondes ! C'est vraiment pratique, car gérer les certificats à la main et pour chaque service est long et sujet aux erreurs. Ici, il suffit d'ajouter trois labels et Traefik gère tout pour nous, y compris le renouvellement des certificats.
### Pour la curiosité...
C'est difficile d'y accéder pour des raisons de sécurité, mais sache qu'il existe un joli [[technique:adminserv:traefik:dashboard|tableau de bord]] permettant d'y voir plus clair sur ce qu'il se passe avec Traefik. :-)
### Et maintenant ?
Bon, et bien à ce stade, tu as absolument toutes les bases pour lancer un service Picasoft ! Construire une image Docker, comprendre les réseaux, les ports et les volumes, utiliser Compose et enfin mettre le service sur internet grâce à Traefik. ^_^
Alors peut-être qu'on peut rentrer dans le bain en [[technique:tech_team:etherpad|mettant à jour Etherpad ?]] Et enfin, on verra les détails qui manquent pour [[technique:tech_team:new_service|créer pour de vrai un service Picasoft]] !