Traefik est un reverse-proxy et load balancer moderne, conçu pour les architectures conteneurisées mais également parfaitement adapté aux environnements bare metal. Sa configuration déclarative, son support natif de Let's Encrypt et sa facilité d'utilisation en font un outil de choix pour exposer des services internes de maniÚre sécurisée. Ce module vous apprend à l'installer et à le configurer sur Debian 13 avec des fichiers dynamiques.
| Composant | RĂŽle |
|---|---|
| EntryPoints | Points d'entrée (ports) comme HTTP (80) et HTTPS (443). |
| Providers | Sources de configuration (fichiers, Docker, etc.). |
| Routers | RĂšgles de routage (domaine, chemin, headers). |
| Services | Backends vers lesquels router. |
| Middlewares | Fonctions intermédiaires (authentification, headers, compression). |
| CertificatesResolvers | Gestion des certificats (Let's Encrypt). |
Cette section détaille l'installation de Traefik 3.6.11 en bare metal sur Debian 13.2, sans utiliser Docker. Toutes les étapes sont réalisées en ligne de commande.
sudo apt update && sudo apt full-upgrade -y
sudo apt install curl -y
traefikAjouter l'utilisateur systĂšme (sans shell) :
sudo useradd --system --home /etc/traefik --shell /bin/false traefik
--system : crée un compte systÚme (UID < 1000).--home /etc/traefik : définit le répertoire personnel de l'utilisateur.--shell /bin/false : interdit toute connexion interactive.sudo mkdir -p /etc/traefik /var/lib/traefik sudo chown traefik:traefik /etc/traefik /var/lib/traefik
Les répertoires accueilleront la configuration (/etc/traefik) et les données persistantes (/var/lib/traefik).
cd /tmp wget https://github.com/traefik/traefik/releases/download/v3.6.11/traefik_v3.6.11_linux_amd64.tar.gz tar -xvzf traefik_v3.6.11_linux_amd64.tar.gz -C /usr/local/bin traefik chmod +x /usr/local/bin/traefik
wget : télécharge l'archive de la version 3.6.11.tar -xzvf : extrait le binaire traefik dans /usr/local/bin.chmod +x : rend le binaire exécutable.traefik.yml)Créer /etc/traefik/traefik.yml :
log:
level: INFO
api:
dashboard: true
insecure: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
http3: {} # active HTTP/3 (QUIC) sur 443
providers:
file:
directory: "/etc/traefik/dynamic"
watch: true
certificatesResolvers:
le:
acme:
email: "VOTRE_MAIL@domaine.fr" # â Ă MODIFIER !
storage: "/var/lib/traefik/acme.json"
tlsChallenge: {}
log.level : niveau de logs (INFO, DEBUG, ERROR).api.dashboard : active le tableau de bord, sécurisé via insecure: false.entryPoints : définit les ports d'écoute et redirige HTTP vers HTTPS.http3: {} : active HTTP/3 (QUIC) sur le port 443.providers.file : charge les fichiers dynamiques depuis /etc/traefik/dynamic.certificatesResolvers : configure Let's Encrypt avec le challenge TLS.sudo touch /var/lib/traefik/acme.json sudo chown traefik:traefik /var/lib/traefik/acme.json sudo chmod 600 /var/lib/traefik/acme.json
Le fichier doit ĂȘtre accessible en Ă©criture par l'utilisateur traefik avec des droits stricts.
sudo apt install apache2-utils -y htpasswd -nbB admin VOTRE_MOT_DE_PASSE
Conservez le hash généré pour l'étape suivante.
Créer le dossier des fichiers dynamiques :
sudo mkdir -p /etc/traefik/dynamic
Créer /etc/traefik/dynamic/dashboard.yml :
http:
routers:
dashboard:
rule: "Host(`traefik.mon-domaine.fr`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
entryPoints: ["websecure"]
service: api@internal
tls:
certResolver: le
middlewares:
- auth
- SecureHeaders
- Compression
dashboard-root:
rule: "Host(`traefik.mon-domaine.fr`) && Path(`/`)"
entryPoints: ["websecure"]
service: api@internal
tls:
certResolver: le
middlewares:
- dash-redirect
- SecureHeaders
middlewares:
auth:
basicAuth:
realm: "Traefik"
users:
- "admin:COLLER_ICI_LE_HASH_GĂNĂRĂ" # â Ă MODIFIER
dash-redirect:
redirectRegex:
regex: "^/$"
replacement: "/dashboard/"
permanent: true
rule : redirige traefik.mon-domaine.fr vers le dashboard.service: api@internal : service interne de Traefik.middlewares : chaßne de middlewares (authentification, headers, compression).dash-redirect : redirige / vers /dashboard/.users : utilisateur admin avec mot de passe hashé.Créer /etc/traefik/dynamic/tls.yml :
tls:
options:
default:
minVersion: "VersionTLS12"
preferServerCipherSuites: true
cipherSuites:
- "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
- "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305"
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
- "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
- "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"
curvePreferences:
- CurveP256
- CurveP384
- CurveP521
minVersion: VersionTLS12 : impose TLS 1.2 minimum.cipherSuites : liste des suites de chiffrement autorisées (sécurisées).curvePreferences : courbes elliptiques pour les échanges de clés.Créer /etc/traefik/dynamic/headers.yml :
http:
middlewares:
Compression:
compress:
excludedContentTypes:
- text/event-stream
SecureHeaders:
headers:
forceSTSHeader: true
stsSeconds: 63072000
stsIncludeSubdomains: true
stsPreload: true
customFrameOptionsValue: "SAMEORIGIN"
contentTypeNosniff: true
referrerPolicy: "same-origin"
permissionsPolicy: >-
accelerometer=(), camera=(), geolocation=(),
gyroscope=(), magnetometer=(), microphone=(),
payment=(), usb=()
contentSecurityPolicy: >-
default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval';
style-src 'self' 'unsafe-inline';
img-src 'self' data: blob:;
font-src 'self' data:;
connect-src 'self' https: wss:;
frame-ancestors 'self';
base-uri 'self';
form-action 'self';
upgrade-insecure-requests
Compression : active la compression gzip pour les rĂ©ponses.SecureHeaders : ajoute des en-tĂȘtes de sĂ©curitĂ© (HSTS, X-Frame-Options, CSP...).CSP : Content Security Policy autorisant les sources nĂ©cessaires pour le dashboard.CrĂ©er /etc/systemd/system/traefik.service :
[Unit] Description=Traefik Reverse Proxy After=network-online.target Wants=network-online.target [Service] User=traefik Group=traefik ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.yml WorkingDirectory=/etc/traefik Restart=on-failure AmbientCapabilities=CAP_NET_BIND_SERVICE CapabilityBoundingSet=CAP_NET_BIND_SERVICE NoNewPrivileges=true LimitNOFILE=1048576 ProtectSystem=full ProtectHome=true PrivateTmp=true ReadWritePaths=/var/lib/traefik /etc/traefik [Install] WantedBy=multi-user.target
User=traefik : exécute le service avec l'utilisateur dédié.AmbientCapabilities : permet de lier les ports < 1024 (80, 443).ProtectSystem=full : restreint l'accÚs au systÚme de fichiers.ReadWritePaths : autorise l'écriture dans les répertoires de configuration et de données.sudo systemctl daemon-reload sudo systemctl enable --now traefik sudo systemctl status traefik
Vérifiez que le service est active (running).
Depuis un navigateur, accédez à https://traefik.mon-domaine.fr et connectez-vous avec les identifiants configurés.
Une fois Traefik installé, vous pouvez exposer n'importe quel service interne (serveur web, cockpit, GitLab, etc.) en créant simplement un fichier YAML dans /etc/traefik/dynamic.
Créer /etc/traefik/dynamic/cockpit.yml :
http:
routers:
cockpit:
rule: "Host(`cockpit.mon-domaine.fr`)"
entryPoints: ["websecure"]
service: cockpit-svc
middlewares:
- SecureHeaders
- Compression
tls:
certResolver: le
services:
cockpit-svc:
loadBalancer:
servers:
- url: "https://IP_DE_LA_MACHINE:9090"
passHostHeader: true
serversTransport: cockpit-transport
serversTransports:
cockpit-transport:
insecureSkipVerify: true
rule: Host("cockpit.mon-domaine.fr") : route les requĂȘtes vers ce domaine.service: cockpit-svc : dĂ©finit le backend.loadBalancer.servers : liste des serveurs cibles (ici un seul).insecureSkipVerify: true : ignore la vĂ©rification du certificat du backend (utile pour Cockpit en autoâsignĂ©).CrĂ©er /etc/traefik/dynamic/mon-app.yml :
http:
routers:
mon-app:
rule: "Host(`app.mon-domaine.fr`)"
entryPoints: ["websecure"]
service: mon-app-svc
middlewares:
- SecureHeaders
- Compression
tls:
certResolver: le
services:
mon-app-svc:
loadBalancer:
servers:
- url: "http://192.168.1.100:8080"
Le service est exposé sur https://app.mon-domaine.fr.
Traefik surveille le répertoire /etc/traefik/dynamic grùce à watch: true.
DÚs qu'un fichier est créé, modifié ou supprimé, la configuration est rechargée automatiquement.
Il n'est pas nécessaire de redémarrer Traefik.
| Commande | Description |
|---|---|
sudo systemctl status traefik | Vérifier l'état du service. |
sudo journalctl -u traefik -f | Consulter les logs en temps réel. |
sudo systemctl restart traefik | Redémarrer Traefik (aprÚs modification de traefik.yml). |
sudo systemctl reload traefik | Recharger la configuration (rarement nécessaire). |
traefik version | Afficher la version installée. |
Quel utilisateur systÚme est créé pour exécuter Traefik ?
L'utilisateur traefik est créé avec la commande useradd --system --home /etc/traefik --shell /bin/false traefik.
Dans quel répertoire doit-on placer les fichiers YAML pour exposer un nouveau service ?
Les fichiers dynamiques doivent ĂȘtre placĂ©s dans /etc/traefik/dynamic/.
Quel middleware est utilisĂ© pour ajouter des enâtĂȘtes de sĂ©curitĂ© comme HSTS et CSP ?
Le middleware SecureHeaders (défini dans headers.yml).
1. Traefik peut ĂȘtre installĂ© en bare metal, sans Docker.
2. Le fichier de configuration statique de Traefik s'appelle traefik.yml.
3. Les fichiers dynamiques sont surveillés automatiquement grùce à watch: true.
4. Pour exposer un nouveau service, il faut redémarrer Traefik.
5. Le middleware SecureHeaders ajoute des enâtĂȘtes de sĂ©curitĂ© HTTP.