Skip to content

Traefik 2 en prod, exemple de config

Auteur : Philippe Le Van - @plv

Date : 8 juin 2021

Introduction

Cette page donne quelques exemples de configurations de traefik2.

Configuration globale du traefik

pour lancer traefik, j'utilise 2 fichiers de conf traefik.yml et middlewares.yml. Ils sont spécifiés dans le docker-compose qui lance traefik.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
version: "3.7"

services:

  traefik:
    image: "traefik:latest"
    restart: unless-stopped
    network_mode: host
    command:
      - "--configFile=/etc/traefik/traefik.yml"
    volumes:
      - "./ddata/letsencrypt:/letsencrypt"
      - "./traefik.yml:/etc/traefik/traefik.yml"
      - "./middlewares.yml:/etc/traefik/middlewares.yml"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

Je pose ici le traefik.yml qui donne les configs de base de traefik avec quelques commentaires pour préciser le fonctionnement.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
api:
  insecure: true
log:
  level: INFO
providers:
  docker:
    # en prod, on ne veut pas que tous les containers
    # soient découverts automatiquement par traefik
    exposedbydefault: false
  file:
    # ici on va définir des middlewares, cf plus bas
    filename: /etc/traefik/middlewares.yml

entrypoints:
  websecure:
    # le https en écoute sur le port 443
    address: ":443"

  web:
    # le http en écoute sur le port 80
    # on fait systématiquement une redirection vers
    # l'entrypoint "websecure"
    #
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

certificatesResolvers:
  my_http_resolver:
    # on configure le fonctionnement de let's encrypt.
    acme:
      httpChallenge:
        entrypoint: web
      email: toto@example.com
      storage: "/letsencrypt/acme_http.json"

tls:
  # ici on limite les versions de TLS et la liste de cifer pour renforcer
  # la sécurité (liste de mozilla).
  options:
    default:
      minVersion: "VersionTLS12"
      cipherSuites:
        - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
        - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
        - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
        - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
        - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305"
        - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"

middleware.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
http:
  middlewares:
    # ici on définit 2 middlewares qui peuvent ensuite être utilisés dans des labels
    # dans les docker-compose.yml des projets.

    securityHeaders:
      # ce middleware permet de modifier des headers HTTP de sécurité
      headers:
        customFrameOptionsValue: "SAMEORIGIN"
        sslRedirect: true
        framedeny: true
        sslredirect: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 15552000
    plvAuth:
      # ce middleware permet d'ajouter un mot de passe HTTP Basic sur un site.
      basicAuth:
        users:
          - "toto:$apr1$Wxxxxxxxxxxxxxxxxxxxxxxx0"

Configuration d'un site avec des labels dans le docker-compose.yml

exemple avec une configuration pour nextcloud

dans le docker-compose.yml, je définis les labels nécessaires à traefik

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
version: '3'

services:
  web:  
    labels:
      # on active traefik pour ce container      
      - "traefik.enable=true"
      # on indique l'URL qui doit router vers ce container
      - "traefik.http.routers.nextcloud.rule=Host(`cloud.example.com`)"
      # utilisation de l'entrypoint "websecure" pour dire qu'on est en https
      - "traefik.http.routers.nextcloud.entrypoints=websecure"
      # on indique la conf de letsencrypt qu'on veut utiliser
      - "traefik.http.routers.nextcloud.tls.certresolver=my_http_resolver"
      # on utilise une conf de redirection pour les adresses en .well-known pour
      # répondre que les adresses caldav et carddav soient accessibles en .well-known.
      - "traefik.http.middlewares.nextcloudAppRegex.redirectregex.regex=https://(.*)/.well-known/(card|cal)dav"
      - "traefik.http.middlewares.nextcloudAppRegex.redirectregex.replacement=https://$$1/remote.php/dav/"
      # on indique ici la liste des middleware à utiliser : un qui est dans le
      # middleware.yml, et l'autre dans ce docker-compose.
      - "traefik.http.routers.nextcloud.middlewares=securityHeaders@file,nextcloudAppRegex@docker"

exemple de router avec 2 hosts possibles

1
        - traefik.http.routers.my_name.rule=Host(`gitlab.example.com`) || Host(`registry.example.com`)

spécifier le port du service

1
        - traefik.http.services.my_name.loadbalancer.server.port=80

plusieurs règles de routage, contextes de routage

Dans les règles ci-dessous, le site tourne dans 4 contextes avec des URL différentes.

Notez le "namespacing" utilisé pour séparer les routages.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    labels:
      # on active traefik pour ce container
      - traefik.enable=true
      - 
      # site public, ouvert
      - traefik.sites_front.frontend.rule=Host:www.example.com
      - traefik.sites_front.frontend.entryPoints=https
      - 
      # site derrière une authentification http basique
      - traefik.sites_manager.frontend.rule=Host:manager.example.com
      - traefik.sites_manager.frontend.auth.basic.usersFile=/home/cloud/containers/example/htpasswd.txt
      - traefik.sites_manager.frontend.entryPoints=https

      # site https, ouvert
      - traefik.api.frontend.rule=Host:api.example.com
      - traefik.api.frontend.entryPoints=https

      # site sur un entryPoint différent, pour gérer un HTTPS particulier 
      - traefik.connect.frontend.rule=Host:connect.example.com
      - traefik.connect.frontend.entryPoints=https2