Files
homelab-config/AGENT-TRAEFIK-https-homelab-infomaniak.md

1063 lines
32 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 = ^.* "<HOST>.*" 401
^.* "<HOST>.*" 403
^.* "<HOST>.*" 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*