Objectif
Générer des certificats Let’s Enscrypt depuis Traefik 2.3
Préambule
J’ai connu Traefik grâce à la chaîne Xavki, avant de m’essayer à Traefik, j’utilisais Nginx pour faire du Reverse Proxy sur mes conteneurs Docker.
Je trouve que Traefik simplifie grandement la mise en place d’un Reverse Proxy.
Si vous souhaitez en savoir plus, Xavki a mis en ligne, récemment, une playlist assez complète au sujet de Traefik. Découvrir la playlist…
Tutoriel
Arborescence
J’utilise Traefik avec Docker et plus précisément avec Docker Compose. Commençons par créer un dossier dans lequel nous allons travailler :
mkdir traefik && cd traefik
Dans ce dossier, nous allons créer les dossiers pour les volumes persistants de notre conteneur Docker :
mkdir -p src/data src/log
Conteneur Traefik
Fichier de configuration : docker-compose.yml
A la racine de notre projet (dossier traefik), nous allons créer un fichier docker-compose.yml
contenant :
version: '3'
services:
traefik:
image: "traefik:v2.3"
ports:
- 80:80
- 443:443
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./src/data:/etc/traefik
- ./src/log:/var/log/traefik
networks:
- myglobalnetwork
networks:
myglobalnetwork:
external:
name: myglobalnetwork
Dans ce fichier, on remarque qu’un réseau externe est utilisée, lorsque la commande docker-compose up -d
sera lancée, vous aurez une erreur car le réseau n’existe pas dans Docker, pour ce faire, lancer cette commande :
docker network create --driver=bridge --attachable --internal=false myglobalnetwork
J’utilise un réseau global car je sépare mes projets par dossier. Cela permet une meilleure organisation et cela permet à Traefik d’avoir un réseau commun avec les projets qui utilise Traefik.
Fichier de configuration : traefik.toml
Pour paramétrer Traefik, il y a plusieurs possibilités qui sont référencées dans la documentation : Lien vers la documentation
Pour ma part, j’utilise le fichier traefik.toml
. Ce fichier doit être créé dans le dossier data
de notre projet.
Voici ce qu’il doit contenir :
[api]
insecure = true
dashboard = true
[providers]
[providers.docker]
exposedByDefault = false
network = "myglobalnetwork"
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.websecure]
address = ":443"
[log]
filePath = "/var/log/traefik/traefik.log"
level = "DEBUG"
[accessLog]
filePath = "/var/log/traefik/access.log"
[certificatesResolvers]
[certificatesResolvers.le-resolver]
[certificatesResolvers.le-resolver.acme]
email = "[email protected]"
storage = "/etc/traefik/acme.json"
[certificatesResolvers.le-resolver.acme.tlsChallenge]
Voici quelques précisions sur le fichier de configuration :
- On active l’API et le mode non sécurisé, ceci n’est pas recommandé dans un environnement de production, lien vers la documentation
- On utilise le
provider
Docker, lien vers la documentation - On définit 2
entrypoints
, un premier nomméweb
qui écoute le port 80 et un second nomméwebsecure
qui écoute le port 443. - On active les logs en mode
debug
avec le chemin vers le fichier, lien vers la documentation - On active les logs d’accès avec le chemin vers le fichier, lien vers la documentation
- Le dernier bloc concerne la génération des certificats que j’ai nommé
le-resolver
pour Let’s Enscrypt Resolver, lien vers la documentation
Les fichiers de logs sont situés dans le volume persistant que nous avons renseignés dans le docker-compose.yml
.
N’oubliez pas de remplacer [email protected]
par votre adresse email.
Build et lancement
Pour terminer cette partie, lancer la commande ci-dessous pour construire et lancer le conteneur Traefik :
docker-compose up -d
Résultat
Vous pouvez visualiser le dashboard en lançant votre navigateur à l’adresse : http://votre-nom-de-domaine-public.com:8080/
Conteneur Nginx
Pour tester la génération d’un certificat, nous allons utiliser un conteneur Nginx. Pour ce faire, nous allons créer un autre dossier nommé nginx
au même niveau que le dossier traefik
.
Fichier de configuration : docker-compose.yml
A la racine de notre projet (dossier nginx), nous allons créer un fichier docker-compose.yml
contenant :
version: '3'
services:
nginx:
image: "nginx:1.19"
expose:
- 80
networks:
- myglobalnetwork
networks:
myglobalnetwork:
external:
name: myglobalnetwork
On assigne au conteneur le même réseau externe que celui assigné au conteneur Traefik.
Si on lance les commandes docker-compose up -d
, le conteneur NGINX ne travaillera pas avec le conteneur Traefik. Pour corriger cela, il faut ajouter un bloc labels
dans le fichier docker-compose.yml
:
labels:
- "traefik.enable=true"
- "traefik.http.routers.to-nginx.rule=Host(`votre-nom-de-domaine-public.com`)"
- "traefik.http.routers.to-nginx.tls=true"
- "traefik.http.routers.to-nginx.tls.certresolver=le-resolver"
Le bloc doit être ajouté au même niveau que les blocs image
, container_name
…
Le bloc active Traefik pour le conteneur. Pour accéder à la page Web du conteneur, nous demandons la création d’un routeur nommé to-nginx
et nous y accéderons depuis l’adresse votre-nom-de-domaine-public.com
.
Nous avons également 2 lignes supplémentaires pour activer le TLS, en utilisant le resolver le-resolver
que nous avons créé dans le fichier traefik.toml
.
Build et lancement
Pour terminer cette partie, lancer la commande ci-dessous pour construire et lancer le conteneur Nginx :
docker-compose up -d
Résultat
Vous pouvez visualiser la page en lançant votre navigateur à l’adresse : https://votre-nom-de-domaine-public.com/
Tutoriel publié le 25/10/2020.