# 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_network` créé > - Fichiers de configuration mis à jour dans `/opt/traefik/` > - Documentation whoami créée dans `service-whoami.md` > **🔄 À FAIRE POUR FINALISER :** > 1. ❌ **Déployer les fichiers mis à jour** : Copier les fichiers depuis `traefik-config/` vers `/opt/traefik/` sur CT 200 > 2. ❌ **Renommer le container** : Exécuter `docker rename traefik-new traefik-proxy` (si pas déjà fait) > 3. ❌ **Redémarrer Traefik** : `cd /opt/traefik && docker-compose down && docker-compose up -d` > 4. ❌ **Créer le CNAME test.peis.fr** chez Infomaniak (CNAME → lab.peis.fr) > 5. ❌ **Déployer les services** : `docker-compose -f docker-compose-whoami.yml up -d` et `docker-compose -f docker-compose-ha.yml up -d` > 6. ❌ **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 IP `128.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.fr` et `www.peis.fr` restent hébergés chez Infomaniak (IP `128.65.195.180`). Seuls les sous-domaines pointant vers `82.67.139.7` seront 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 1. [Prérequis](#-prérequis) 2. [Architecture recommandée](#-architecture-recommandée) 3. [Étape 1 : Configuration DNS chez Infomaniak](#-étape-1-configuration-dns-chez-infomaniak) 4. [Étape 2 : Déploiement du Reverse Proxy (Traefik)](#-étape-2-déploiement-du-reverse-proxy-traefik) 5. [Étape 3 : Configuration Let's Encrypt](#-étape-3-configuration-lets-encrypt) 6. [Étape 4 : Ajout de services derrière le proxy](#-étape-4-ajout-de-services-derrière-le-proxy) 7. [Étape 5 : Sécurisation avancée](#-étape-5-sécurisation-avancée) 8. [Alternative : Nginx Proxy Manager](#-alternative-nginx-proxy-manager) 9. [Dépannage](#-dépannage) 10. [Maintenance](#-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.fr` et `www.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` → CNAME `lab.peis.fr` > - `test.peis.fr` → **À créer** (CNAME `lab.peis.fr`) > > → **Tous ces sous-domaines pointent déjà vers ton IP `82.67.139.7` et 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 1. Connecte-toi à [https://manager.infomaniak.com](https://manager.infomaniak.com) 2. Sélectionne ton domaine dans **"Hébergement" → "Domaines"** 3. 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.fr` hériteront automatiquement de l'IP `82.67.139.7`. Si tu changes l'IP de ton homelab, il suffira de modifier uniquement l'enregistrement A de `lab.peis.fr`. ### 1.4. Vérifier la propagation DNS ```bash # 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.fr` et `www.peis.fr` doivent rester sur `128.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) : ```bash # 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 : ```bash mkdir -p /opt/traefik/{config,certs,logs} cd /opt/traefik ``` #### Fichier `docker-compose.yml` ```yaml 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 -stdin` > **URL du dashboard pour toi** : https://traefik.peis.fr #### Fichier `config/traefik.yml` ```yaml # 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) ```yaml # 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 ```bash cd /opt/traefik docker-compose up -d ``` ### 2.4. Vérifier que Traefik fonctionne ```bash # 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 : ```yaml 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 1. Va dans [Infomaniak Manager](https://manager.infomaniak.com) 2. **Compte** → **API** → **Créer une clé API** 3. Donne un nom (ex: `Traefik-LE`) 4. Sélectionne **Lecture/Écriture** sur **Domaines** 5. Copie la **clé API** (format : `ABC123-456DEF-789GHI`) #### 3.3.2. Configurer Traefik pour DNS Challenge Modifie `config/traefik.yml` : ```yaml 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 ```bash 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 CNAME `test` → `lab.peis.fr` chez Infomaniak (requis) #### Fichier `docker-compose-whoami.yml` ```yaml 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 : ```bash docker-compose -f docker-compose-whoami.yml up -d ``` #### Vérifier le certificat 1. Accède à `https://test.peis.fr` 2. Vérifie que le cadenas 🔒 apparaît dans la barre d'adresse 3. Clique sur le cadenas pour voir les détails du certificat (Let's Encrypt) #### Vérifier dans les logs ```bash 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 : 1. Être sur le même réseau Docker que Traefik (`traefik_network`) 2. Avoir les labels Docker appropriés pour Traefik 3. Ne **pas** exposer de ports directement (Traefik s'en charge) ### 4.2. Exemple 1 : Nextcloud #### Fichier `docker-compose-nextcloud.yml` ```yaml 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` ```yaml 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.fr` existe déjà (CNAME → lab.peis.fr). Tu peux : > - Soit créer un CNAME `pve` → `lab.peis.fr` chez Infomaniak > - Soit remplacer `pve.peis.fr` par `proxmox.peis.fr` dans la configuration ci-dessous #### Fichier `docker-compose-proxmox.yml` ```yaml 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` ```nginx 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 : > 1. Importer le certificat Let's Encrypt dans Proxmox (via l'interface web) > 2. 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 : ```yaml 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é : ```yaml 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` : ```yaml 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/16` par ton réseau local. ### 5.3. Configurer le rate limiting Ajoute dans `config/dynamic.yml` : ```yaml http: middlewares: rate-limit: rateLimit: average: 100 burst: 50 period: 1m ``` Puis applique-le à tes services : ```yaml labels: - "traefik.http.routers.mon-service.middlewares=rate-limit" ``` ### 5.4. Configurer le fail2ban pour Traefik Installe fail2ban sur ton hôte : ```bash apt install -y fail2ban ``` Crée un filtre pour Traefik : ```bash # Fichier /etc/fail2ban/filter.d/traefik.conf [Definition] failregex = ^.* ".*" 401 ^.* ".*" 403 ^.* ".*" 404 ignoreregex = ``` Crée une prison : ```bash # 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 : ```bash 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 : ```yaml 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 ```bash # 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é ```bash # 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) : ```bash # 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 : 1. Vérifie ton routeur (port forwarding) 2. Vérifie le firewall de ton serveur (`ufw status`) 3. 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 ```bash 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 ```bash # 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 ```bash cd /opt/traefik docker-compose pull docker-compose up -d --remove-orphans ``` ### Nettoyer les anciens conteneurs ```bash # 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 ```bash # 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](https://letsencrypt.status.io/) - Vérifier l'état du service - [SSL Labs Test](https://www.ssllabs.com/ssltest/) - Tester la qualité de ton HTTPS - [DNS Checker](https://dnschecker.org/) - Vérifier la propagation DNS - [HTPasswd Generator](https://hostingcanada.org/htpasswd-generator/) - Générer des mots de passe pour Traefik ### Documentation officielle - [Traefik Documentation](https://doc.traefik.io/traefik/) - [Let's Encrypt Documentation](https://letsencrypt.org/docs/) - [Infomaniak API Documentation](https://developer.infomaniak.com/) - [Docker Documentation](https://docs.docker.com/) ### Communautés - r/homelab (Reddit) - r/selfhosted (Reddit) - [Traefik GitHub](https://github.com/traefik/traefik) --- ## ✅ 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_network` créé - [ ] 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*