Plan de Mise en Place d'un Serveur Domestique¶
Date: Janvier 2026
Dernière révision: 23 janvier 2026
Statut: Plan validé - Prêt pour implémentation
Version Proxmox VE: 9.1-1 (basé sur Debian 13 Trixie)
📋 Objectifs du Projet¶
Phase 1 : Serveur Média et Stockage¶
- Jellyfin : Serveur média personnel
- Radarr / Sonarr : Gestion automatisée bibliothèque films/séries
- Client téléchargement Usenet : Acquisition contenu
- Accès réseau local : Partage fichiers réseau domestique
Phase 2 : Sauvegarde et Archivage¶
- Archivage données : Consolidation et déduplication archives dispersées (~1TB)
- Backup Google Photos : Snapshot hebdomadaire 400GB photos/vidéos
- Backup Google Drive : Snapshot hebdomadaire 600GB documents travail/admin
Phase 3 : Applications et Services¶
- Hébergement développement : Git, Node.js, environnements test
- Applications production : Sites web, blogs, bases de données (ex. Umami analytics)
- Interface gestion : Dashboard centralisé (Portainer, Homepage)
Phase 4 : Extension et Migration¶
- Extension stockage : Ajout disques additionnels selon besoin
- Migration ZFS : Transition vers ZFS mirror avec disques identiques (2x8TB)
🖥️ Matériel Disponible¶
PC Serveur Principal¶
CPU : Intel Core i7-2600 (4c/8t @ 3.4GHz, Sandy Bridge 2011)
RAM : 32GB DDR3 (4x 8GB Crucial Ballistix Sport 1600MHz CL9)
GPU : PNY GeForce GTX 970 4GB (optionnelle, sera retirée)
Carte mère : ASUS P8P67 LE Rev 3.0 (Révision B3)
Refroidissement : Noctua avec 2x NF-P12 120mm
Alimentation : Seasonic M12II 520W (80+ Bronze)
Boîtier : Lian Li PC-A05N
Connectivité : Ethernet Gigabit vers box internet
Stockage Interne Disponible¶
✅ SSD #1 : Samsung EVO 850 250GB (actuellement Windows 10)
✅ SSD #2 : Samsung EVO 850 250GB (vierge)
✅ HDD #1 : Hitachi Ultrastar 7K4000 4TB 7200RPM (contient ~1TB archives à préserver)
✅ HDD #2 : WD Caviar Green 1TB SATA2
✅ HDD #3 : WD Caviar Green 1TB SATA2 (inutilisé, sera installé)
Total stockage interne : 6TB brut (500GB SSD + 5.5TB HDD)
Stockage Externe Disponible¶
✅ USB #1 : HGST Touro Mobile 1TB (USB 3.0) - Rotation offsite
❌ USB #2 : Maxtor M3 Portable 4TB (USB 3.0) - NON FONCTIONNEL
Matériel Non Utilisé (Phase 1)¶
❌ GPU GTX 970 : Sera retirée (consommation 145W, iGPU Intel HD 2000 suffisant)
❌ Lecteur DVD : Non nécessaire pour serveur headless
🎯 Solution Retenue : Architecture Finale¶
Système d'Exploitation : Proxmox VE 8.x¶
Choix justifié :
- ✅ Flexibilité : Support VMs + Containers LXC (Docker)
- ✅ Interface web : Gestion complète via GUI (pas de SSH obligatoire)
- ✅ Évolutivité : Ajout facile de VMs Windows/Linux futurs
- ✅ Stabilité : Base Debian, mises à jour LTS
- ✅ Communauté : Large adoption homelab (r/homelab, r/proxmox)
- ✅ Gratuit : Version communautaire sans limitations
Alternatives évaluées :
- Ubuntu Server : Plus simple mais moins flexible (pas de VMs faciles)
- TrueNAS SCALE : Excellent pour NAS pur, moins adapté services-first
Stockage : mergerfs + SnapRAID (Phase 1)¶
Architecture choisie :
┌─────────────────── SYSTÈME ───────────────────┐
│ SSD 250GB #1 → Proxmox VE OS (ext4) │
│ SSD 250GB #2 → LXC/Docker storage (ext4) │
└───────────────────────────────────────────────┘
┌─────────────── DONNÉES PROTÉGÉES ─────────────┐
│ HDD 4TB Partition #1 (1TB) → mergerfs data │
│ HDD 1TB WD Green #1 → mergerfs data │
│ ──────────────────────────────────────── │
│ Total : 2TB fusionnés via mergerfs │
│ Protection : SnapRAID parity sur WD Green #2 │
└───────────────────────────────────────────────┘
┌────────────── MÉDIAS NON-PROTÉGÉS ────────────┐
│ HDD 4TB Partition #2 (3TB) → Jellyfin média │
│ (Redownload acceptable si perte) │
└───────────────────────────────────────────────┘
┌───────────────── BACKUPS ─────────────────────┐
│ USB 1TB HGST → Rotation offsite bi-mensuel │
│ (Maxtor 4TB hors service - besoin remplacement)│
└───────────────────────────────────────────────┘
Capacités utilisables :
- Données critiques protégées : 2TB (archives, configs, backups Google)
- Médias Jellyfin non-protégés : 3TB (films, séries, téléchargements)
- Total : 5TB utilisables pour €0 investissement
Justification technique :
✅ Coût immédiat : €0 (utilise disques existants)
✅ Simplicité : Filesystems ext4 familiers, récupération facile
✅ Flexibilité : Ajout disques futurs sans reconstruction
✅ Protection données critiques : SnapRAID parity 1TB protège archives/backups
✅ Acceptation limitation : Médias jetables non-protégés (redownload possible)
Alternatives évaluées et écartées (Phase 1) :
ZFS Mirror :
- ❌ Nécessite 2ème disque 4TB identique (~€100)
- ❌ Mauvais investissement (remplacé par 2x8TB dans 6-12 mois)
- ❌ Single-disk ZFS inutile (pas de redondance)
- ✅ Solution future : Migration vers ZFS mirror 2x8TB en Phase 4
RAID matériel/mdadm :
- ❌ Disques tailles mixtes (4TB+1TB) gaspillent espace
- ❌ Impossible ajouter disque sans reconstruction complète
Services : Docker dans Containers LXC¶
Stack applicative Phase 1 :
Proxmox Host (32GB RAM)
├─ LXC Media Stack (4GB RAM)
│ ├─ Jellyfin (serveur média)
│ ├─ Sonarr (gestion séries TV)
│ ├─ Radarr (gestion films)
│ └─ Prowlarr (indexers)
│
├─ LXC Downloads (2GB RAM)
│ └─ SABnzbd (client Usenet)
│
├─ LXC Management (1GB RAM)
│ ├─ Portainer (gestion Docker)
│ └─ Homepage (dashboard)
│
└─ Réservé futur (25GB RAM)
└─ VMs Windows, services additionnels
Avantages containers vs VMs :
- ⚡ Performance : Overhead minimal (~5%), partage kernel
- 💾 Efficacité RAM : Jellyfin 300MB vs 2GB+ en VM
- 🚀 Démarrage : 2 secondes vs 30+ secondes
- 📦 Portabilité : docker-compose.yml = setup reproductible
- 🔄 Updates :
docker-compose pull && up -d
Transcoding GPU : Intel iGPU (HD Graphics 2000)¶
Choix justifié :
- ✅ Consommation : 5-10W vs 145W (GTX 970)
- ✅ Économie : €53/an électricité économisée
- ✅ Performance : 2-3 streams 1080p H.264 simultanés suffisants
- ✅ Fiabilité : Pas de ventilateur, silencieux
- ✅ Support QuickSync : Accélération matérielle H.264
Configuration Jellyfin :
jellyfin:
devices:
- /dev/dri:/dev/dri # Passthrough iGPU
environment:
- JELLYFIN_PublishedServerUrl=http://192.168.1.x
GTX 970 sera retirée sauf si besoin futur >4 streams ou HEVC intensif
Accès Distant : Tailscale (Phase 2)¶
Solution retenue :
- 🔐 Sécurité : VPN mesh WireGuard, zéro port exposé
- ⚡ Performance : Connexions peer-to-peer directes
- 🎯 Simplicité : Setup 5 minutes, zéro config réseau
- 💰 Gratuit : Jusqu'à 100 appareils, 3 utilisateurs
- 📱 Multi-plateforme : Windows, Mac, Linux, iOS, Android
Alternative évaluée :
- WireGuard DIY : Plus de contrôle mais gestion manuelle clés/configs
- Cloudflare Tunnel : Seulement pour apps web (pas Jellyfin - viole ToS)
Backups : Stratégie par Criticité Sans Cloud Tiers¶
Hiérarchie données :
| Type | Criticité | Fréquence | Protection | Backup |
|---|---|---|---|---|
| Configs serveur | 🔴 Critique | Modif rare | Git + rsync | Quotidien local + offsite |
| Google Drive | 🟠 Important | Quotidien | rclone snapshot | Hebdo serveur |
| Google Photos | 🟠 Important | Quotidien | rclone snapshot | Hebdo serveur |
| Archives | 🟡 Modéré | Jamais | SnapRAID + USB | Offsite permanent |
| Médias Jellyfin | 🟢 Faible | Fréquent | Aucune | Redownload acceptable |
Existant utilisé :
- Google One Family 2TB (€100/an déjà payé) : PRIMARY pour Drive/Photos
- Serveur : BACKUP de Google (inversion approche classique)
Pas de Backblaze/cloud additionnel : Éviter multiplication services externes
🗓️ PHASE 1 : Fondations Système¶
Etape 1 - Préparation et Sauvegarde - ✅¶
1.1 - Sauvegarder archives Hitachi 4TB¶
- déduplication/consolidation des données faite entre le Hitachi 4To et le disque externe 1TB HGST via FreeFileSync. Les données du disque Hitachi sont sécurisées sur le disque externe.
1.2 - Télécharger Proxmox VE¶
- Télécharger proxmox-ve_9.1-1.iso (~1.8GB) https://www.proxmox.com
- Télécharger Rufus https://rufus.ie
- Installer WD Green 1TB (emplacement SATA libre)
- BIOS : mettre le disque en Removable dans l'UEFI
- Rufus : Activer Lister les disques durs et créer disque bootable Proxmox VE sur le disque 1To
1.3 - Préparer matériel¶
- Retirer le lecteur DVD
- Retirer GTX 970 (économie 145W)
- Noter adresses MAC carte réseau (pour IP statique)
Etape 2 - Installation Proxmox - ✅¶
2.1 - BIOS Configuration¶
🔍 Sources :
- Proxmox VE System Requirements
- Intel VT-x et VT-d : Requis pour virtualisation complète
Reboot → F2 (ou DEL) pour BIOS
├─ Boot
│ ├─ Boot Mode : UEFI (recommandé pour Proxmox VE 9+)
│ ├─ Secure Boot : Disabled (activable après installation si désiré)
│ └─ Boot Order : USB First (pour installation)
├─ Advanced
│ ├─ [REQUIS] Intel Virtualization (VT-x) : Enabled
│ ├─ [REQUIS] Intel SpeedStep : Enabled
│ ├─ [BONUS] Intel VT-d : Enabled (si disponible - pour PCI passthrough)
│ └─ [BONUS] IOMMU : Enabled (si disponible - pour PCI passthrough)
├─ Power Management
│ └─ C-States : Enabled (économie d'énergie)
└─ Save & Exit
📝 Notes :
- VT-x/AMD-V est obligatoire pour KVM
- VT-d/IOMMU n'est nécessaire que si vous voulez faire du PCI passthrough (ex: GPU passthrough)
- Votre CPU i7-2600 supporte VT-x mais PAS VT-d (limitation architecture Sandy Bridge)
- Pas de VT-d = pas de GPU passthrough matériel, mais iGPU passthrough vers containers fonctionne
2.2 - Installation Proxmox VE¶
🔍 Source : Guide d'installation Proxmox VE 9.1
# Écran 1 : Welcome
Install Proxmox VE (Graphical)
# Écran 2 : EULA
Accept (I agree)
# Écran 3 : Target Harddisk
├─ Target Harddisk : /dev/sda (Samsung EVO 250GB #1)
├─ Filesystem : ext4
└─ Advanced Options (laisser par défaut)
├─ hdsize : <vide> (utilise tout le disque sauf 20GB réservés)
├─ swapsize : <vide> (auto: ~8GB pour 32GB RAM)
├─ maxroot : <vide> (auto: ~50GB pour /)
└─ maxvz : <vide> (auto: reste pour /var/lib/vz - VMs/containers)
# Écran 4 : Localisation
├─ Country : France
├─ Time zone : Europe/Paris
└─ Keyboard Layout : French
# Écran 5 : Mot de passe
├─ Password : [MOT_DE_PASSE_FORT_32_CARACTERES]
├─ Confirm : [RÉPÉTER]
└─ Email : votre@email.com
# Écran 6 : Network Configuration
├─ Management Interface : <auto-détecté> (votre carte Ethernet)
├─ Hostname (FQDN) : pve.local.lan (ou pve.home.arpa)
├─ IP Address (CIDR) : <pré-rempli par DHCP> (ex: 192.168.1.100/24)
├─ Gateway : <pré-rempli> (ex: 192.168.1.254)
└─ DNS Server : <pré-rempli> (ex: 192.168.1.254)
# Installation : ~10-15 minutes
# Reboot automatique
⚠️ Important :
- Ne pas modifier les Advanced Options sauf besoin spécifique
- Noter l'IP affichée pour accès Web UI après installation
- L'installateur créera automatiquement 3 partitions (voir étape 3.1)
📚 Référence :
2.3 - Premier accès Web UI¶
Navigateur : https://192.168.1.10:8006
├─ Avertissement certificat : Avancé → Accepter risque
├─ Username : root
├─ Password : [VOTRE_MOT_DE_PASSE]
└─ Realm : Linux PAM
✅ Connexion réussie : Vous devriez voir le dashboard Proxmox avec un popup "No valid subscription" (normal sans abonnement - peut être supprimé à l'étape 2.4-C)
2.4 - Configuration post-installation¶
🔍 Sources officielles :
- Documentation Proxmox VE 9 - Package Repositories
- Proxmox VE 9.1 ISO (basé sur Debian 13 Trixie)
Étape A : Gérer les dépôts via Web UI (MÉTHODE RECOMMANDÉE)
Web UI → Datacenter → [nom-du-noeud] → Updates → Repositories
1. Désactiver le dépôt Enterprise :
├─ Trouver ligne : https://enterprise.proxmox.com/debian/pve (Enabled)
├─ Sélectionner la ligne
├─ Bouton "Disable" en haut
└─ Statut devient "Disabled" ✓
2. Ajouter le dépôt No-Subscription :
├─ Bouton "Add" en haut
├─ Sélectionner "No-Subscription" dans la liste
├─ Bouton "Add"
└─ Nouvelle ligne apparaît : http://download.proxmox.com/debian/pve (Enabled) ✓
3. Vérifier les dépôts Debian :
├─ Doit avoir : http://deb.debian.org/debian (trixie)
├─ Doit avoir : http://security.debian.org/debian-security (trixie-security)
└─ Components doit inclure : main non-free-firmware ✓
4. Rafraîchir les paquets :
├─ Bouton "Refresh" en haut (ou onglet "Updates")
└─ Vérifier qu'aucune erreur n'apparaît
⚠️ Note importante : Les fichiers de dépôts utilisent maintenant le format deb822 moderne (.sources) au lieu du format legacy (.list). Proxmox VE 9.1 vous avertira si vous utilisez l'ancien format.
Étape B : Configuration système via Shell
# Accès Shell : Web UI → Datacenter → [nom-du-noeud] → Shell
# 1. Update système complet
apt update && apt dist-upgrade -y
# 2. Installer outils essentiels
apt install -y vim git curl wget htop iotop ncdu net-tools smartmontools
# 3. Configurer timezone
timedatectl set-timezone Europe/Paris
# 4. Vérifier NTP (activé par défaut sur PVE 9)
timedatectl status
# Devrait montrer : "System clock synchronized: yes"
# 5. Activer firmware non-free (si pas déjà fait)
# Pour microcode CPU et drivers matériels
nano /etc/apt/sources.list.d/debian.sources
# Vérifier que "non-free-firmware" est dans "Components:" de chaque stanza
# Devrait ressembler à : Components: main non-free-firmware
# 6. Reboot pour appliquer tous les changements
reboot
Étape C : Supprimer popup "No valid subscription" (optionnel)
Après reboot, si le popup d'abonnement vous dérange lors de la connexion Web UI :
# Shell Proxmox (Web UI → Node → Shell)
# Commande testée et fonctionnelle sur Proxmox VE 9.1
sed -Ezi.bak "s/(function ?\(orig_cmd\) \{)/\1\n\torig_cmd\(\);\n\treturn;/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service
# Vérifier que le backup a été créé
ls -lh /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js*
# Devrait montrer : proxmoxlib.js et proxmoxlib.js.bak
# Rafraîchir la page Web UI dans le navigateur (Ctrl+F5)
# Le popup ne devrait plus apparaître ✓
🔄 Important : Après chaque mise à jour du paquet proxmox-widget-toolkit, vous devrez ré-exécuter cette commande car le fichier sera écrasé.
🔙 Pour restaurer le comportement original (si nécessaire) :
# Méthode 1 : Restaurer depuis backup (RECOMMANDÉ)
mv /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.bak /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy.service
# Méthode 2 : Télécharger manuellement depuis les dépôts
# Si la commande apt install --reinstall échoue avec "cannot be downloaded"
cd /tmp
apt download proxmox-widget-toolkit
dpkg -x proxmox-widget-toolkit_*.deb extracted/
cp extracted/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js /usr/share/javascript/proxmox-widget-toolkit/
systemctl restart pveproxy.service
# Méthode 3 : Depuis le cache APT (si disponible)
cp /var/cache/apt/archives/proxmox-widget-toolkit_*.deb /tmp/
cd /tmp
dpkg -x proxmox-widget-toolkit_*.deb extracted/
cp extracted/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js /usr/share/javascript/proxmox-widget-toolkit/
systemctl restart pveproxy.service
⚠️ Note sur l'erreur "cannot be downloaded" :
Si apt install --reinstall échoue, c'est souvent parce que :
- Le paquet est déjà à jour et identique dans les dépôts
- Les dépôts ne sont pas correctement configurés (vérifier étape 2.4-A)
- Connexion réseau temporaire défaillante
Dans ce cas, utilisez la Méthode 1 (restauration depuis backup) qui fonctionne toujours.
📚 Sources :
- Proxmox Wiki - Package Repositories (officiel)
- Guide suppression popup (communauté, testé jusqu'à PVE 8.4, fonctionne sur 9.1)
- Proxmox VE 9.1 Datasheet (novembre 2025)
Etape 3 - Configuration Stockage - ✅¶
3.1 - Identifier disques¶
# Lister tous les disques
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL
# Identifier par numéro série (méthode fiable)
ls -l /dev/disk/by-id/ | grep -v part
📊 Résultat réel (configuration actuelle) :
NAME SIZE TYPE FSTYPE MOUNTPOINT MODEL
sda 232.9G disk Samsung SSD 850 EVO 2
├─sda1 1007K part
├─sda2 1G part vfat
└─sda3 229G part LVM2_member
├─pve-swap 8G lvm swap [SWAP]
├─pve-root 67.2G lvm ext4 /
├─pve-data_tmeta 1.4G lvm
│ └─pve-data 135G lvm
└─pve-data_tdata 135G lvm
└─pve-data 135G lvm
sdb 232.9G disk Samsung SSD 850 EVO 2
├─sdb1 232.4G part ntfs
└─sdb2 531M part ntfs
sdc 3.6T disk HGST HDS724040ALE640
├─sdc1 128M part
└─sdc2 3.6T part ntfs
sdd 931.5G disk WDC WD10EADS-65L5B1
└─sdd1 931.5G part ntfs
sde 931.5G disk iso9660 WDC WD10EARS-00Y5B1
├─sde1 286K part
├─sde2 8M part vfat
├─sde3 1.7G part hfsplus
└─sde4 300K part
Analyse configuration actuelle :
- sda (233GB) : Samsung SSD - Proxmox VE OS installé ✓
- sdb (233GB) : Samsung SSD - NTFS (données Windows) → À formatter pour LXC storage
- sdc (3.6TB) : Hitachi 4TB - NTFS (contient archives ~1TB) → À repartitionner
- sdd (931GB) : WD Green 1TB #1 - NTFS → À formatter pour données protégées
- sde (931GB) : WD Green 1TB #2 - Disque bootable Proxmox USB
⚠️ Important avant de continuer :
- sde est le disque USB bootable utilisé pour installer Proxmox (contient ISO)
- Vous devez le reformater uniquement après avoir confirmé que Proxmox boot correctement depuis sda
- Sauvegarder les données importantes de sdb (NTFS) et sdc (NTFS archives) avant formatage
3.2 - Partitionner Hitachi 4TB (sdc)¶
# ⚠️ ATTENTION : Ceci effacera TOUTES les données de sdc
# Assurez-vous que le backup est complet avant de continuer
# Partition 1 : 1TB protégé
# Partition 2 : 2.6TB médias non-protégés
parted /dev/sdc
(parted) mklabel gpt
(parted) unit GB
(parted) mkpart primary ext4 0 1000 # 0-1TB
(parted) mkpart primary ext4 1000 100% # 1TB-3.6TB
(parted) name 1 data-protected
(parted) name 2 media-bulk
(parted) print # Vérifier
(parted) quit
3.3 - Formatter tous les disques¶
# ⚠️ ATTENTION : Ces commandes effaceront toutes les données
# Vérifiez bien que les sauvegardes sont complètes
# Disques données protégées
mkfs.ext4 -L data1-protected /dev/sdc1 # Hitachi 1TB partition
mkfs.ext4 -L data2-protected /dev/sdd1 # WD Green 1TB #1
# Médias non-protégés
mkfs.ext4 -L media-bulk /dev/sdc2 # Hitachi 2.6TB partition
# SSD Docker/LXC
mkfs.ext4 -L lxc-storage /dev/sdb1 # Samsung SSD 233GB
# Disque parity SnapRAID
mkfs.ext4 -L parity /dev/sde1 # WD Green 1TB #2 (parity)
# Vérifier labels
blkid | grep LABEL
📝 Note architecture stockage finale :
Sans sde (disque USB retiré), vous aurez :
- Données protégées : 2TB (1TB sdc1 + 1TB sdd1) via mergerfs
- Médias non-protégés : 2.6TB (sdc2)
- LXC/Docker : 233GB SSD (sdb1)
- ⚠️ Pas de parity : Vous devrez brancher sde formaté OU acheter nouveau disque
3.4 - Créer points de montage¶
mkdir -p /mnt/{disk1,disk2,storage,media-bulk,lxc-data,parity}
# Obtenir UUIDs
blkid | grep -E 'data1-protected|data2-protected|media-bulk|lxc-storage|parity'
# Éditer /etc/fstab
nano /etc/fstab
# Ajouter à /etc/fstab (remplacer UUIDs par valeurs réelles obtenues avec blkid) :
# Données protégées mergerfs
UUID=xxxx-xxxx /mnt/disk1 ext4 defaults,noatime 0 2 # sdc1 (Hitachi 1TB)
UUID=yyyy-yyyy /mnt/disk2 ext4 defaults,noatime 0 2 # sdd1 (WD Green 1TB)
# Médias non-protégés
UUID=aaaa-aaaa /mnt/media-bulk ext4 defaults,noatime 0 2 # sdc2 (Hitachi 2.6TB)
# LXC storage
UUID=bbbb-bbbb /mnt/lxc-data ext4 defaults,noatime 0 2 # sdb1 (Samsung SSD 233GB)
# Disque parity SnapRAID
UUID=zzzz-zzzz /mnt/parity ext4 defaults,noatime 0 2 # sde1 (WD Green 1TB)
3.5 - Installer mergerfs¶
# Télécharger dernière version mergerfs
cd /tmp
wget https://github.com/trapexit/mergerfs/releases/download/2.40.2/mergerfs_2.40.2.debian-bookworm_amd64.deb
# Installer
dpkg -i mergerfs_*.deb
# Ajouter à /etc/fstab
nano /etc/fstab
# Ajouter ligne mergerfs (à la fin du fichier) :
/mnt/disk* /mnt/storage fuse.mergerfs allow_other,use_ino,cache.files=auto-full,moveonenospc=true,category.create=mfs,dropcacheonclose=true,minfreespace=50G 0 0
# Monter mergerfs
mount /mnt/storage
# Vérifier capacité totale
df -h /mnt/storage
# Devrait montrer ~2TB (1TB sdc1 + 1TB sdd1)
# Test écriture
touch /mnt/storage/test.txt
ls -la /mnt/storage/
rm /mnt/storage/test.txt
3.8 - Configurer SnapRAID¶
# Installer SnapRAID
apt install -y snapraid
# Créer répertoire content
mkdir -p /var/snapraid
# Configuration
nano /etc/snapraid.conf
# /etc/snapraid.conf
# Parity file
parity /mnt/parity/snapraid.parity
# Content files (3 emplacements minimum recommandé)
content /var/snapraid/snapraid.content
content /mnt/disk1/.snapraid.content
content /mnt/disk2/.snapraid.content
# Data disks
data d1 /mnt/disk1
data d2 /mnt/disk2
# Exclusions
exclude *.tmp
exclude *.!qB
exclude *.part
exclude /downloads/incomplete/
exclude /downloads/*/.incomplete/
exclude .Trash-*/
exclude .DS_Store
exclude Thumbs.db
exclude .AppleDouble
exclude ._*
# Options
block_size 256
autosave 500
3.9 - Créer structure données¶
# Données PROTÉGÉES (mergerfs)
mkdir -p /mnt/storage/{archives,google-drive-backup,google-photos-backup,docker-configs,backups}
# Médias NON-PROTÉGÉS
mkdir -p /mnt/media-bulk/{movies,tv,downloads}
# Lien symbolique pour accès unifié
ln -s /mnt/media-bulk /mnt/storage/media
# Permissions
chown -R root:root /mnt/storage
chmod -R 755 /mnt/storage
chown -R root:root /mnt/media-bulk
chmod -R 755 /mnt/media-bulk
3.10 - Restaurer archives depuis backup
# Brancher USB HGST 1TB (contenant backup fait à l'étape 3.3)
# Devrait apparaître /dev/sdf (vérifier avec lsblk)
mkdir -p /mnt/usb-backup
mount /dev/sdf1 /mnt/usb-backup
# Copier archives vers stockage protégé
rsync -avhP --info=progress2 /mnt/usb-backup/archives-backup/ /mnt/storage/archives/
# Vérifier intégrité post-copie
du -sh /mnt/storage/archives/
du -sh /mnt/usb-backup/archives-backup/
# Les tailles doivent correspondre
# Démonter USB
umount /mnt/usb-backup
# Si SnapRAID configuré, lancer sync avec nouvelles données
# snapraid sync
📊 Récapitulatif configuration stockage finale :
✅ SSD sda (233GB) : Proxmox VE OS
├─ 67GB : Système root
├─ 135GB : VM/CT storage (pve-data)
└─ 8GB : Swap
✅ SSD sdb (233GB) : LXC/Docker storage (ext4)
└─ /mnt/lxc-data
✅ HDD sdc (3.6TB) : Split données/médias
├─ sdc1 (1TB) : Données protégées → /mnt/disk1 → mergerfs
└─ sdc2 (2.6TB) : Médias non-protégés → /mnt/media-bulk
✅ HDD sdd (931GB) : Données protégées
└─ sdd1 (931GB) : → /mnt/disk2 → mergerfs
✅ HDD sde (931GB) : parity SnapRAID
📦 Capacités finales :
• Données protégées (mergerfs) : ~2TB
• Médias non-protégés : ~2.6TB
• LXC/Docker configs : ~233GB SSD
• TOTAL utilisable : ~4.8TB
🗓️ PHASE 2 : Services et Applications¶
Etape 4 : Conteneur Docker Principal – ✅¶
4.1 - Créer LXC Container¶
# Proxmox Web UI → Create CT
General:
├─ Node : pve
├─ CT ID : 100
├─ Hostname : docker-media
├─ Unprivileged container : ✓ (coché)
├─ Nesting : ✓ (coché - important pour Docker)
└─ Password : [MOT_DE_PASSE_CONTAINER]
Template:
├─ Storage : local
└─ Template : debian-12-standard_12.2-1_amd64.tar.zst
(Download si absent : local → CT Templates → Download)
Disks:
├─ Storage : local-lvm
├─ Disk size (GB) : 32
└─ Mount Options : noatime
CPU:
├─ Cores : 4
└─ (laisser autres options par défaut)
Memory:
├─ Memory (MB) : 4096
├─ Swap (MB) : 512
Network:
├─ Bridge : vmbr0
├─ IPv4 : Static
├─ IPv4/CIDR : 192.168.1.100/24
├─ Gateway (IPv4) : 192.168.1.254
└─ IPv6 : SLAAC
DNS:
├─ DNS domain : local.lan
└─ DNS servers : 192.168.1.254
Confirm → Create
4.2 - Configurer montage partages stockage¶
# Proxmox Shell (pas dans container)
# Éditer config LXC
nano /etc/pve/lxc/100.conf
# Ajouter en fin de fichier :
# Mount point données protégées (mergerfs)
mp0: /mnt/storage,mp=/mnt/storage
# Mount point médias non-protégés
mp1: /mnt/media-bulk,mp=/mnt/media
# Mount point configs Docker
mp2: /mnt/lxc-data/docker-100,mp=/opt/docker
# Créer répertoire configs Docker sur host
mkdir -p /mnt/lxc-data/docker-100
# Start container
pct start 100
# Accéder console
pct enter 100
4.3 - Installer Docker dans LXC¶
# Dans container (pct enter 100)
# Update système
apt update && apt upgrade -y
# Installer prérequis
apt install -y ca-certificates curl gnupg lsb-release
# Ajouter clé GPG Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Ajouter repository Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Installer Docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Vérifier installation
docker --version
docker compose version
# Démarrer Docker
systemctl enable docker
systemctl start docker
# Test
docker run hello-world
4.4 - Configurer GPU passthrough (iGPU Intel)¶
# Sur Proxmox HOST (pas container)
# Vérifier iGPU détecté
ls -la /dev/dri
# Devrait montrer : card0, renderD128
# Ajouter à config LXC
nano /etc/pve/lxc/100.conf
# Ajouter :
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir 0 0
# Restart container
pct stop 100
pct start 100
pct enter 100
# Dans container, vérifier
ls -la /dev/dri
# Devrait montrer : card0, renderD128
4.5 - Créer stack Docker media¶
# Dans container
cd /opt/docker
mkdir -p jellyfin sonarr radarr prowlarr sabnzbd
# Créer docker-compose.yml
nano docker-compose.yml
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
network_mode: host
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
- JELLYFIN_PublishedServerUrl=http://192.168.1.100
volumes:
- ./jellyfin/config:/config
- ./jellyfin/cache:/cache
- /mnt/media:/media:ro
devices:
- /dev/dri:/dev/dri
restart: unless-stopped
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- ./sonarr:/config
- /mnt/media/tv:/tv
- /mnt/media/downloads:/downloads
ports:
- 8989:8989
restart: unless-stopped
radarr:
image: linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- ./radarr:/config
- /mnt/media/movies:/movies
- /mnt/media/downloads:/downloads
ports:
- 7878:7878
restart: unless-stopped
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- ./prowlarr:/config
ports:
- 9696:9696
restart: unless-stopped
sabnzbd:
image: linuxserver/sabnzbd:latest
container_name: sabnzbd
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- ./sabnzbd:/config
- /mnt/media/downloads:/downloads
- /mnt/media/downloads/incomplete:/incomplete-downloads
ports:
- 8080:8080
restart: unless-stopped
networks:
default:
driver: bridge
# Démarrer stack
docker compose up -d
# Vérifier containers
docker compose ps
# Vérifier logs
docker compose logs -f jellyfin
Etape 5 : Configuration Applications – ✅¶
5.1 - Jellyfin Setup¶
Navigateur : http://192.168.1.100:8096
# Premier lancement - Wizard
1. Langue : Français
2. Utilisateur :
├─ Name : [VOTRE_NOM]
└─ Password : [MOT_DE_PASSE_FORT]
3. Bibliothèques médias :
├─ Ajouter → Films
│ ├─ Type : Films
│ ├─ Dossier : /media/movies
│ └─ Langue : Français
├─ Ajouter → Séries
│ ├─ Type : Séries TV
│ ├─ Dossier : /media/tv
│ └─ Langue : Français
4. Langue des métadonnées : Français
5. Accès distant : Laisser par défaut
6. Terminer
# Configuration avancée
Dashboard → Lecture
├─ Transcodage
│ ├─ Accélération matérielle : Intel QuickSync (QSV)
│ ├─ Activer décodage : H264, MPEG2, VC1
│ ├─ Activer encodage : H264
│ └─ Mode tonemap : VPP
└─ Enregistrer
# Tester transcoding
Lire vidéo → Paramètres lecture → Qualité → 720p 3Mbps
# Dashboard → Activité → Devrait montrer "Hw" pour transcoding
5.2 - Prowlarr Configuration (Indexers)¶
http://192.168.1.100:9696
# Setup initial
1. Authentification
├─ Auth Method : Forms
├─ Username : admin
└─ Password : [MOT_DE_PASSE]
2. Indexers → Add Indexer
# Exemples gratuits pour tests :
├─ The Pirate Bay
├─ 1337x
├─ RARBG
└─ ... (selon disponibilité légale dans votre pays)
3. Settings → Apps
├─ Add Application → Sonarr
│ ├─ Prowlarr Server : http://localhost:9696
│ ├─ Sonarr Server : http://192.168.1.100:8989
│ ├─ API Key : [Obtenir depuis Sonarr → Settings → General]
│ └─ Sync Level : Full Sync
├─ Add Application → Radarr
│ ├─ Prowlarr Server : http://localhost:9696
│ ├─ Radarr Server : http://192.168.1.100:7878
│ ├─ API Key : [Obtenir depuis Radarr → Settings → General]
│ └─ Sync Level : Full Sync
└─ Test → Save
5.3 - SABnzbd Configuration¶
http://192.168.1.100:8080
# Wizard initial
1. Langue : English (interface, pas de VF complète)
2. Server :
├─ Host : [VOTRE_PROVIDER_USENET]
├─ Port : 563 (SSL)
├─ Username : [COMPTE_USENET]
├─ Password : [MOT_DE_PASSE_USENET]
└─ Connections : 20
3. Test connexion → Next
# Configuration folders
Config → Folders
├─ Temporary Download Folder : /incomplete-downloads
├─ Completed Download Folder : /downloads/complete
└─ Save
# Configuration catégories
Config → Categories
├─ tv : /downloads/complete/tv
├─ movies : /downloads/complete/movies
└─ Save
5.4 - Sonarr Configuration¶
http://192.168.1.100:8989
# Settings → Media Management
├─ Episode Naming
│ ├─ Rename Episodes : ✓
│ ├─ Standard : {Series Title} - S{season:00}E{episode:00} - {Episode Title}
├─ Root Folders
│ └─ Add : /tv
└─ Save
# Settings → Download Clients
├─ Add → SABnzbd
│ ├─ Name : SABnzbd
│ ├─ Host : 192.168.1.100
│ ├─ Port : 8080
│ ├─ API Key : [Obtenir depuis SABnzbd → Config → General]
│ ├─ Category : tv
│ └─ Test → Save
# Settings → General
└─ API Key : [Noter pour Prowlarr]
# Quality Profiles (recommandations TRaSH Guides)
Settings → Profiles
├─ HD-1080p
│ ├─ Upgrades Allowed : ✓
│ ├─ Upgrade Until : Bluray-1080p
│ └─ Qualities : HDTV-1080p, WEBRip-1080p, WEBDL-1080p, Bluray-1080p
5.5 - Radarr Configuration (identique Sonarr)¶
http://192.168.1.100:7878
# Même procédure que Sonarr
├─ Root Folder : /movies
├─ Download Client : SABnzbd (category: movies)
└─ Quality Profile : HD-1080p
5.6 - Test complet automatisation¶
1. Sonarr → Series → Add New
├─ Rechercher série test
├─ Root Folder : /tv
├─ Quality Profile : HD-1080p
├─ Monitored : All Episodes
└─ Add + Search
2. Vérifier workflow :
├─ Sonarr → Activity (recherche indexers)
├─ SABnzbd → Queue (téléchargement)
├─ SABnzbd → History (extraction)
├─ Sonarr → Activity (import)
└─ Jellyfin → Library (apparition automatique)
3. Succès si :
├─ Épisode apparaît dans Jellyfin
├─ Métadonnées (poster, description) chargées
└─ Lecture fonctionne avec transcoding
Etape 6 : Management et Monitoring – ✅¶
6.1 - Créer LXC Management¶
# Proxmox → Create CT
General:
├─ CT ID : 101
├─ Hostname : management
└─ [Même config que container 100 mais 1GB RAM]
# Démarrer et installer Docker (même procédure)
# Créer docker-compose.yml
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
ports:
- 9000:9000
- 9443:9443
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
restart: unless-stopped
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
ports:
- 3000:3000
volumes:
- ./homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
volumes:
portainer_data:
6.2 - Configurer Homepage Dashboard¶
---
- Media:
- Jellyfin:
href: http://192.168.1.100:8096
description: Serveur média
icon: jellyfin.svg
- Sonarr:
href: http://192.168.1.100:8989
description: Gestion séries TV
icon: sonarr.svg
- Radarr:
href: http://192.168.1.100:7878
description: Gestion films
icon: radarr.svg
- Prowlarr:
href: http://192.168.1.100:9696
description: Indexers
icon: prowlarr.svg
- Downloads:
- SABnzbd:
href: http://192.168.1.100:8080
description: Client Usenet
icon: sabnzbd.svg
- Management:
- Proxmox:
href: https://192.168.1.10:8006
description: Hyperviseur
icon: proxmox.svg
- Portainer:
href: https://192.168.1.100:9443
description: Gestion Docker
icon: portainer.svg
- Homepage:
href: http://192.168.1.101:3000
description: Dashboard
icon: homepage.svg
6.3 - Accès Dashboard¶
http://192.168.1.101:3000
# Dashboard montrant tous les services
# Un clic = accès direct application
Etape 7 : Sécurité et Finalisation¶
7.1 - Sécuriser SSH Proxmox - ❌ NON APPLIQUE¶
# Proxmox Shell
# Changer port SSH
nano /etc/ssh/sshd_config
# Modifier :
Port 2222
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
# Générer clé SSH depuis PC (si pas déjà fait)
# Sur PC : ssh-keygen -t ed25519 -a 100
# Copier clé publique vers serveur
# Sur PC : ssh-copy-id -p 22 root@192.168.1.10
# (Avant changement port)
# Tester connexion avec clé
ssh -p 22 root@192.168.1.10
# Si succès, redémarrer SSH
systemctl restart sshd
# Tester nouveau port
ssh -p 2222 root@192.168.1.10
7.2 - Installer Fail2Ban - ✅¶
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
[proxmox]
enabled = true
port = 8006
logpath = /var/log/daemon.log
maxretry = 3
7.3 - Configurer Firewall UFW¶
apt install -y ufw
# Règles par défaut
ufw default deny incoming
ufw default allow outgoing
# Autoriser services
ufw allow 2222/tcp comment 'SSH'
ufw allow from 192.168.1.0/24 to any port 8006 proto tcp comment 'Proxmox Web'
ufw allow from 192.168.1.0/24 comment 'LAN complet'
# Activer
ufw enable
# Vérifier
ufw status verbose
7.4 - Script Backup Automatique Configs¶
#!/bin/bash
# Backup configurations critiques
BACKUP_DIR="/mnt/storage/backups/configs"
DATE=$(date +%Y%m%d-%H%M)
BACKUP_FILE="$BACKUP_DIR/server-configs-$DATE.tar.gz"
# Créer répertoire si absent
mkdir -p $BACKUP_DIR
# Backup Proxmox configs
tar -czf $BACKUP_FILE \
/etc/pve/ \
/etc/network/interfaces \
/etc/hosts \
/etc/fstab \
/etc/snapraid.conf \
/opt/backup-scripts/ \
/mnt/lxc-data/docker-100/ \
2>/dev/null
# Liste paquets installés
dpkg --get-selections > $BACKUP_DIR/packages-$DATE.list
# Cleanup anciens backups (garder 30 jours)
find $BACKUP_DIR -name "server-configs-*.tar.gz" -mtime +30 -delete
find $BACKUP_DIR -name "packages-*.list" -mtime +30 -delete
# Log
echo "Backup completed: $BACKUP_FILE ($(du -h $BACKUP_FILE | cut -f1))" | \
tee -a /var/log/backup-configs.log
# Copier vers USB si monté
if mountpoint -q /mnt/usb-backup; then
rsync -a $BACKUP_DIR/ /mnt/usb-backup/configs/
echo "USB backup synced" | tee -a /var/log/backup-configs.log
fi
chmod +x /opt/backup-scripts/backup-configs.sh
# Tester
/opt/backup-scripts/backup-configs.sh
# Automatiser (cron quotidien 3h)
crontab -e
# Ajouter :
0 3 * * * /opt/backup-scripts/backup-configs.sh
7.5 - Backup Automatique avec PBS et Cloud - ✅¶
7.5.1 - Activer démarrage automatique LXC - ✅¶
# Proxmox Shell - Activer onboot pour CT 100 et 101
pct set 100 --onboot 1
pct set 101 --onboot 1
pct set 102 --onboot 1 # PBS
# Vérifier configuration
grep onboot /etc/pve/lxc/100.conf
grep onboot /etc/pve/lxc/101.conf
grep onboot /etc/pve/lxc/102.conf
# Devrait afficher : onboot: 1
# Test redémarrage complet
reboot
# Après reboot, vérifier containers démarrés
pct list
# Status devrait montrer "running" pour CT 100, 101, 102
# Vérifier Docker auto-start dans containers
pct enter 100
docker ps
# Tous les services (jellyfin, sonarr, radarr...) doivent être "Up"
✅ Résultat : Serveur redémarre automatiquement et pleinement fonctionnel
7.5.2 - Installation Proxmox Backup Server - ✅¶
Container LXC créé :
- CT ID : 102
- Hostname : pbs
- RAM : 2048 MB
- Disk : 100GB (local-lvm)
- IP : 192.168.1.102/24
- Auto-start : Activé
# Installation PBS dans CT 102
pct enter 102
# Ajouter repository
echo "deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription" > /etc/apt/sources.list.d/pbs.list
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
# Installer
apt update && apt install proxmox-backup-server -y
# Vérifier
systemctl status proxmox-backup.service
systemctl status proxmox-backup-proxy.service
Accès Web UI : https://192.168.1.102:8007
7.5.3 - Configuration Datastore PBS - ✅¶
# Sur host Proxmox - Créer datastore sur stockage protégé
mkdir -p /mnt/storage/pbs-datastore
chown -R 34:34 /mnt/storage/pbs-datastore # UID backup:backup
# Ajouter mount point au CT PBS
nano /etc/pve/lxc/102.conf
# Ajouter ligne :
mp0: /mnt/storage/pbs-datastore,mp=/mnt/datastore
# Restart container
pct stop 102 && pct start 102
Configuration dans PBS Web UI :
Configuration → Datastore → Add Datastore
├─ Name: backups
├─ Backing Path: /mnt/datastore
├─ GC Schedule: daily 02:00
├─ Prune Schedule: daily 03:00
├─ Keep Last: 7
├─ Keep Weekly: 4
├─ Keep Monthly: 6
└─ Verify Schedule: weekly sunday 04:00
7.5.4 - Connexion Proxmox → PBS - ✅¶
# Proxmox Web UI
Datacenter → Storage → Add → Proxmox Backup Server
├─ ID: pbs-backups
├─ Server: 192.168.1.102
├─ Port: 8007
├─ Username: root@pam
├─ Datastore: backups
└─ Enable: ✓
# Créer job backup
Datacenter → Backup → Add
├─ Node: pve
├─ Storage: pbs-backups
├─ Schedule: Daily 03:00
├─ VMs: 100, 101
├─ Compression: zstd
├─ Mode: Snapshot
└─ Enable: ✓
Ancien backup Proxmox local désactivé (remplacé par PBS)
7.5.5 - Sync Google Drive - ✅¶
# Dans CT PBS (102)
pct enter 102
# Installer rclone
curl https://rclone.org/install.sh | bash
# Configurer OAuth Google Drive
rclone config
# name: gdrive
# storage: drive (Google Drive)
# scope: drive (Full access)
# [Suivre wizard OAuth dans navigateur]
# Test connexion
rclone ls gdrive:
# Créer répertoires
rclone mkdir gdrive:backup/homeserver/pbs
Script sync automatique vers Google Drive :
cat > /usr/local/bin/pbs-sync-gdrive << 'EOF'
#!/bin/bash
# Sync PBS datastore vers Google Drive
PBS_DIR="/mnt/datastore"
GDRIVE_DIR="gdrive:backup/homeserver/pbs"
LOG="/var/log/pbs-gdrive-sync.log"
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"
}
log "=== Starting PBS → Google Drive sync ==="
if rclone sync "$PBS_DIR" "$GDRIVE_DIR" \
--bwlimit 10M \
--progress \
--log-file "$LOG" \
--transfers 4 \
--checkers 8 \
--exclude '.lock' \
--exclude '.chunks/**'; then
log "✓ Sync completed"
USAGE=$(rclone size "$GDRIVE_DIR" --json 2>/dev/null | grep -oP '"bytes":\K[0-9]+' || echo "0")
USAGE_GB=$((USAGE / 1024 / 1024 / 1024))
log "Google Drive used: ${USAGE_GB}GB"
else
log "✗ Sync FAILED"
exit 1
fi
log "=== Sync completed ==="
EOF
chmod +x /usr/local/bin/pbs-sync-gdrive
# Test manuel
/usr/local/bin/pbs-sync-gdrive
# Automatiser avec cron quotidien 4h
crontab -e
# Ajouter ligne :
0 4 * * * /usr/local/bin/pbs-sync-gdrive
Estimation espace Google Drive utilisé :
- PBS backups CT 100/101 : ~4GB par jour
- 7 jours rétention avec déduplication : ~20-30GB
- Espace disponible restant : ~1970GB / 2TB ✅
7.5.6 - Procédures Recovery¶
🔄 Restore Container Complet
# Depuis PBS (après crash container)
pct restore <VMID> pbs-backups:ct/<ID>/<SNAPSHOT-ID> \
--storage local-lvm --rootfs 32
# Exemple : Restore CT 100
pct restore 100 pbs-backups:ct/100/2026-01-24T03:00:00Z \
--storage local-lvm --rootfs 32
# Reconfigurer mount points
nano /etc/pve/lxc/100.conf
# Ajouter :
mp0: /mnt/storage,mp=/mnt/storage
mp1: /mnt/media-bulk,mp=/mnt/media
mp2: /mnt/lxc-data/docker-100,mp=/opt/docker
# Activer auto-start et démarrer
pct set 100 --onboot 1
pct start 100
# Vérifier services
sleep 30
pct enter 100
docker ps # Tous les conteneurs doivent être UP
📄 Restore Fichier Individuel (via PBS Web UI)
1. Accéder PBS : https://192.168.1.102:8007
2. Datastore: backups → ct/<ID>/<DATE>
3. Files → Browse filesystem
4. Naviguer vers fichier (ex: /opt/docker/docker-compose.yml)
5. Download
6. Copier fichier restauré vers container
💾 Restore depuis Google Drive (après sinistre total)
# Après réinstallation Proxmox + CT PBS
# Dans CT PBS
rclone sync gdrive:backup/homeserver/pbs /mnt/datastore \
--progress \
--bwlimit 50M
# Attendre fin sync (peut prendre 1-2h selon taille)
# Puis restore containers normalement via PBS UI
🚨 Recovery Complet Après Crash Disque Proxmox
# 1. Réinstaller Proxmox VE 9.1 (ISO USB)
# - IP: 192.168.1.10/24
# - Gateway: 192.168.1.254
# - Disk: Samsung SSD sda
# 2. Configurer stockage
# Recréer /etc/fstab manuellement (voir section 3.4)
mount -a
# 3. Créer CT PBS (102)
# [Suivre étapes 7.5.2]
# 4. Restore depuis Google Drive
pct enter 102
rclone sync gdrive:backup/homeserver/pbs /mnt/datastore
# 5. Restore containers
pct restore 100 pbs-backups:ct/100/[LATEST] --storage local-lvm --rootfs 32
pct restore 101 pbs-backups:ct/101/[LATEST] --storage local-lvm --rootfs 32
# 6. Reconfigurer mount points (éditer /etc/pve/lxc/*.conf)
# 7. Démarrer
pct set 100 --onboot 1 && pct start 100
pct set 101 --onboot 1 && pct start 101
# 8. Validation
pct enter 100
docker ps
curl http://localhost:8096 # Jellyfin
⏱️ Recovery Time Objectives (RTO)
| Scénario | Temps | Procédure |
|---|---|---|
| Mauvaise config Docker | 5 min | PBS restore snapshot précédent |
| Crash container unique | 15 min | pct restore depuis PBS |
| Crash disque Proxmox | 2-3h | Réinstall + restore GDrive |
| Restore fichier unique | 30 sec | PBS Web UI → Download |
| Sinistre total | 4-6h | Réinstall + sync GDrive + restore |
7.5.7 - Validation Backup Automatique - ✅¶
# Script test restauration mensuel
cat > /opt/backup-scripts/test-backup-restore.sh << 'EOF'
#!/bin/bash
# Test automatique restauration backup
TEST_VMID=900
LOG="/var/log/backup-validation.log"
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"
}
log "=== Starting backup validation test ==="
# Trouver dernier backup CT 100 dans PBS
LATEST=$(pvesm list pbs-backups | grep "ct/100" | tail -1 | awk '{print $1}')
if [ -z "$LATEST" ]; then
log "ERROR: No backup found for CT 100"
exit 1
fi
log "Testing backup: $LATEST"
# Détruire CT test si existe
if pct status $TEST_VMID &>/dev/null; then
log "Destroying existing test CT $TEST_VMID"
pct stop $TEST_VMID 2>/dev/null
pct destroy $TEST_VMID
fi
# Restore vers CT test
log "Restoring to test CT $TEST_VMID..."
if pct restore $TEST_VMID "$LATEST" --storage local-lvm --rootfs 32; then
log "✓ Restore successful"
else
log "✗ Restore FAILED"
exit 1
fi
# Démarrer CT test
log "Starting test CT..."
if pct start $TEST_VMID; then
log "✓ Container started"
else
log "✗ Container start FAILED"
pct destroy $TEST_VMID
exit 1
fi
sleep 15
# Valider Docker
log "Validating Docker service..."
if pct exec $TEST_VMID -- systemctl is-active docker >/dev/null 2>&1; then
log "✓ Docker service active"
else
log "✗ Docker service FAILED"
pct stop $TEST_VMID
pct destroy $TEST_VMID
exit 1
fi
# Valider docker-compose.yml
log "Validating docker-compose.yml..."
if pct exec $TEST_VMID -- test -f /opt/docker/docker-compose.yml; then
log "✓ docker-compose.yml exists"
else
log "✗ docker-compose.yml MISSING"
pct stop $TEST_VMID
pct destroy $TEST_VMID
exit 1
fi
# Cleanup
log "Cleaning up test CT..."
pct stop $TEST_VMID
pct destroy $TEST_VMID
log "=== Backup validation SUCCESSFUL ==="
exit 0
EOF
chmod +x /opt/backup-scripts/test-backup-restore.sh
# Test manuel
/opt/backup-scripts/test-backup-restore.sh
# Automatiser - cron mensuel premier dimanche 6h
crontab -e
# Ajouter ligne :
0 6 1-7 * 0 /opt/backup-scripts/test-backup-restore.sh
📊 État Backup Actuel
✅ IMPLÉMENTÉ :
├─ PBS quotidien 3h → CT 100, 101
├─ Déduplication PBS locale
├─ Sync Google Drive quotidien 4h
├─ Verification intégrité hebdo
├─ Auto-start containers
└─ Script validation mensuel
⏸️ PHASE 2 (Future) :
├─ Restic backup archives /mnt/storage/archives/
├─ GitHub configs (fstab, docker-compose, bootstrap script)
└─ Monitoring avancé (Grafana)
7.6 - Script SnapRAID Automatique - ✅¶
#!/bin/bash
# SnapRAID automation avec sécurité
LOGFILE="/var/log/snapraid.log"
THRESHOLD=50
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOGFILE"
}
log "=== SnapRAID run started ==="
# Vérifier pas déjà en cours
if pidof -x snapraid > /dev/null; then
log "ERROR: SnapRAID already running"
exit 1
fi
# Diff
DIFF_OUT=$(snapraid diff 2>&1)
CHANGED=$(echo "$DIFF_OUT" | grep -oP '\d+(?= modified)' | head -1 || echo "0")
ADDED=$(echo "$DIFF_OUT" | grep -oP '\d+(?= added)' | head -1 || echo "0")
REMOVED=$(echo "$DIFF_OUT" | grep -oP '\d+(?= removed)' | head -1 || echo "0")
TOTAL=$((CHANGED + ADDED + REMOVED))
log "Changes: $ADDED added, $REMOVED removed, $CHANGED modified (total: $TOTAL)"
# Seuil sécurité
if [ "$TOTAL" -gt "$THRESHOLD" ]; then
log "ERROR: Too many changes ($TOTAL > $THRESHOLD). Manual review required!"
exit 1
fi
# Sync si changements
if [ "$TOTAL" -gt 0 ]; then
log "Running sync..."
if snapraid sync >> "$LOGFILE" 2>&1; then
log "Sync completed"
else
log "ERROR: Sync failed"
exit 1
fi
else
log "No changes, skipping sync"
fi
# Scrub (8% données, 30+ jours non vérifiés)
log "Running scrub..."
if snapraid scrub -p 8 -o 30 >> "$LOGFILE" 2>&1; then
log "Scrub completed"
else
log "ERROR: Scrub failed"
exit 1
fi
log "=== SnapRAID run completed ==="
# Cleanup vieux logs
find /var/log -name "snapraid.log.*" -mtime +90 -delete
exit 0
chmod +x /opt/backup-scripts/snapraid-runner.sh
# Automatiser (cron quotidien 2h)
crontab -e
# Ajouter :
0 2 * * * /opt/backup-scripts/snapraid-runner.sh
7.7 - Documentation finale - ✅¶
# Serveur Domestique - Informations
## Accès
- Proxmox : https://192.168.1.10:8006 (root)
- PBS (Backup Server) : https://192.168.1.102:8007 (root)
- SSH : ssh -p 2222 root@192.168.1.10
- Jellyfin : http://192.168.1.100:8096
- Dashboard : http://192.168.1.101:3000
- Portainer : https://192.168.1.101:9443
## Containers LXC
- 100 : docker-media (4GB RAM, 192.168.1.100) - Jellyfin, \*arr, SABnzbd
- 101 : management (1GB RAM, 192.168.1.101) - Portainer, Homepage
- 102 : pbs (2GB RAM, 192.168.1.102) - Proxmox Backup Server
## Stockage
- /mnt/storage (mergerfs) : 2TB données protégées (SnapRAID)
- /mnt/media-bulk : 3TB médias non-protégés
- /mnt/parity : 1TB parity SnapRAID
- /mnt/storage/pbs-datastore : PBS local datastore
## Backups
- **PBS** : Quotidien 3h → CT 100, 101
- Datastore local : /mnt/storage/pbs-datastore
- Rétention : 7 derniers + 4 semaines + 6 mois
- Vérification : Hebdomadaire dimanche 4h
- **Google Drive** : Sync quotidien 4h (offsite)
- Location : backup/homeserver/pbs/
- Espace utilisé : ~30GB / 2TB
- Encryption : Client-side AES-256
- **SnapRAID** : Sync quotidien 2h, scrub 8%
- **Validation** : Test restore mensuel automatique
## Recovery Procedures
### Restore Container
```bash
# Lister backups disponibles
pvesm list pbs-backups | grep "ct/100"
# Restore
pct restore 100 pbs-backups:ct/100/[SNAPSHOT-ID] --storage local-lvm --rootfs 32
# Reconfigurer mount points (voir /etc/pve/lxc/100.conf)
# Démarrer
pct set 100 --onboot 1 && pct start 100
```
Restore depuis Google Drive¶
# Dans CT PBS (102)
rclone sync gdrive:backup/homeserver/pbs /mnt/datastore --progress
# Puis restore containers via PBS UI ou CLI
Recovery Time Objectives¶
- Mauvaise config : 5 min (PBS snapshot)
- Crash container : 15 min (pct restore)
- Crash disque Proxmox : 2-3h (réinstall + GDrive)
- Fichier unique : 30 sec (PBS Web UI)
Maintenance¶
- MAJ Proxmox : apt update && apt dist-upgrade
- MAJ PBS : (même commande dans CT 102)
- MAJ Docker : cd /opt/docker && docker compose pull && docker compose up -d
- Vérifier logs PBS : https://192.168.1.102:8007 → Task Log
- Vérifier sync GDrive : tail -f /var/log/pbs-gdrive-sync.log (dans CT 102)
- Vérifier logs SnapRAID : tail -f /var/log/snapraid.log
- Vérifier validation backup : tail -f /var/log/backup-validation.log
- Status disques : snapraid status
- SMART disques : smartctl -a /dev/sdX
Passwords¶
Stockés dans : [GESTIONNAIRE_MOTS_DE_PASSE]
Contacts Support¶
- r/homelab : https://reddit.com/r/homelab
- r/proxmox : https://reddit.com/r/proxmox
- Proxmox forum : https://forum.proxmox.com
📊 Phase 1 Terminée - Récapitulatif¶
✅ Ce Qui Est Opérationnel¶
Infrastructure :
- Proxmox VE 9.1 installé et configuré
- Stockage 5TB (2TB protégé + 3TB médias) via mergerfs+SnapRAID
- 3 containers LXC opérationnels (docker-media, management, PBS)
- GPU iGPU Intel HD 2000 passthrough fonctionnel
- Auto-start containers au boot système
Services média :
- Jellyfin streaming média (transcoding HW)
- Sonarr gestion séries TV automatisée
- Radarr gestion films automatisée
- Prowlarr indexers centralisés
- SABnzbd téléchargements Usenet
Management :
- Portainer gestion Docker GUI
- Homepage dashboard centralisé
- Proxmox Backup Server (PBS) opérationnel
- Backups PBS quotidiens CT 100, 101 (3h)
- Sync Google Drive quotidien (4h)
- Validation backup mensuelle automatique
- SnapRAID sync/scrub quotidiens
Sécurité & Backup :
- SSH sécurisé (port 2222, clés uniquement)
- Fail2Ban protection brute-force
- UFW firewall configuré
- Pas de ports exposés internet
- Backups PBS avec déduplication
- Offsite backup Google Drive (encryption client-side)
- Rétention : 7 derniers + 4 semaines + 6 mois
📈 Métriques Performance Attendues¶
- Consommation électrique : ~70-80W idle (~€120-140/an)
- Jellyfin transcoding : 2-3 streams 1080p H.264 simultanés
- Temps démarrage : Services opérationnels <2min après boot
- RAM utilisée : ~10GB/32GB (22GB disponibles pour expansion)
- Stockage utilisé : ~1.5TB/5TB (3.5TB disponibles)
🎯 Prochaines Étapes¶
Phase 2 : Backup & Archivage Avancé
- Restic backup archives
/mnt/storage/archives/(~1TB) - Déduplication + compression
- Sync vers Google Drive
- Rétention : 4 semaines + 6 mois + 2 ans
- GitHub configs (Infrastructure as Code)
- fstab, snapraid.conf, network/interfaces
- docker-compose.yml versionnés
- Script bootstrap-restore.sh
- Ansible playbooks (optionnel)
- USB rotation (backup local offline)
- Achat disque USB 4TB (~€80-100)
- Script sync PBS + archives vers USB
- Rotation bi-mensuelle manuelle
Optimisations
- Tuning profiles qualité TRaSH Guides
- Custom formats Sonarr/Radarr
- Hardlinks configuration optimale
- Monitoring SMART disques (smartd)
Accès distant
- Installation Tailscale
- Configuration ACLs utilisateurs
- Tests accès mobile
- Documentation utilisateurs famille
📚 Ressources et Documentation¶
Accès Services :
- Proxmox VE : https://192.168.1.10:8006 (root@pam)
- PBS (Backup Server) : https://192.168.1.102:8007 (root@pam)
- Jellyfin : http://192.168.1.100:8096
- Sonarr : http://192.168.1.100:8989
- Radarr : http://192.168.1.100:7878
- Prowlarr : http://192.168.1.100:9696
- SABnzbd : http://192.168.1.100:8080
- Portainer : https://192.168.1.101:9443
- Homepage : http://192.168.1.101:3000
Communautés :
- r/homelab : https://reddit.com/r/homelab
- r/selfhosted : https://reddit.com/r/selfhosted
- r/proxmox : https://reddit.com/r/proxmox
- r/jellyfin : https://reddit.com/r/jellyfin
- Proxmox Forum : https://forum.proxmox.com
Documentation Officielle :
- Proxmox VE Wiki : https://pve.proxmox.com/wiki/
- Proxmox Backup Server : https://pbs.proxmox.com/docs/
- Jellyfin Docs : https://jellyfin.org/docs/
- TRaSH Guides : https://trash-guides.info/ (configurations *arr optimales)
- mergerfs GitHub : https://github.com/trapexit/mergerfs
- SnapRAID Manual : https://www.snapraid.it/manual
- rclone Documentation : https://rclone.org/docs/
Outils Monitoring :
- Cockpit : Monitoring système web
- Netdata : Monitoring temps réel
- Grafana : Dashboards métriques avancés
💰 Coûts Réels Phase 1¶
Investissement matériel : €0 (réutilisation existant) Coûts récurrents :
- Électricité : ~€130-150/an (75-85W @ €0.20/kWh, +PBS)
- Google One 2TB : €100/an (déjà payé, existant)
- PBS backups : ~30GB / 2TB (1.5% utilisé)
- Espace disponible archives futures : ~1970GB
- Total : €230-250/an
Économies vs Cloud :
- Plex Pass : €120/an économisé
- Stockage cloud 2TB : €100/an économisé
- VPS applications : €96/an économisé
- Total économisé : €316/an
- Bénéfice net : €66-86/an + contrôle total données
🔮 Vision Long Terme¶
Phase 3 : Applications Développement (Mois 3-6)¶
- Container Gitea (Git self-hosted)
- Container Node.js développement
- Container bases données (PostgreSQL, Redis)
- Environnements test isolés VMs
Phase 4 : Applications Production (Mois 6-12)¶
- Site web statique (Hugo/Jekyll)
- Umami analytics self-hosted
- Reverse proxy Nginx/Caddy
- SSL Let's Encrypt automatique
Phase 5 : Migration ZFS (Mois 12+)¶
- Achat 2x WD Red 8TB (€240-280)
- Migration données vers ZFS mirror
- Snapshots ZFS automatiques
- ZFS send/receive backups élégants
- 8TB protégés à 100%
⚠️ Notes Importantes¶
Limitations Actuelles Acceptées¶
- Protection partielle : 2TB/5TB protégés (médias non-protégés acceptables)
- Pas de snapshots : ext4 basique (suffisant pour médias)
- Backup manuel offsite : Rotation USB tous les 15 jours (discipline requise)
- ⚠️ USB Maxtor 4TB défaillant : Besoin remplacement pour backup local quotidien
Points d'Attention Maintenance¶
- SnapRAID : Vérifier logs quotidiens, alertes si >50 fichiers modifiés
- SMART disques : Surveiller reallocated sectors, température
- Espace disque : Monitoring croissance bibliothèque média
- Updates : Proxmox/Docker mensuel, attention breaking changes
Support et Dépannage¶
- Logs :
/var/log/snapraid.log,docker compose logs -f - Status :
snapraid status,zpool status(futur) - Backup configs :
/mnt/storage/backups/configs/(quotidien) - Communauté : r/homelab Discord, forums Proxmox
Document créé : Janvier 2026 Dernière mise à jour : 23 janvier 2026 (validation Proxmox VE 9.1) Prochaine review : [DATE+3_MOIS]
📚 Sources et Références Officielles¶
Documentation Proxmox VE 9.1 (vérifiée janvier 2026)¶
- Documentation principale : https://pve.proxmox.com/pve-docs/ (version 9.1.2, déc 2025)
- Package Repositories : https://pve.proxmox.com/wiki/Package_Repositories
- System Requirements : https://pve.proxmox.com/wiki/System_Requirements
- Installation Guide : https://pve.proxmox.com/pve-docs/chapter-pve-installation.html
- Host Bootloader : https://pve.proxmox.com/pve-docs/chapter-sysadmin.html#chapter_system_booting
- Network Configuration : https://pve.proxmox.com/pve-docs/chapter-sysadmin.html#sysadmin_network_configuration
Logiciels et outils¶
- Proxmox VE 9.1 ISO : https://www.proxmox.com/en/downloads (v9.1-1, nov 2025)
- Rufus (création USB) : https://rufus.ie/
- mergerfs : https://github.com/trapexit/mergerfs (v2.40.2)
- SnapRAID : https://www.snapraid.it/manual
- Docker : https://docs.docker.com/
- Jellyfin : https://jellyfin.org/docs/
- TRaSH Guides : https://trash-guides.info/ (configurations Sonarr/Radarr optimales)
Communautés et support¶
- r/homelab : https://reddit.com/r/homelab
- r/proxmox : https://reddit.com/r/proxmox
- r/jellyfin : https://reddit.com/r/jellyfin
- Forum Proxmox : https://forum.proxmox.com/
- Bugtracker Proxmox : https://bugzilla.proxmox.com/
Guides communautaires validés¶
- Suppression popup subscription : https://mclarendatasystems.com/remove-proxmox51-subscription-notice/ (testé PVE 8.4, fonctionne 9.1)
- Tteck Proxmox Scripts : https://tteck.github.io/Proxmox/ (helper scripts communauté)
🚀 Serveur opérationnel et prêt pour utilisation quotidienne !