J’ai décidé de me lancer dans un petit projet sympa : monter une machine dédiée à mon homelab. L’idée ? Créer un environnement centralisé depuis lequel je pourrai installer et gérer différentes applications, accessibles facilement par toute la famille. Et tant qu’à faire, autant protéger correctement l’ensemble de nos équipements connectés au réseau domestique.
Pour orchestrer tout ça proprement (et éviter que ça devienne un joyeux bazar), j’ai choisi d’utiliser Traefik en tant que reverse proxy. Pourquoi Traefik ? Parce qu’il est malin, dynamique, et parfaitement taillé pour ce genre de config maison. Un vrai majordome numérique pour mon homelab
Traefik, c’est quoi ce truc ?

Tu t’es déjà demandé comment on fait pour accéder à une appli planquée dans un coin de ton infra sans ouvrir grand la porte d’entrée ? Eh bien, Traefik, c’est un peu le videur de discothèque de ton réseau : il gère les entrées, vérifie les badges, redirige les gens vers la bonne salle… tout ça sans jamais laisser traîner un service tout nu sur Internet.
🛠️ Un reverse proxy, mais pas que !
Techniquement, Traefik est un reverse proxy écrit en Go (le langage, pas le Pokémon). Il te permet de publier proprement des services internes sur le grand méchant Web, le tout en gardant une configuration dynamique et intelligente.
Parmi les gros bras du même métier, on retrouve Nginx, HAProxy ou encore Apache. Mais Traefik, lui, a ce petit je-ne-sais-quoi : une sensibilité DevOps, une intégration native avec les conteneurs, et un amour inconditionnel des configs propres et auto-magiques.
🇫🇷 Cocorico : un projet français !
Créé en 2015 par Emile Vauge, à l’origine comme un petit projet perso pour se faciliter la vie (comme quoi procrastiner utile, ça paye), Traefik a vite trouvé sa communauté. Succès, stars sur GitHub, puis boom : naissance de la boîte Traefik Labs (anciennement Containous). Depuis, ils ont pondu d’autres joujoux comme Traefik Mesh ou Traefik Pilot.
Moralité ? Publie tes projets, même un peu fous : ça pourrait bien changer ta vie 😄
🚀 Pourquoi c’est cool (et pourquoi tu devrais t’y mettre)
Traefik brille particulièrement en environnement conteneurisé. Tu bosses avec Docker ? Kubernetes ? Rancher ? (Ou un mélange savant des trois ?) Alors Traefik est ton nouveau meilleur pote. Grâce à ses fameux providers, il peut détecter automatiquement les services qui démarrent, se déplacent ou disparaissent, et ajuster sa config en temps réel. Magique, on te dit.
Tu déploies une app ? Hop, elle est exposée. Tu redémarres un conteneur ? Pas de panique, Traefik s’en occupe. Un peu comme si ton proxy avait un sixième sens.
💎 Quelques super-pouvoirs supplémentaires
- Certificats HTTPS gratuits avec Let’s Encrypt, intégrés et automatisés (bye bye les galères de certifs expirés)
- Une interface web super claire pour visualiser les routes
- Des connecteurs pour les métriques et logs (Prometheus, Grafana, Datadog, InfluxDB…)
- Une communauté active et une doc ultra bien fichue
- Et surtout : une prise en main rapide, pour un plaisir d’utilisation maximal
🧠 En résumé :
Traefik, c’est un peu comme le majordome de ton infra. Poli, discret, réactif, et toujours bien organisé. Il fait le job, avec style. Tu risques de ne plus vouloir t’en passer.
Mais attention, ça s’apprend en le pratiquant ! Donc retrousse tes manches, monte un petit Docker Compose, et amuse-toi un peu avec lui. Tu verras, il est plus sympa qu’il en a l’air.
Traefik V3 — Concepts clés
Traefik est un reverse proxy et un load balancer super populaire, utilisé pour gérer dynamiquement la manière dont les requêtes entrantes sont dirigées vers tes applications/services.
Dans Traefik v3, comme dans les versions précédentes, quatre concepts fondamentaux organisent ce fonctionnement : Routers, Services, Middlewares, Entrypoint, Providers.
Routers
Le router (ou "routeur") est responsable de faire correspondre une requête entrante à une règle, et décider quoi faire avec cette requête.
Que fait un router ?
- Il écoute sur des entrées réseau (par exemple HTTP ou HTTPS)
- Il applique une règle de matching (Host(), Path(), Headers(), etc.)
- Il décide quel service appeler après
Exemple simple de router :

Explication rapide :
- Si quelqu'un accède à http://example.com, ce router prend la main
- Ensuite, il délègue la requête au service my-service
Services
Le service représente ton application ou backend réel, c’est là que Traefik va finalement envoyer la requête après qu'elle a été routée.
Que fait un service ?
- Il décrit où Traefik doit envoyer le trafic
- Il peut être un seul serveur, ou un ensemble de serveurs pour faire du load balancing
Exemple de service simple :

Explication rapide :
- Traefik redirige ici vers http://localhost:8080
- Tu peux mettre plusieurs serveurs sous loadBalancer pour répartir les charges
Middlewares
Les middlewares sont des outils de traitement intermédiaire, ils modifient la requête avant qu’elle n’arrive au service, ou la réponse avant qu’elle ne reparte vers le client.
Que fait un middleware ?
- Authentification, redirections, réécritures d'URL, ajout de headers, ratelimit, etc
- Les middlewares sont chaînables : tu peux en appliquer plusieurs sur un router
Exemple d'usage d'un middleware :

Explication rapide :
- Avant de router la requête vers my-service, Traefik applique my-redirect
- Ici, my-redirect force toutes les requêtes HTTP vers HTTPS
Résumé visuel

- Router : À quelles requêtes je dois répondre ?
- Middlewares : Dois-je modifier quelque chose en cours de route ?
- Service : Où est-ce que j’envoie la requête ?
Qu’est-ce qu’un entrypoint ?
Un entrypoint est un port ouvert (et une configuration associée) que Traefik écoute.
En gros : Entrypoint = "Traefik écoute sur ce port, en utilisant tel protocole."
Pourquoi c’est utile ?
Parce que tu peux avoir :
- Un port pour HTTP (ex : 80)
- Un autre pour HTTPS (ex : 443)
- Un pour gRPC, TCP pur, WebSocket, etc
Et tu peux configurer ces entrypoints avec :
- TLS activé ou non
- Certificats
- Timeout, ProxyProtocol, etc
Exemple d’entrypoints (dans traefik.yml) :

Ici :
- web écoute sur le port 80 (HTTP)
- websecure écoute sur 443 (HTTPS avec TLS)
Qu’est-ce qu’un provider ?
La notion de provider dans Traefik v3 (comme dans les versions précédentes) est centrale : c’est ce qui permet à Traefik de découvrir dynamiquement la configuration des services, middlewares, routes, etc.
Un provider dans Traefik est une source de configuration dynamique. Chaque provider "alimente" Traefik avec des infos sur :
- Les services à router (par ex. les conteneurs Docker)
- Les middlewares à appliquer
- Les routers (les règles de routage)
- Les certificats, options TLS, etc
les types de providers les plus fréquents :
- docker: Découvre automatiquement les conteneurs Docker via leurs labels
- file: Charge une configuration dynamique depuis un fichier YAML ou TOML
- kubernetesCRD: Utilise des Custom Resources sur Kubernetes (CRDs) pour définir les routes
- kubernetesIngress: Utilise les objets Ingress standards dans Kubernetes
- consulCatalog, etcd, marathon: Intègrent des services depuis d’autres orchestrateurs
Règle à retenir
Chaque objet dynamique (router, middleware, service, TLS option…) est lié à un provider. Si tu veux utiliser un objet défini ailleurs (par ex. middleware défini dans un fichier YAML depuis un router Docker), tu dois spécifier @file ou @docker selon le cas.
Configuration initiale de Traefik
J’utilise Debian 12 sur mon homelab. Généralement je mets toute la configuration des mes containers dans le répertoire /opt/containers.
- Etape 1 - Création du répertoire traefik
mkdir traefik

- Etape 2 - Utilisez la commande « docker network » pour créer le réseau « web » (vous pouvez lui donner ce que vous voulez comme nom), qui sera réservé à Traefik.
docker network create web

En tapant "docker network ls", vous devriez découvrir le réseau nouvellement créé.

Ce réseau sera configuré en mode "bridge", c’est-à-dire qu’il utilisera la carte réseau physique de la machine virtuelle comme s’il était directement branché sur le réseau local. Concrètement, un pont réseau ("bridge") est créé entre l’interface physique de l’hôte et la carte virtuelle de la VM, ce qui permet à la machine virtuelle d’apparaître sur le réseau comme un appareil à part entière, avec sa propre adresse IP, exactement comme un PC ou un smartphone connecté à la box.
- Etape 3 - Créer un répertoire nommé « letsencrypt », puis à l'intérieur, créez le fichier acme.json destiné à stocker vos certificats SSL et appliquez les permissions appropriées.

- Etape 4 - Créer deux fichiers de configuration qui seront chargés par Traefik au démarrage (un fichier statique et un fichier dynamique). Ces fichiers seront au format YAML.
Fichier Statique :

Voici quelques explications :
- Ligne 1 et 2: Activation du dashboard de Traefik
- Ligne 4 à 6: Indiquez le chemin des logs et le niveau de journalisation. Au moment de l’installation je vous conseille DEBUG, puis une fois en production ERROR.
- Ligne 8 à 10: Indiquez le chemin des logs d’accès et le nombre de lignes à afficher
- Ligne 12 à 24 : On indique à Traefik d'écouter les ports 80 appelé web et 443 appelé websecure. Toutes les requêtes du port 80 seront redirigées vers le port 443 pour bénéficier du HTTPS et des certificats SSL. Sur la dernière ligne on indique que c’est Let’s Encrypt notre fournisseur de certificat.
- Ligne 26 à 34: Pour générer les certificats SSL, vous avez le choix entre deux serveurs, acme-staging-v02 pour la pré-production et acme-v02 pour la production. indiquer bien le chemin pour le fichier acme.json.
- Ligne de 36 à 37: Cette option dans le fichier traefik.yml indique à Traefik de ne pas vérifier les certificats TLS des serveurs en backend (les services vers lesquels il redirige le trafic, comme tes conteneurs web). Lorsque Traefik agit comme reverse proxy et qu’il communique en HTTPS avec un backend (par exemple, un service web tournant sur https://monapp:443), il vérifie normalement que le certificat TLS de ce backend est valide (autorité de certification reconnue, domaine correspondant, etc.). Avec insecureSkipVerify: true, Traefik ignore ces vérifications. A utiliser en toute connaissance de cause.
- Ligne de 39 à 44: Nous allons configurer Traefik pour surveiller en temps réel le socket de Docker, ce qui lui permettra d'identifier toutes les modifications apportées aux conteneurs sur le réseau « traefik » (ce réseau est spécifiquement dédié aux conteneurs accessibles sur le web). Il est à noter que si l'option « exposeByDefault » est définie sur « true », vous n'avez pas nécessité d'ajouter le label « traefik.enable.true » à vos conteneurs, tous seront exposés par défaut. Toutefois, je vous recommande de ne pas modifier cette configuration et de recourir au label pour une exposition manuelle des conteneurs.
Déploiement du container Traefik
Créer un fichier compose.yml et copier le contenu suivant dedans :

- Ligne 1 à 3: external: true = indique à Docker d’utiliser un réseau Docker déjà existant nommé web. Sinon, Docker Compose tenterait de créer ce réseau, ce qui provoquerait une erreur s’il existe déjà sous un autre projet ou s’il est géré manuellement.
- Ligne 5: services : c'est là qu'il faudra ajouter les configurations de vos conteneurs
- Ligne 7: on indique généralement le nom du logiciel
- Ligne 8: container_name : le nom du conteneur, sinon Docker en choisira un de manière aléatoire
- Ligne 9: image : nom du registry suivi du nom de l'application et du tag de version
- Ligne 10: Pour utiliser les politiques de redémarrage, Docker propose les options suivantes : no : Les conteneurs ne redémarrent pas automatiquement, on-failure[:max-retries] : Redémarrer le conteneur s'il se termine avec un code de sortie non nul, et fournir un nombre maximum de tentatives pour que le démon Docker redémarre le conteneur, always : Redémarre toujours le conteneur s'il s'arrête, unless-stopped : Redémarre toujours le conteneur sauf s'il a été arrêté arbitrairement ou par le démon Docker.
- Ligne 11 à 12: network : indique uniquement le réseau "web" dédié à Traefik
- Ligne de 13 à 15: ports : 80 (HTTP) et 443 (HTTPS). Aucune autre application n'utilisera ces ports à part Traefik
- Ligne de 16 à 20: volumes : on indique le sock de Docker pour que Traefik puisse écouter en permanence (en lecteure seule), puis 3 des chemins où vous allez indiquer le chemin des logs, du fichier statique, du fichier dynamique et du fichier acme qui contiendra tout vos certificats SSL
- Ligne 21 à 27 : configuration lié à Traefik.
Voici quelques explications sur les principales commandes utilisées dans le fichier de configuration de Traefik :
- traefik.enable=true, active Traefik pour pouvoir lui ajouter des services et des routeurs
- traefik.http.routers.traefik-dashboard.entrypoints=websecure, indique que le dashboard de Traefik doit passer par le point d'entrée "websecure" soit le HTTPS, obligatoire pour obtenir le précieux certificat SSL et avoir des échanges sécurisés
- traefik.http.routers.traefik-dashboard.rule=Host( traefik.mondomaine.fr ), on créer une règle (rule) en indiquant le nom de domaine lié à l'application pour qu'on puisse y accéder à travers ce dernier
- traefik.http.routers.traefik-dashboard.service=api@internal, cette ligne configure le router HTTP traefik-dashboard pour qu’il pointe vers un service interne spécial de Traefik : le dashboard. C’est un service interne fourni par Traefik lui-même, qui permet d’accéder à : l’interface dashboard de Traefik, l’API de configuration dynamique, le visualiseur de routes en direct
- traefik.http.routers.traefik-dashboard.middlewares=auth, cela signifie que tu attaches un middleware nommé auth à ton router traefik-dashboard. Ce middleware va agir avant d'autoriser la requête vers le dashboard. Par défaut le dashboard de Traefik n’est pas sécurisé, ici avec ce middleware nous allons le protéger par un login et un mot de passe
- traefik.http.middlewares.auth.basicauth.users=guillaume:$$apr1$$5u7pt4qd$$bxe0zjyQgcXH9K690PbV. Elle définit un middleware auth de type basicAuth, avec l’utilisateur guillaume et un mot de passe encodé en htpasswd
Pour générer un mot de passe encodé, vous pouvez utiliser ce site : https://www.web2generators.com/apache-tools/htpasswd-generator

Comment avoir la note A+ sur SSLLABS
Pour obtenir une note A+ sur SSL Labs avec Traefik v3, il faut appliquer une configuration stricte et sécurisée concernant TLS/SSL. Cela implique notamment :
- Activer uniquement TLS 1.2 et 1.3
- Utiliser des suites de chiffrement robustes
- Activer HTTP/2
- Désactiver les redirections non sécurisées
- Forcer le HSTS
Les principaux paramètres à modifier/ajouter dans les fichiers de configuration (souvent traefik.yml, traefik.toml, ou via les labels Docker).
Modifier la version de TLS minimum et maximum et durcir les suites de chiffrement
Pour réaliser cette configuration je vous conseille d’utiliser un fichier dynamique nommé dynamic.yml par exemple pour mettre toute la configuration.
Pour que ce fichier dynamique soit reconnu par traefik, vous devez le configurer à plusieurs endroits.
Référence 1 : traefik.yml
Vous devez ajouter cette ligne au niveau des provider (en rouge sur la capture) => Lignes 45 & 46

Référence 2: compose.yml
Vous devez faire référence à ce fichier au niveau de vos volumes pour le monter dans votre container. => Ligne 20

Maintenant vous pouvez commencer à l’exploiter en ajoutant vos restrictions pour le TLS et les ciphers. => Ligne 1 à 13

Forcer HSTS (HTTP Strict Transport Security)
Toujours dans votre fichier dynamic.yml, rajouter ces informations. => Ligne 15 à 26

Dernière étape mais pas des moindres, vous devez faire référence à ces paramètres dans les labels de votre fichier compose. => Ligne 26 & 28

Enfin, pour tester votre configuration de votre container Traefik, allez sur https://www.ssllabs.com/ puis vérifier votre domaine et vous devriez obtenir la fameuse note A+
