Installez le Reverse Proxy Traefik :Partie 2

De retour pour la suite. Un petit rappel en dessous de la partie 1 :

Bon, à ce stade, avant de lancer le conteneur Traefik, il faut s'assurer de plusieurs étapes :
- Créer une règle de NAT pour Traefik sur son routeur pare-feu, ici en l'occurrence, il s'agit ici de Pfsense. Le principe suit la même logique sur d'autres instances.
- Avoir un nom de domaine public.
- Soit posséder une IP fixe ou si L'IP est dynamique, il faudra utiliser un prestataire de DNS dynamique.
Traefik va utiliser le port 443 (https) et uniquement le port 443, puisque la demande de certificats "Let's Encrypt" est réalisé avec le protocole TLS. (Voir le fichier "compose.yml")
Dans mon exemple ci-dessous, j’effectue la démonstration sur les deux ports http et https :

Pour le domaine, j'ai acheté celui-ci chez Ovh car il coûte moins de 3 euros l'année. Je gère le DNS de ce domaine chez "Cloudflare". Mon opérateur est Free, j'ai une IP fixe en "Fullstack"
Avant de continuer, je vous invite à consulter les trois notes suivantes :



Si toutes les étapes citées 1,2 et 3 sont ok, on peut continuer !
On va faire juste un aparté sur la façon dont les certificats « Let's Encrypt » peuvent être importés par Traefik.
J’ai indiqué que j'utilisais le protocole Acmé "ChallengeTLS" mais ils existent d'autre façon d'obtenir ces certificats.
-
La validation DNS: "DNS-01 challenge" correspond à : <acme-challenge.mondomaine.com>, Vous devez prouver que vous êtes le propriétaire du nom de domaine en enregistrant un fichier TXT spécifique sur la zone DNS de votre Registrar...un peu long à mettre en place.
-
La validation Http: "HTTP-01 challenge" correspond à :<acme-challenge "http">, ce mode utilise le port 80 http pour ennoyer un jeton au client "acme « sur votre serveur web à l’adresse http://<YOUR_DOMAIN>/.well-known/acme-challenge/
...(Je vous met le lien en dessous c'est très bien expliqué) -
La validation Https: "TLS-ALPN-01" correspond à: <acme.tlsChallenge>
C'est identique au "HTTP-01 challenge" sauf le port utilisé est le port Secure 443. C'est celui que j'utilise. (Attention, certains serveurs ne sont pas compatibles) de mon côté je n'ai aucun problème !

Nous voici donc avec notre fichier "compose.yml" prêt !
version: '3'
services:
traefik:
image: traefik:v2.4.8
container_name: traefik
restart: unless-stopped
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.file.directory=/etc/traefik/dynamic-conf"
- "--providers.file.watch=true"
- "--api.dashboard=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--certificatesResolvers.letsencrypt.acme.email=email@exemple.tld"
- "--certificatesResolvers.letsencrypt.acme.storage=acme.json"
- "--certificatesResolvers.letsencrypt.acme.tlsChallenge=true"
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.exemple.tld`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.entrypoints=websecure"
- "traefik.http.routers.dashboard.middlewares=auth-dashboard"
- "traefik.http.middlewares.auth-dashboard.basicauth.users=admin:
$$xxxxxxxxx$$xxjjgfy"
- "traefik.http.routers.dashboard.tls=true"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
networks:
- traefik_net
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- $PWD/acme.json:/acme.json
- $PWD:/etc/traefik:ro
networks:
traefik_net:
external: true
Je vous le met ici en pdf:
On y va, on lance la commande de déploiement du conteneur de n'importe où :
# docker compose -f /opt/traefik/compose.yml up -d
Si tout s'est bien passé, vous devriez pouvoir vous connecter au tableau de bord via le nom de domaine avec son certificat "Let’s Encrypt"
https://traefik.mondomaine.com
Vous allez avoir une fenêtre pop ‘up qui s'ouvre pour renseigner l'identifiant et mot de passe (celui que vous avez choisi au début)
Enfin, le tableau de bord de Traefik s’ouvre :
Si vous avez un échec :
-
Vérifier dans votre fichier "compose.yml"
-
Les chemins des répertoires et surtout le fichier acme.json
Vous pouvez aller visualiser le fichier, s'il est vide, il y a un problème ! -
L'adresse du sous domaine attribué à Traefik.
-
La règle de nat dans votre routeur.
-
L’IP de Traefik correspond bien à cette règle?
Pour l'instant de votre côté, vous devez avoir que les "routeurs" et services de Traefik:
- 2 "routeurs" pour Traefik
- 3 "services" pour Traefik
- 1 "service" Pour Docker
C’est ici que le fichier « config.yaml » va rentrer en action !
On va éditer ce fichier :
# nano /opt/traefik/traefik-dynamic/config.yaml
# As YAML Configuration File
http:
routers:
router-vaultwarden:
service: service-vaultwarden
middlewares:
- middleware-authelia-auth
rule: "Host(`rzopass.rzo.ovh`)"
tls:
certResolver: "letsencrypt"
domains:
- main: "rzopass.rzo.ovh"
router-seafile:
service: service-seafile
rule: "Host(`fichiers.rzo.ovh`)"
tls:
certResolver: "letsencrypt"
domains:
- main: "fichiers.rzo.ovh"
middlewares:
middleware-authelia-auth:
forwardAuth:
address: "http://10.0.0.102:9091/api/verify?rd=https://authelia.rzo.ovh"
trustForwardHeader: true
services:
service-vaultwarden:
loadBalancer:
servers:
- url: "http://10.0.0.135:8000"
service-seafile:
loadBalancer:
servers:
- url: "http://10.0.0.27:8084"
On va faire abstraction du Middleware "Authelia", je ferais une note dessus prochainement. Sachez que c'est un portail d'authentification et d’identification sophistiqué.
Vous avez donc dans ce fichier, deux exemples d'applications qu'on souhaite connecter à internet :
- Vaultwarden qui est un gestionnaire de mot de passe.
- Seafile : Un serveur qui synchronise vos fichiers en ligne.
Vous devez déclarer le routeur correspondant.
Exemple pour Seafile:
-
La section "routers"
On indique de quel routeur il s’agit :
Le routeur seafile
-router-seafile
Qui correspond au service :
-service-seafile
On lui indique le sous domaine utilisé :
-"fichiers.rzo.ovh"
On lui indique qu’un certificat "Let's Encrypt" doit être généré
-certResolver: "letsencrypt" (letsencrypt est le nom du résolveur)
*Enfin, on lui indique qu'il doit l'appliquer sur le sous-domaine correspondant :
-domains: main : "fichiers.rzo.ovh" -
La section "services"
On a indiqué dans la partie routeur le service correspondant à Seafile
-Le service est en fait le nom du conteneur Docker de l'application
-Son emplacement : son IP locale et le port qu'il utilise dans Dokcer
-Le load balencer indique le fait que Traefik doit répartir la charge entre chaque application.
L'inscription de toutes vos applications se fera de façon identique comme les exemples de ce fichier. Je rappelle que Traefik écoute sur le « sock » (le port) de Docker. Il détectera à chaud les informations que vous lui indiquez ici, car il se situe dans le répertoire dynamique declaré dans le docker-compose.
Attention, ce fichier est extrêmement sensible à l'indentation(rappel)
Positionnez correctement vos éléments comme l'exemple ci-dessus.
Pour voir le résultat, il suffit de vous connecter à votre application, Si cela ne marche pas, vérifiez l'état sur le tableau de bord de Traefik.