đ Traefik : Le Reverse Proxy du Projet¶
Prérequis obligatoires
Avant de continuer, assure-toi d'avoir lu et compris les pages suivantes :
- đł Docker â lancer et gĂ©rer des conteneurs
- đ YAML â syntaxe des fichiers de configuration
- đ RĂ©seautage virtuel â comment les conteneurs communiquent
- đ Gestion DNS â DuckDNS et nom de domaine
Ătape 1 : C'est quoi Traefik ? đ€¶
Traefik est un reverse proxy. ConcrĂštement, c'est le gardien de l'entrĂ©e : toutes les requĂȘtes qui arrivent sur ton Raspberry Pi passent d'abord par lui, et il dĂ©cide Ă quel conteneur les envoyer.
Sans Traefik, deux services ne pourraient pas Ă©couter sur le mĂȘme port 443 en mĂȘme temps. Traefik rĂ©sout ce problĂšme en lisant le nom de domaine de la requĂȘte pour router vers le bon service.
graph TD
User((Utilisateur)) -->|https://monprojet.local| T[đ Traefik :443]
T -->|Si domaine = wiki| W[đ Wiki Zensical]
T -->|Si domaine = app| A[đ ïž Autre service]
style T fill:#00b894,color:white
Ătape 2 : HTTPS avec certificat auto-signĂ© đ¶
Traefik peut gĂ©nĂ©rer automatiquement un certificat SSL auto-signĂ© au dĂ©marrage â aucune commande Ă exĂ©cuter, aucun fichier Ă crĂ©er.
Avertissement navigateur
Un certificat auto-signĂ© n'est pas reconnu par une autoritĂ© officielle. Le navigateur affichera un avertissement de sĂ©curitĂ© la premiĂšre fois que tu accĂšdes au site. Il suffit de cliquer sur AvancĂ© â Continuer quand mĂȘme pour l'accepter dĂ©finitivement.
C'est un comportement normal en environnement local â le trafic reste bien chiffrĂ©.
Domaine local ou vrai domaine
Cette approche fonctionne dans les deux cas :
- Réseau local uniquement : utilisez un nom comme
monprojet.localconfigurĂ© dans le fichierhostsde chaque machine (voir Ătape 6) - Avec un vrai domaine (ex: DuckDNS) : remplacez simplement
monprojet.localparmonprojet.duckdns.orgpartout dans cette doc
Ătape 3 : Configuration du docker-compose.yml âïž¶
services:
traefik:
image: traefik:v3 # Version stable de Traefik
container_name: traefik
restart: unless-stopped # RedĂ©marre automatiquement sauf si arrĂȘtĂ© manuellement
ports:
- "80:80" # HTTP â redirigĂ© automatiquement vers HTTPS
- "443:443" # HTTPS â port principal sĂ©curisĂ© (SSL/TLS)
command:
# --- Dashboard (interface web de Traefik, utile pour déboguer) ---
- "--api.dashboard=true"
- "--api.insecure=false" # Dashboard accessible uniquement via HTTPS
# --- Découverte automatique des conteneurs Docker ---
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false" # Seuls les conteneurs avec des labels Traefik sont exposés
# --- Points d'entrée réseau ---
- "--entrypoints.web.address=:80" # Entrée HTTP sur le port 80
- "--entrypoints.websecure.address=:443" # Entrée HTTPS sur le port 443
# --- Redirection automatique HTTP â HTTPS ---
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.web.http.redirections.entrypoint.permanent=true" # Redirection 301 permanente
# --- Certificat auto-signé (généré automatiquement par Traefik au démarrage) ---
- "--entrypoints.websecure.http.tls=true"
# Active TLS sur le port 443 â Traefik gĂ©nĂšre un certificat auto-signĂ© si aucun autre n'est fourni
volumes:
- /etc/localtime:/etc/localtime:ro
# Synchronise le fuseau horaire du conteneur avec celui du Raspberry Pi
# Ăvite que les logs de Traefik affichent des heures dĂ©calĂ©es
- /var/run/docker.sock:/var/run/docker.sock:ro
# Permet à Traefik de lire la liste des conteneurs Docker (lecture seule pour la sécurité)
networks:
- proxy-net # Réseau partagé avec les autres services exposés
networks:
proxy-net:
external: true # Ce réseau est créé séparément (voir la page Réseautage virtuel)
Ătape 4 : Le fichier .env đ¶
Traefik lit ses variables sensibles depuis un fichier .env Ă la racine du projet.
Ne jamais commit ce fichier sur GitHub (il est dans le .gitignore).
Ătape 5 : Exposer un service via Traefik đ·ïž¶
Pour qu'un conteneur soit accessible via Traefik, on lui ajoute des labels dans son docker-compose.yml. Ici, on prend comme exemple Zensical.
services:
zensical:
image: zensical/zensical:latest
restart: unless-stopped
labels:
- "traefik.enable=true"
# Active Traefik pour ce conteneur (nécessaire car exposedbydefault=false)
- "traefik.http.routers.wiki.rule=Host(`monprojet.local`)"
# RĂšgle de routage : si le domaine correspond, envoie vers ce conteneur
# Remplace monprojet.local par ton domaine réel si besoin
- "traefik.http.routers.wiki.entrypoints=websecure"
# Ce routeur écoute uniquement sur le port 443 (HTTPS)
- "traefik.http.routers.wiki.tls=true"
# Active TLS sur ce routeur â utilise le certificat auto-signĂ© de Traefik
- "traefik.http.services.wiki.loadbalancer.server.port=8000"
# Port interne du conteneur (Zensical écoute sur 8000)
networks:
- proxy-net # Doit ĂȘtre sur le mĂȘme rĂ©seau que Traefik
Ătape 6 : AccĂ©der au site depuis le rĂ©seau local đ¶
Si tu utilises un nom local (monprojet.local) sans vrai domaine, chaque machine du réseau doit savoir que ce nom pointe vers le Raspberry Pi. Pour ça, on modifie le fichier hosts de chaque machine.
- Ouvre le Bloc-notes en tant qu'administrateur
- Ouvre le fichier
C:\Windows\System32\drivers\etc\hosts - Ajoute cette ligne Ă la fin (remplace l'IP par celle de ton Raspberry Pi) :
- Sauvegarde et ferme
Ensuite, ouvre ton navigateur et accĂšde Ă https://monprojet.local. Accepte l'avertissement de sĂ©curitĂ© une seule fois â le site s'affiche.
Ătape 7 : Lancer et vĂ©rifier đ¶
# Créer le réseau proxy-net (une seule fois)
docker network create proxy-net
# Lancer Traefik
docker compose up -d
# Vérifier que Traefik tourne correctement
docker logs traefik
# Vérifier que TLS est bien actif
docker logs traefik | grep -i "tls\|certificate\|error"
RĂ©sumĂ© du flux complet :¶
graph LR
A[Utilisateur] -->|https://| B[Port 443 - Traefik]
B -->|Vérifie le domaine| C{Quel service ?}
C -->|monprojet.local| D[Zensical :8000]
C -->|autre.local| E[Autre conteneur]
B -->|Port 80 reçu| F[Redirection 301 â 443]
F --> B
style B fill:#00b894,color:white
style F fill:#fab1a0