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.

Dernière modification: 28 octobre 2020

Auteur