Traefik 2 en prod, exemple de config
Auteur : Philippe Le Van - @plv@framapiaf.org
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
| - traefik.http.routers.my_name.rule=Host(`gitlab.example.com`) || Host(`registry.example.com`)
|
spécifier le port du service
| - 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
|