[FR] TRAEFIK, LE REVERSE PROXY HTTPS
Traefik est un reverse proxy HTTP/HTTPS et un équilibreur de charge (load-balancer) moderne dans le but de déployer facilement des microservices. Il supporte plusieurs type de backends comme Docker, Swarm, Kubernetes, Marathon, Rancher, Amazon ECS, ..., pour gérer sa configuration de manière automatique et d'autres mais d'une manière basique. Je vous invite à vous rendre sur le site officiel pour en savoir plus !
Je l'utilise chez moi comme point d'entrée HTTP/HTTPS depuis plusieurs mois maintenant. J'ai plusieurs raisons à l'utiliser mais principalement, il tourne dans un container Docker (c'est simple à gérer), il gère facilement mes certificats Let's Encrypt, il redirige le trafic (du domaine utilisé/configuré) vers l'équipement qui va bien (y'a un peu de monde derrière) 😅
Je vais prendre l'exemple avec l'un de mes RaspberryPiZero qui fait tourner en tâche de fond mon API (port 5000/tcp) pour le contrôle de mes lampes de bureau (un truc développé maison en Python/Flask). Bref par défaut personne n'a envi d'exposer son port 5000/tcp sur internet, et d'autant plus que le service fourni seulement du HTTP derrière... C'est donc pour cela que j'utilise Traefik en front pour "securiser" un peu la chose. Pour que ce soit simple à gérer et à maintenir, on va faire ça avec docker-compose avec le fichier /home/docker/traefik/docker-compose.yml
:
version: '2'
services:
traefik:
container_name: traefik
image: traefik:latest
restart: always
ports:
- "80:80"
- "443:443"
- "8080:8080"
labels:
- "traefik.enable=true"
- "traefik.port=8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/home/docker/traefik/letsencrypt.json:/etc/traefik/letsencrypt.json"
- "/home/docker/traefik/traefik.toml:/etc/traefik/traefik.toml"
- "/home/docker/traefik/log:/var/log/traefik"
Le container est prêt à être lancé mais ce n'est pas suffisant pour qu'il tourne dans l'immédiat. Il faut pour ça faire quelques retouches dans le fichier de configuration traefik.toml
. Pour que ce soit assez simple à comprendre, voilà ce que j'ai chez moi (c'est un exemple) :
# Service logs (here debug mode)
debug = true
traefikLogsFile = "/var/log/traefik/traefik.log"
logLevel = "DEBUG"
# Entrypoints
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
# Access log
filePath = "/var/log/traefik/access.log"
format = "common"
# Admin dashboard
[web]
address = ":8080"
# Let's Encrypt settings
[acme]
email = "hello@xorhak.org"
storage = "/etc/traefik/letsencrypt.json"
entryPoint = "https"
acmeLogging = true
onDemand = false
onHostRule = true
# Let's Encrypt domains
[[acme.domains]]
main = "api.home.xorhak.org"
# Reload is file modified
watch = true
# Backends (here RaspberyPiZero)
[backends]
[backends.back_raspberypi_api]
[backends.back_raspberrypi_api.servers.python_flask]
url = "http://192.168.1.37:5000"
# Fronts
[frontends]
[frontends.front_raspberrypi_api]
backend = "back_raspberrypi_api"
entrypoints = ["http", "https"]
passHostHeader = true
[frontends.front_raspberrypi_api.routes.desktoplamp]
rule = "Host:api.home.xorhak.org"
Maintenant reste plus qu'à lancer le container avec la commande docker-compose up -d
et à rejoindre le domaine que vous avez configuré, par exemple ici c'est https://api.home.xorhak.org
(tout le trafic HTTP est redirigé vers HTTPS de toute manière). Vous aurez ainsi un accès direct vers votre service (ici l'API qui se trouve sur le RaspberyPiZero). Le dashboard d'admin écoute sur le port 8080, et comme il tourne dans un container en local, je peux utiliser http://localhost:8080
pour l'accès :
Pour le moment je n'utilise pas le mode dynamique car mes services ne sont pas encore containerisés (mais c'est en cours). La documentation est aussi bien faite, dans mon cas j'ai utilisé celle pour la partie Let's Encrypt et celle pour la partie File (utilisé pour des backends simples). Si vous avez des choses de ce type à mettre en place chez vous, pensez à tester Traefik 😉