Parce qu'il y a toujours une solution...

Traefik est un reverse-proxy et load-balancer HTTP et TCP open-source. La gestion des certificats SSL est aussi de la partie et est "auto-gérée", soit par Let's Encrypt ou manuellement.
Pas de blabla, voyez plutôt la définition officielle :

An open-source reverse proxy and load balancer for HTTP and TCP-based  applications that is easy, dynamic, automatic, fast, full-featured,  production proven, provides metrics, and integrates with every major  cluster technology...

Article mis à jour et corrigé par ldez. (merci !)

Quelques éléments de compréhension

La configuration de Traefik peut être fournit de 3 façons différentes :

  • "file" (format TOML ou YAML)
  • "CLI flags" (recommandé)
  • "env vars" (déconseillé)

De nombreuses options sont disponibles et bien documentées sur le site officiel à cette adresse.

/// Reprise du commentaire de ldez, mainteneur de la solution Traefik - un grand merci pour toutes les corrections apportées et les informations complémentaires !!

Qu'est ce que la configuration statique ?

C'est l'ensemble des options utilisées au démarrage de Traefik, ces options concernent principalement les informations de connections vers les providers, les systèmes de tracing et outils de métriques.

Ces options peut être définie de 3 façons différentes :

  • avec un fichier (c'est le traefik.toml) au format TOML ou YAML
  • avec des paramètres de ligne de commandes (CLI flags)
  • avec des variables d'environnement (déconseillé)

Il n'est possible que d'utiliser 1 seule source à la fois (donc soit le fichier, soit la ligne de commandes).

La configuration statique (quelque soit sa source (file, flags, env vars)) n'est lu qu'une seule et unique fois, lors du démarrage de Traefik.
Il n'est pas possible de définir le routage (routers, services, middlewares, configuration TLS) dans la configuration statique.

Qu'est ce que la configuration dynamique ?

C'est l'ensemble de options utilisées pour définir le routage. Cela permet de définir les routers, les services, les middlewares, et la configuration TLS.

Cette configuration peut être définie de différentes façons :

  • avec un ou des fichiers (provider file) au format TOML ou YAML, sans lien avec le contenu du fichier traefik.toml
  • avec des labels (provider Docker, Rancher, ...)
  • avec des Ingress ou des CRD propre à Traefik (Kubernetes)
  • via des données stockées dans un KV store (disponible dans la prochaine version v2.2)

Toutes ces sources de configuration dynamique peuvent être utilisées en même temps. La configuration dynamique peut être modifiée pendant l’exécution de Traefik sans avoir besoin de redémarrer (grâce à la ligne "watch = true").

Dans  le cas de tous les providers (sauf le provider file), cette configuration est automatiquement reconstruite et mise à jour (sans rechargement) dès qu'un changement est détecté (ajout/suppression/modification d'un container).


Docker-compose pour Traefik 2

L'idée ici est d'avoir un conteneur Traefik ingurgitant les requêtes et les rediriger en fonction de la demande.

Étapes préliminaires

  • Créer les dossiers où seront stocker le conteneur traefik et ses fichiers. Pour l'exemple, j'utiliserai /srv/docker/traefik pour le fichier docker-compose et /srv/docker/traefik/conf pour les autres fichiers.
  • Créer les fichiers et y attribuer les droits nécessaires.
sudo mkdir -p /srv/docker/traefik/conf
sudo touch /srv/docker/traefik/conf/acme.json
sudo touch /srv/docker/traefik/conf/traefik.toml
sudo chmod 0600 /srv/docker/traefik/conf/acme.json

Ci-dessous une configuration pour Traefik v2, avec son fichier de configuration "traefik.toml" et son fichier "acme.json" pour les certificats Let's Encrypt - J'ai préalablement créé un nouveau réseau docker intitulé "oueb", que vous pouvez créer via la commande "docker network create oueb".

version: '3.7'
services:
  traefik:
    image: traefik:chevrotin
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./conf/traefik.toml:/traefik.toml
      - ./conf/acme.json:/acme.json
    networks:
      - oueb
      
networks:
  oueb:
    driver: bridge
(traefik) docker-compose.yml

Le fichier "traefik.toml" correspond aux options de démarrage pour Traefik. Actuellement, je vous propose un fichier relativement simple, permettant 2 points d'entrées (80 & 443), des logs, accéder au réseau où se trouve vos autres conteneurs et l'accès au tableau de bord Traefik :

[global]
  sendAnonymousUsage = false

[log]
  level = "INFO"
  format = "common"

[providers]
  [providers.docker]
    endpoint = "unix:///var/run/docker.sock"
    watch = true
    exposedByDefault = true
    swarmMode = false

[api]
  dashboard = true
  debug = false
  insecure = true

[entryPoints]
  [entryPoints.insecure]
    address = ":80"
  [entryPoints.secure]
    address = ":443"
Contenu du fichier traefik.toml

A partir de cet instant, traefik est exploitable et peut être lancé via un "docker-compose up -d".


Utiliser Let's Encrypt pour vos conteneurs

Traefik est capable de gérer automatiquement les certificats SSL nécessaires pour le HTTPS sur/vers vos conteneurs. Une documentation est disponible sur le site officiel de Traefik ici.

Pour la documentation, je vais configurer Let's Encrypt pour qu'il puisse me fournir des certificats SSL gratuits :

[certificatesResolvers.letsencrypt.acme]
  email = "contact@computerz.solutions"
  storage = "acme.json"
  caServer = "https://acme-v02.api.letsencrypt.org/directory"
  keyType = "EC256"
  [certificatesResolvers.letsencrypt.acme.httpChallenge]
    entryPoint = "http"
contenu du fichier traefik.toml

Cette configuration est relativement simple mais fonctionnelle ; vous devez ajouter ces blocs de code dans votre fichier traefik.toml, à la suite des autres blocs.

Maintenant que Traefik est en place, faites un "docker-compose up -d" pour lancer le conteneur. Dans le fichier de configuration .toml, une rubrique "[api]" a été saisie : vous pourrez accéder au tableau de bord via l’URL "http://ip-or-dns:8080". Cette configuration n'est pas optimale ni sécurisée (pas de mot de passe pour accéder à l'interface, mais il n'y a pas de possibilité de configurer quoi que ce soit via l'interface web).

Bienvenue sur votre Traefik ! Ne reste plus maintenant qu'à configurer vos services pour être accessibles, avoir une configuration fine du HTTPS, puis explorer les possibilités TCP... !


Passer un service derrière Traefik sans HTTPS

C'est mignon d'avoir votre Traefik mais maintenant il faut configurer les services qui seront "derrières". Pour chaque service que vous souhaitez "reversé", saisissez ces labels :

    labels:
      - traefik.enable=true
      - traefik.http.routers.NOM-SERVICE.rule=Host(`NOM-SERVICE.NDD`)
      - traefik.http.routers.NOM-SERVICE.entryPoints=insecure     

Il s'agit là du strict minimum pour faire fonctionner un service derrière Traefik. Remplacez donc "NOM-SERVICE" par ce que vous souhaitez et "NOM-SERVICE.NDD" aussi. Le label "entryPoints=insecure" correspond à la configuration du bloc "entrypoints" dans le "traefik.toml", pour le coup sur le port 80.


Passer un service derrière Traefik avec HTTPS

Là c'est plus lourd. Plusieurs méthodes sont disponibles - ce que je vous partage en dessous fonctionne avec toute la doc' entièrement saisie ici. La configuration est statique, c'est-à-dire qu'il faut re-saisir ces blocs et les adapter pour tout vos services.

    labels:
      - traefik.http.routers.NOM-SERVICE-http.entrypoints=insecure
      - traefik.http.routers.NOM-SERVICE-http.rule=Host(`NOM-SERVICE.NDD`)
      
      - traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
      - traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
      - traefik.http.routers.NOM-SERVICE-http.middlewares=https-redirect@docker
      
      - traefik.http.routers.NOM-SERVICE-https.entrypoints=secure
      - traefik.http.routers.NOM-SERVICE-https.rule=Host(`NOM-SERVICE.NDD`)
      - traefik.http.routers.NOM-SERVICE-https.tls=true
      - traefik.http.routers.NOM-SERVICE-https.tls.certresolver=letsencrypt

Dans l'ordre :

  1. Les premiers labels "routers" correspondent à la mise en place de Traefik pour du HTTP, basique.
  2. On crée le middleware (l'opération) pour transformer/rediriger le HTTP automatiquement vers le HTTPS.
  3. Mise en place des labels "routers" pour le HTTPS (sensiblement la même chose que du HTTP)
  4. On termine par l'appel de l'applet "letsencrypt" pour avoir un certificat SSL gratuit et valide, auto-géré par Traefik.

Relancez vos services/conteneurs Docker et vous voilà désormais avec des services derrière Traefik et sous HTTPS/Let's Encrypt !