Aller au contenu

Traefik

Traefik est un reverse proxy/répartiteur de charge, OpenSource et gratuit.

Configuration de Traefik :

Configuration statique

Fonctionnement de traefik dans un cas simple : lien doc

Un conteneur Traefik écoute /var/run/docker.sock, afin de récupérer les événements docker.

traefikCompose.yml
version: '3'

services:
  reverse-proxy:
    # image officiel docker
    image: traefik:v2.5
    # Activer l'interface web : "--api.insecure=true"; Traefik écoute docker "--providers.docker"
    command: --api.insecure=true --providers.docker
    ports:
      # Port HTTP
      - "80:80"
      # Interface web (activer par --api.insecure=true)
      - "8080:8080"
    volumes:
      # Pour que Traefik ecoute les evenement docker
      - /var/run/docker.sock:/var/run/docker.sock

Un conteneur pour faire fonctionner pour tester le reverse proxy (par exemple un simple serveur web) :

httpd.yml
version: "3.9"
services:
  web:
    image: httpd
    labels:
      - "traefik.http.routers.whoami.rule=Host(`test.rocheralexandre.com`)"

Test du load balancer

  • docker-compose scale web=4

loadbalancer

Traefik avec l'HTTPS/TLS

L'exercice se compose en 3 fichiers :

  • le docker-compose de traefik
  • le docker-compose du serveur web
  • les variables d'environnement
  • Fichier configuration du tls
services:

  traefik:
    image: traefik:2.4.8
    command:
      - --log.level=DEBUG

      - --entrypoints.http.address=:80
      - --entrypoints.https.address=:443

      - --api=true
      - --providers.docker=true

      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http
      - --certificatesresolvers.letsencrypt.acme.email=${EMAIL}
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json

      - --providers.file.filename=/etc/traefik/config/tls.yml


    labels:
      # Redirect all HTTP traffic to HTTPS
      - traefik.http.routers.to-https.rule=HostRegexp(`{host:.+}`)
      - traefik.http.routers.to-https.entrypoints=http
      - traefik.http.routers.to-https.middlewares=to-https

      - traefik.http.routers.traefik.entrypoints=https
      - traefik.http.routers.traefik.middlewares=auth
      - traefik.http.routers.traefik.rule=Host(`traefik.${DOMAIN}`)
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.routers.traefik.tls=true
      - traefik.http.routers.traefik.tls.certresolver=${CERT_RESOLVER}


      - traefik.http.middlewares.to-https.redirectscheme.scheme=https
      - traefik.http.middlewares.auth.basicauth.users=${TRAEFIK_USER}:${TRAEFIK_PASSWORD_HASH}     
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /apps/traefik/letsencrypt:/letsencrypt # ACME (https)
      - /apps/traefik/config/:/etc/traefik/config/:ro # tls ( min tls 1.2)
    networks:
      - proxy

networks:
  proxy:
    external: true
version: "3.9"
services:
  web:
    image: httpd
    labels:
      - traefik.http.routers.httpd.rule=Host(`test.${DOMAIN}`) # A changer entre sous domaine !
      - traefik.http.routers.httpd.entrypoints=https
      - traefik.http.routers.httpd.tls=true
      - traefik.http.routers.httpd.tls.certresolver=${CERT_RESOLVER}
    networks:
      - proxy

networks:
  proxy:
    external: true
EMAIL=mail@gmail.com
DOMAIN=example.com
CERT_RESOLVER=letsencrypt
TRAEFIK_USER=admin
TRAEFIK_PASSWORD_HASH=$2y$10$zi5n43jq9S63gBqSJwHTH.nCai2vB0SW/ABPGg2jSGmJBVRo0A.ni
# Dynamic configuration
tls:
  options:
    default:
      minVersion: VersionTLS12
      sniStrict: true

Générer hash de mots de passe : ici

Terme technique

Terme Définition
Entrypoint Point d'écoute de Traefik; redirection;...
Routers couche(udp,tcp,http);host;
Middlewares Juste avant le service finale (avant que les paquets quitte traefik)

Sources