32 KiB
Executable File
Procédure HTTPS Homelab avec Infomaniak & Let's Encrypt
Objectif : Mettre en place du HTTPS automatique sur ton homelab avec gestion des certificats Let's Encrypt, DNS chez Infomaniak et reverse proxy conteneurisé.
Public cible : Débutant à avancé en homelab, utilisant Proxmox/LXC ou Docker.
⚠️ ÉTAT ACTUEL (17/07/2026) - CE QUI RESTE À FAIRE
✅ DÉJÀ DÉPLOYÉ ET FONCTIONNEL :
- CT 200 (192.168.0.100) renommé en traefik-proxy (anciennement traefik-new)
- Docker et Docker Compose installés sur CT 200
- Traefik v2.10 déployé avec configuration Let's Encrypt PRODUCTION (plus de staging)
- Port forwarding TCP 80/443 configuré sur le routeur → 192.168.0.100
- Ancien CT 104 supprimé ✅
- HA activé pour CT 200 ✅
- Réseau Docker
traefik_networkcréé- Fichiers de configuration mis à jour dans
/opt/traefik/- Documentation whoami créée dans
service-whoami.md
🔄 À FAIRE POUR FINALISER :
- ❌ Déployer les fichiers mis à jour : Copier les fichiers depuis
traefik-config/vers/opt/traefik/sur CT 200- ❌ Renommer le container : Exécuter
docker rename traefik-new traefik-proxy(si pas déjà fait)- ❌ Redémarrer Traefik :
cd /opt/traefik && docker-compose down && docker-compose up -d- ❌ Créer le CNAME test.peis.fr chez Infomaniak (CNAME → lab.peis.fr)
- ❌ Déployer les services :
docker-compose -f docker-compose-whoami.yml up -detdocker-compose -f docker-compose-ha.yml up -d- ❌ Valider depuis l'extérieur : Tester https://test.peis.fr et https://ha.peis.fr depuis un réseau externe (4G)
ℹ️ ACCÈS UTILE :
- Dashboard Traefik : https://traefik.peis.fr (admin/admin123)
- Service Whoami : https://test.peis.fr (à créer)
- Home Assistant : https://ha.peis.fr (déjà dans DNS)
- SSH CT 200 :
ssh -i C:\Users\theo\.ssh\id_ed25519 root@192.168.0.100- Dossier Traefik :
/opt/traefik/- Logs Traefik :
docker logs traefik-proxy💡 NOTES :
- Le 404 sur 192.168.0.100 est normal : Traefik répond uniquement aux noms d'hôte configurés. Utilisez les noms de domaine ou ajoutez une entrée dans votre fichier hosts :
192.168.0.100 traefik.peis.fr test.peis.fr ha.peis.fr- Mot de passe dashboard : admin/admin123 (hash bcrypt dans la config)
- Email Let's Encrypt : theo@peis.fr (déjà configuré en production)
📌 Tes informations personnalisées
- Domaine principal :
peis.fr(hébergé chez Infomaniak sur IP128.65.195.180) - IP publique homelab :
82.67.139.7 - Sous-domaine racine homelab :
lab.peis.fr→82.67.139.7 - Email Let's Encrypt : theo@peis.fr ✅
✅ Email déjà configuré dans les fichiers de configuration.
✅ Important :
peis.fretwww.peis.frrestent hébergés chez Infomaniak (IP128.65.195.180). Seuls les sous-domaines pointant vers82.67.139.7seront gérés par ton homelab.
🔍 Analyse de ta configuration DNS actuelle
Ton DNS est déjà bien configuré chez Infomaniak. Voici ce que j'ai analysé :
✅ Ce qui est correct et à GARDER
| Enregistrement | Type | Valeur | Destination |
|---|---|---|---|
peis.fr |
A | 128.65.195.180 |
Site web Infomaniak |
www.peis.fr |
A | 128.65.195.180 |
Site web Infomaniak |
✅ Ce qui est prêt pour ton homelab
| Enregistrement | Type | Valeur | Résolution finale |
|---|---|---|---|
lab.peis.fr |
A | 82.67.139.7 |
82.67.139.7 |
traefik.peis.fr |
CNAME | lab.peis.fr |
82.67.139.7 |
ha.peis.fr |
CNAME | lab.peis.fr |
82.67.139.7 |
nas.peis.fr |
CNAME | lab.peis.fr |
82.67.139.7 |
frigate.peis.fr |
CNAME | lab.peis.fr |
82.67.139.7 |
mqtt.peis.fr |
CNAME | lab.peis.fr |
82.67.139.7 |
proxmox.peis.fr |
CNAME | lab.peis.fr |
82.67.139.7 |
freebox.peis.fr |
CNAME | lab.peis.fr |
82.67.139.7 |
✅ Conclusion : Tous tes sous-domaines homelab pointent vers
82.67.139.7. Aucune modification DNS n'est nécessaire pour commencer !
📋 Sommaire
- Prérequis
- Architecture recommandée
- Étape 1 : Configuration DNS chez Infomaniak
- Étape 2 : Déploiement du Reverse Proxy (Traefik)
- Étape 3 : Configuration Let's Encrypt
- Étape 4 : Ajout de services derrière le proxy
- Étape 5 : Sécurisation avancée
- Alternative : Nginx Proxy Manager
- Dépannage
- Maintenance
🎯 Prérequis
Matériel & Accès
- ✅ Nom de domaine acheté chez Infomaniak :
peis.fr - ✅ IP publique statique :
82.67.139.7(ou dynamique avec DDNS) pour ton homelab - ✅ Sous-domaine homelab :
lab.peis.fr→82.67.139.7(déjà configuré chez Infomaniak) - ✅ Port forwarding configuré sur ton routeur :
- Port 80 (HTTP) → IP de ton serveur proxy
- Port 443 (HTTPS) → IP de ton serveur proxy
- ✅ Accès SSH à ton serveur Proxmox ou conteneur LXC/Docker
- ✅ Docker ou Podman installé (pour le reverse proxy)
Connaissances nécessaires
- Bases de Linux (commandes
docker,curl,dig) - Configuration DNS de base
- Notions de réseaux (ports, NAT)
🏗️ Architecture recommandée
Internet
↓ (DNS: lab.peis.fr → 82.67.139.7)
Routeur (Port Forwarding 80/443)
↓
Proxmox (192.168.0.94)
↓
Container LXC "traefik-proxy" - CT 200 (IP: 192.168.0.100, HA: ✅)
├─ Traefik v2.10 (Reverse Proxy + Let's Encrypt **PRODUCTION**)
│
├─ Service 1: Nextcloud → https://nextcloud.peis.fr (CNAME lab.peis.fr)
├─ Service 2: Home Assistant → https://ha.peis.fr (CNAME lab.peis.fr)
├─ Service 3: Proxmox → https://proxmox.peis.fr (CNAME lab.peis.fr)
├─ Service 4: Traefik Dashboard → https://traefik.peis.fr (CNAME lab.peis.fr)
├─ Service Test: Whoami → https://test.peis.fr (CNAME lab.peis.fr)
└─ Service N: ...
✅ Configuration DNS actuelle validée :
peis.fretwww.peis.fr→128.65.195.180(Infomaniak - inchangé)lab.peis.fr→82.67.139.7(ton homelab)traefik.peis.fr,nas.peis.fr,ha.peis.fr,frigate.peis.fr,mqtt.peis.fr,proxmox.peis.fr,freebox.peis.fr→ CNAMElab.peis.frtest.peis.fr→ À créer (CNAMElab.peis.fr)→ Tous ces sous-domaines pointent déjà vers ton IP
82.67.139.7et sont prêts pour le HTTPS !
🌐 Étape 1 : Configuration DNS chez Infomaniak
Objectif : Créer les enregistrements DNS nécessaires pour pointer vers ton homelab et permettre la validation Let's Encrypt.
1.1. Accéder à l'interface Infomaniak
- Connecte-toi à https://manager.infomaniak.com
- Sélectionne ton domaine dans "Hébergement" → "Domaines"
- Clique sur "Gérer le domaine" → "DNS"
1.2. ✅ Ta configuration DNS est déjà correcte
Ne modifie PAS les enregistrements suivants (ils sont nécessaires pour ton site Infomaniak) :
| Type | Nom | Valeur | TTL | ⚠️ À GARDER |
|---|---|---|---|---|
| A | @ |
128.65.195.180 |
5 min | Site Infomaniak |
| A | www |
128.65.195.180 |
5 min | Site Infomaniak |
Tes sous-domaines homelab sont déjà configurés :
| Type | Nom | Valeur | TTL | ✅ Pour Homelab |
|---|---|---|---|---|
| A | lab |
82.67.139.7 |
1 min | IP Homelab |
| CNAME | traefik |
lab.peis.fr |
1 h | → 82.67.139.7 |
| CNAME | ha |
lab.peis.fr |
1 h | → 82.67.139.7 |
| CNAME | proxmox |
lab.peis.fr |
1 h | → 82.67.139.7 |
| CNAME | nas |
lab.peis.fr |
1 h | → 82.67.139.7 |
| CNAME | frigate |
lab.peis.fr |
1 h | → 82.67.139.7 |
| CNAME | mqtt |
lab.peis.fr |
1 h | → 82.67.139.7 |
| CNAME | freebox |
lab.peis.fr |
1 h | → 82.67.139.7 |
✅ Aucune modification DNS nécessaire pour commencer ! Tous tes sous-domaines CNAME pointent déjà vers ton IP
82.67.139.7.
1.3. Ajouter des sous-domaines supplémentaires (optionnel)
Si tu veux ajouter d'autres services, crée simplement un CNAME vers lab.peis.fr :
| Type | Nom | Valeur | TTL |
|---|---|---|---|
| CNAME | nextcloud |
lab.peis.fr |
Auto |
| CNAME | grafana |
lab.peis.fr |
Auto |
| CNAME | portainer |
lab.peis.fr |
Auto |
| CNAME | pve |
lab.peis.fr |
Auto |
💡 Pourquoi CNAME ? Tous tes sous-domaines CNAME vers
lab.peis.frhériteront automatiquement de l'IP82.67.139.7. Si tu changes l'IP de ton homelab, il suffira de modifier uniquement l'enregistrement A delab.peis.fr.
1.4. Vérifier la propagation DNS
# Vérifier que peis.fr pointe vers Infomaniak (128.65.195.180)
dig +short peis.fr
# Vérifier que lab.peis.fr et ses CNAME pointent vers 82.67.139.7
dig +short lab.peis.fr
dig +short traefik.peis.fr
dig +short ha.peis.fr
dig +short proxmox.peis.fr
# Sur Windows (cmd)
nslookup peis.fr
nslookup lab.peis.fr
nslookup traefik.peis.fr
nslookup ha.peis.fr
Attends 5-15 minutes si tu as ajouté de nouveaux sous-domaines.
✅ Si tout pointe correctement, passe directement à l'Étape 2 !
1.5. ❌ Wildcard DNS : À ÉVITER dans ton cas
Ne crée PAS d'enregistrement wildcard *.peis.fr → 82.67.139.7 car :
- Conflit avec ton site Infomaniak :
peis.fretwww.peis.frdoivent rester sur128.65.195.180 - Let's Encrypt refusera : Impossible d'obtenir un certificat wildcard si la racine ne pointe pas vers ton serveur
- Validation échouera : Le challenge DNS ou HTTP ne fonctionnera pas
✅ Solution : Utilise des certificats individuels pour chaque sous-domaine (HTTP ou DNS Challenge)
🚀 Étape 2 : Déploiement du Reverse Proxy (Traefik)
Pourquoi Traefik ?
- ✅ Automatisation : Détection automatique des services
- ✅ Let's Encrypt intégré : Gestion des certificats SSL
- ✅ Dashboard : Interface web pour le monitoring
- ✅ Configuration dynamique : Pas besoin de redémarrer pour ajouter un service
- ✅ Support Docker : Intégration native avec les conteneurs
2.1. Préparer l'environnement Docker
Sur ton serveur (Proxmox ou LXC) :
# Installer Docker si ce n'est pas déjà fait
apt update && apt install -y docker.io docker-compose
# Vérifier que Docker fonctionne
docker --version
docker run hello-world
# Créer un réseau Docker dédié pour Traefik
docker network create traefik_network
2.2. Créer la configuration Traefik
Crée un dossier pour Traefik :
mkdir -p /opt/traefik/{config,certs,logs}
cd /opt/traefik
Fichier docker-compose.yml
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config/traefik.yml:/etc/traefik/traefik.yml:ro
- ./config/dynamic.yml:/etc/traefik/dynamic.yml:ro
- ./certs:/etc/traefik/certs
- ./logs:/var/log/traefik
networks:
- traefik_network
labels:
- "traefik.enable=true"
# Dashboard (accès sécurisé)
- "traefik.http.routers.traefik.rule=Host(`traefik.peis.fr`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$9Cv/OMGj$$ZomWQzuQbL.3TRCS81A1g/"
networks:
traefik_network:
external: true
🔒 Note : Le mot de passe pour le dashboard est
admin/admin123(à changer !). Pour générer un hash :htpasswd -nb admin admin123 | openssl passwd -apr1 -stdinURL du dashboard pour toi : https://traefik.peis.fr
Fichier config/traefik.yml
# Configuration globale
api:
dashboard: true
insecure: false
# Entrypoints (ports d'entrée)
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
# Providers (sources de configuration)
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik_network
file:
filename: /etc/traefik/dynamic.yml
watch: true
# Certificats SSL
certificatesResolvers:
letsencrypt:
acme:
email: ton-email@peis.fr
storage: /etc/traefik/certs/acme.json
httpChallenge:
entryPoint: web
# Pour wildcard, utiliser dnsChallenge (voir Étape 3.3)
# dnsChallenge:
# provider: infomaniak
# Logs
log:
level: INFO
filePath: /var/log/traefik/traefik.log
accessLog:
filePath: /var/log/traefik/access.log
Fichier config/dynamic.yml (configuration dynamique)
# Middlewares globaux
http:
middlewares:
# Redirection HTTP → HTTPS
redirect-to-https:
redirectScheme:
scheme: https
permanent: true
# Compression
compress:
compress: {}
# Headers de sécurité
security-headers:
headers:
frameDeny: true
sslRedirect: true
browserXssFilter: true
contentTypeNosniff: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customResponseHeaders:
X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex"
# Routers par défaut
tcp:
routers: {}
services: {}
udp:
routers: {}
services: {}
2.3. Lancer Traefik
cd /opt/traefik
docker-compose up -d
2.4. Vérifier que Traefik fonctionne
# Vérifier les logs
docker logs traefik
# Vérifier que le conteneur est en bonne santé
docker ps
# Accéder au dashboard (après avoir configuré le HTTPS)
# https://traefik.peis.fr
🔐 Étape 3 : Configuration Let's Encrypt
Objectif : Obtenir des certificats SSL automatiques et les renouveler.
3.1. Prérequis pour Let's Encrypt
- ✅ Port 80 ouvert sur ton routeur
- ✅ Domaine configuré chez Infomaniak (Étape 1)
- ✅ Traefik en cours d'exécution (Étape 2)
3.2. Configuration HTTP Challenge (recommandé pour débuter)
Modifie config/traefik.yml pour activer le HTTP Challenge :
certificatesResolvers:
letsencrypt:
acme:
email: ton-email@peis.fr
storage: /etc/traefik/certs/acme.json
httpChallenge:
entryPoint: web
✅ Avantage : Simple à configurer, fonctionne avec tous les hébergeurs. ❌ Inconvénient : Nécessite que le port 80 soit accessible.
3.3. Configuration DNS Challenge (alternative au HTTP Challenge)
Note pour ton setup : Comme peis.fr pointe vers Infomaniak et non vers ton homelab, tu ne peux PAS utiliser de certificat wildcard (*.peis.fr). Cependant, le DNS Challenge reste utile si :
- Tu veux éviter d'ouvrir le port 80 sur ton routeur
- Tu préfères une validation plus discrète
✅ Dans ton cas : Utilise soit :
- HTTP Challenge (plus simple, nécessite port 80 ouvert)
- DNS Challenge (sans wildcard, pour chaque sous-domaine individuel)
Pour configurer le DNS Challenge pour chaque sous-domaine :
3.3.1. Créer un token API Infomaniak
- Va dans Infomaniak Manager
- Compte → API → Créer une clé API
- Donne un nom (ex:
Traefik-LE) - Sélectionne Lecture/Écriture sur Domaines
- Copie la clé API (format :
ABC123-456DEF-789GHI)
3.3.2. Configurer Traefik pour DNS Challenge
Modifie config/traefik.yml :
certificatesResolvers:
letsencrypt:
acme:
email: ton-email@peis.fr
storage: /etc/traefik/certs/acme.json
dnsChallenge:
provider: infomaniak
delayBeforeCheck: 0
# Configuration du provider Infomaniak
providers:
# ... (autres providers)
acme:
dnsChallenge:
providers:
infomaniak:
apiToken: "TA_CLE_API_INFOMANIAK"
Remplace TA_CLE_API_INFOMANIAK par ta clé API.
✅ Avantage : Permet les certificats wildcard, pas besoin d'ouvrir le port 80. ❌ Inconvénient : Plus complexe à configurer.
3.4. Redémarrer Traefik
cd /opt/traefik
docker-compose down && docker-compose up -d
3.5. Tester l'obtention d'un certificat
Ajoute un service de test (ex: whoami) pour vérifier que Let's Encrypt fonctionne :
✅ Utilise
test.peis.fr: Crée un CNAMEtest→lab.peis.frchez Infomaniak (requis)
Fichier docker-compose-whoami.yml
version: '3.8'
services:
whoami:
image: traefik/whoami
container_name: whoami
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami-http.rule=Host(`test.peis.fr`)"
- "traefik.http.routers.whoami-http.entrypoints=web"
- "traefik.http.routers.whoami-http.middlewares=redirect-to-https@file"
- "traefik.http.routers.whoami.rule=Host(`test.peis.fr`)"
- "traefik.http.routers.whoami.entrypoints=websecure"
- "traefik.http.routers.whoami.tls=true"
- "traefik.http.routers.whoami.tls.certresolver=letsencrypt"
- "traefik.http.services.whoami.loadbalancer.server.port=80"
networks:
- traefik_network
networks:
traefik_network:
external: true
Lance le service :
docker-compose -f docker-compose-whoami.yml up -d
Vérifier le certificat
- Accède à
https://test.peis.fr - Vérifie que le cadenas 🔒 apparaît dans la barre d'adresse
- Clique sur le cadenas pour voir les détails du certificat (Let's Encrypt)
Vérifier dans les logs
docker logs traefik-proxy | grep -i "certificate"
Tu devrais voir :
legolog: [INFO] [test.peis.fr] acme: Obtaining bundled SAN certificate
legolog: [INFO] [test.peis.fr] acme: Validations succeeded
📦 Étape 4 : Ajout de services derrière le proxy
Objectif : Configurer tes services pour qu'ils soient accessibles via HTTPS.
4.1. Structure type d'un service
Chaque service doit :
- Être sur le même réseau Docker que Traefik (
traefik_network) - Avoir les labels Docker appropriés pour Traefik
- Ne pas exposer de ports directement (Traefik s'en charge)
4.2. Exemple 1 : Nextcloud
Fichier docker-compose-nextcloud.yml
version: '3.8'
services:
nextcloud:
image: nextcloud:latest
container_name: nextcloud
restart: unless-stopped
volumes:
- /opt/nextcloud/data:/var/www/html/data
- /opt/nextcloud/config:/var/www/html/config
environment:
- NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.peis.fr
labels:
- "traefik.enable=true"
# Router HTTP → HTTPS
- "traefik.http.routers.nextcloud-http.rule=Host(`nextcloud.peis.fr`)"
- "traefik.http.routers.nextcloud-http.entrypoints=web"
- "traefik.http.routers.nextcloud-http.middlewares=redirect-to-https"
# Router HTTPS
- "traefik.http.routers.nextcloud.rule=Host(`nextcloud.peis.fr`)"
- "traefik.http.routers.nextcloud.entrypoints=websecure"
- "traefik.http.routers.nextcloud.tls=true"
- "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt"
# Service
- "traefik.http.services.nextcloud.loadbalancer.server.port=80"
networks:
- traefik_network
# Pas de ports exposés !
networks:
traefik_network:
external: true
4.3. Exemple 2 : Home Assistant
Fichier docker-compose-ha.yml
version: '3.8'
services:
homeassistant:
image: homeassistant/home-assistant:latest
container_name: homeassistant
restart: unless-stopped
volumes:
- /opt/homeassistant/config:/config
- /etc/localtime:/etc/localtime:ro
environment:
- TZ=Europe/Zurich
labels:
- "traefik.enable=true"
- "traefik.http.routers.ha-http.rule=Host(`ha.peis.fr`)"
- "traefik.http.routers.ha-http.entrypoints=web"
- "traefik.http.routers.ha-http.middlewares=redirect-to-https"
- "traefik.http.routers.ha.rule=Host(`ha.peis.fr`)"
- "traefik.http.routers.ha.entrypoints=websecure"
- "traefik.http.routers.ha.tls=true"
- "traefik.http.routers.ha.tls.certresolver=letsencrypt"
- "traefik.http.services.ha.loadbalancer.server.port=8123"
networks:
- traefik_network
networks:
traefik_network:
external: true
4.4. Exemple 3 : Proxmox VE (accès web)
Proxmox utilise le port 8006. Pour l'exposer via Traefik :
💡 Note : Dans ta config DNS,
proxmox.peis.frexiste déjà (CNAME → lab.peis.fr). Tu peux :
- Soit créer un CNAME
pve→lab.peis.frchez Infomaniak- Soit remplacer
pve.peis.frparproxmox.peis.frdans la configuration ci-dessous
Fichier docker-compose-proxmox.yml
version: '3.8'
services:
proxmox-proxy:
image: nginx:alpine
container_name: proxmox-proxy
restart: unless-stopped
volumes:
- ./config/proxmox-nginx.conf:/etc/nginx/nginx.conf:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.pve-http.rule=Host(`pve.peis.fr`)"
- "traefik.http.routers.pve-http.entrypoints=web"
- "traefik.http.routers.pve-http.middlewares=redirect-to-https"
- "traefik.http.routers.pve.rule=Host(`pve.peis.fr`)"
- "traefik.http.routers.pve.entrypoints=websecure"
- "traefik.http.routers.pve.tls=true"
- "traefik.http.routers.pve.tls.certresolver=letsencrypt"
- "traefik.http.services.pve.loadbalancer.server.port=80"
networks:
- traefik_network
networks:
traefik_network:
external: true
Fichier config/proxmox-nginx.conf
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
upstream proxmox {
server 192.168.0.94:8006; # IP de ton serveur Proxmox
}
server {
listen 80;
server_name proxmox.peis.fr;
location / {
proxy_pass https://proxmox;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Désactiver la vérification SSL en amont (Proxmox utilise un cert auto-signé)
proxy_ssl_verify off;
}
}
}
⚠️ Important : Proxmox utilise un certificat auto-signé par défaut. Pour éviter les avertissements, tu peux :
- Importer le certificat Let's Encrypt dans Proxmox (via l'interface web)
- Ou désactiver la vérification SSL comme ci-dessus (moins sécurisé)
4.5. Exemple 4 : Service avec authentification
Pour ajouter une authentification basique à un service :
labels:
- "traefik.enable=true"
- "traefik.http.routers.mon-service.rule=Host(`mon-service.peis.fr`)"
- "traefik.http.routers.mon-service.entrypoints=websecure"
- "traefik.http.routers.mon-service.tls=true"
- "traefik.http.routers.mon-service.tls.certresolver=letsencrypt"
- "traefik.http.routers.mon-service.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$9Cv/OMGj$$ZomWQzuQbL.3TRCS81A1g/"
🔒 Étape 5 : Sécurisation avancée
5.1. Configurer les headers de sécurité
Modifie config/dynamic.yml pour ajouter plus de sécurité :
http:
middlewares:
security-headers:
headers:
# Prévention des attaques
frameDeny: true
sslRedirect: true
browserXssFilter: true
contentTypeNosniff: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
# Politiques de sécurité
customRequestHeaders:
X-Forwarded-Proto: "https"
customResponseHeaders:
X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex"
X-Content-Type-Options: "nosniff"
X-Frame-Options: "DENY"
X-XSS-Protection: "1; mode=block"
Referrer-Policy: "strict-origin-when-cross-origin"
Permissions-Policy: "camera=(), microphone=(), geolocation=()"
5.2. Bloquer l'accès au dashboard Traefik depuis l'extérieur
Modifie les labels du conteneur Traefik dans docker-compose.yml :
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`traefik.peis.fr`) && ClientIP(`192.168.0.0/16`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.middlewares=auth"
⚠️ Note : Remplace
192.168.0.0/16par ton réseau local.
5.3. Configurer le rate limiting
Ajoute dans config/dynamic.yml :
http:
middlewares:
rate-limit:
rateLimit:
average: 100
burst: 50
period: 1m
Puis applique-le à tes services :
labels:
- "traefik.http.routers.mon-service.middlewares=rate-limit"
5.4. Configurer le fail2ban pour Traefik
Installe fail2ban sur ton hôte :
apt install -y fail2ban
Crée un filtre pour Traefik :
# Fichier /etc/fail2ban/filter.d/traefik.conf
[Definition]
failregex = ^.* "<HOST>.*" 401
^.* "<HOST>.*" 403
^.* "<HOST>.*" 404
ignoreregex =
Crée une prison :
# Fichier /etc/fail2ban/jail.d/traefik.conf
[traefik]
enabled = true
port = 80,443
filter = traefik
logpath = /opt/traefik/logs/access.log
maxretry = 3
findtime = 10m
bantime = 1h
Redémarre fail2ban :
systemctl restart fail2ban
🛠️ Dépannage
Problèmes courants
| Problème | Cause possible | Solution |
|---|---|---|
| Certificat non généré | Port 80 bloqué | Vérifie le port forwarding et le firewall |
| Erreur DNS | Enregistrement DNS manquant | Attends la propagation (dig peis.fr) |
| 404 sur le dashboard | URL incorrecte | Vérifie traefik.peis.fr |
| Let's Encrypt rate limit | Trop de demandes | Attends 1 semaine ou utilise le staging |
| Traefik ne détecte pas les services | Réseau Docker incorrect | Vérifie networks: traefik_network |
| Port déjà utilisé | Conflit avec un autre service | netstat -tulnp | grep 80 |
Utiliser le staging de Let's Encrypt
Pour éviter de bloquer ton IP pendant les tests, utilise le staging :
certificatesResolvers:
letsencrypt:
acme:
email: ton-email@peis.fr
storage: /etc/traefik/certs/acme.json
httpChallenge:
entryPoint: web
# Ajoute ceci pour le staging
caServer: https://acme-staging-v02.api.letsencrypt.org/directory
Vérifier les logs Traefik
# Voir les logs en temps réel
docker logs -f traefik
# Filtrer les erreurs
docker logs traefik | grep -i error
# Vérifier les certificats obtenus
docker exec traefik cat /etc/traefik/certs/acme.json | jq
Tester la connectivité
# Tester le port 80
curl -v http://peis.fr
# Tester le port 443
curl -vk https://peis.fr
# Tester depuis l'extérieur (via un VPN ou un smartphone en 4G)
curl -v https://test.peis.fr
curl -v https://ha.peis.fr
Vérifier le port forwarding
Depuis un réseau externe (pas ton réseau local) :
# Tester le port 80
nc -zv 82.67.139.7 80
# Tester le port 443
nc -zv 82.67.139.7 443
Si ça ne fonctionne pas :
- Vérifie ton routeur (port forwarding)
- Vérifie le firewall de ton serveur (
ufw status) - Vérifie que Docker écoute bien sur 0.0.0.0 (
docker ps)
🧹 Maintenance
Renouvellement automatique des certificats
Let's Encrypt renouvelle automatiquement les certificats 30 jours avant expiration. Traefik gère cela automatiquement.
Vérifier la date d'expiration
docker exec traefik cat /etc/traefik/certs/acme.json | jq -r '.letsencrypt.Account.Email, .letsencrypt.Certificates[].Domain.Main, .letsencrypt.Certificates[].Certificate.ExpiresAt'
Sauvegarder les certificats
# Sauvegarder le dossier certs
cd /opt/traefik
tar -czvf traefik-certs-$(date +%Y%m%d).tar.gz certs/
# Copier sur un autre serveur
scp traefik-certs-*.tar.gz user@backup-server:/backups/
Mettre à jour Traefik
cd /opt/traefik
docker-compose pull
docker-compose up -d --remove-orphans
Nettoyer les anciens conteneurs
# Lister les conteneurs arrêtés
docker ps -a --filter "status=exited"
# Supprimer les conteneurs arrêtés
docker container prune
# Supprimer les images non utilisées
docker image prune -a
📊 Exemple complet de configuration
Voici un exemple complet avec plusieurs services :
Structure des fichiers
/opt/traefik/
├── config/
│ ├── traefik.yml
│ ├── dynamic.yml
│ └── proxmox-nginx.conf
├── certs/
│ └── acme.json
├── logs/
├── docker-compose.yml
├── docker-compose-whoami.yml
├── docker-compose-nextcloud.yml
└── docker-compose-ha.yml
Commandes pour tout déployer
# Créer le réseau
docker network create traefik_network
# Lancer Traefik
cd /opt/traefik
docker-compose up -d
# Lancer les services
docker-compose -f docker-compose-whoami.yml up -d
docker-compose -f docker-compose-nextcloud.yml up -d
docker-compose -f docker-compose-ha.yml up -d
📚 Ressources utiles
Outils en ligne
- Let's Encrypt Status - Vérifier l'état du service
- SSL Labs Test - Tester la qualité de ton HTTPS
- DNS Checker - Vérifier la propagation DNS
- HTPasswd Generator - Générer des mots de passe pour Traefik
Documentation officielle
Communautés
- r/homelab (Reddit)
- r/selfhosted (Reddit)
- Traefik GitHub
✅ Checklist finale
- Nom de domaine acheté chez Infomaniak (
peis.fr) - Enregistrements DNS configurés (
lab.peis.fr→82.67.139.7, CNAME pour sous-domaines →lab.peis.fr) - Port forwarding 80/443 configuré sur le routeur (
82.67.139.7:80/443) - Docker installé sur le serveur
- Réseau
traefik_networkcréé - Traefik déployé et accessible
- Certificats Let's Encrypt obtenus (HTTP ou DNS Challenge)
- Dashboard Traefik sécurisé (authentification + accès restreint)
- Services configurés avec HTTPS
- Sauvegarde des certificats et configurations
- Tests de connectivité depuis l'extérieur
🎉 Félicitations !
Ton homelab est maintenant 100% sécurisé avec HTTPS ! 🔒
- Tous tes services sont accessibles via
https://nom-service.peis.fr - Les certificats sont automatiquement renouvelés par Let's Encrypt
- Tu peux ajouter de nouveaux services sans toucher à la configuration SSL
Prochaines étapes possibles :
- Configurer un VPN (WireGuard) pour un accès sécurisé
- Ajouter un monitoring (Grafana + Prometheus)
- Configurer des sauvegardes automatiques
- Explorer Authelia pour une authentification centralisée
Documentation générée pour ton homelab avec ❤️ par Mistral Vibe