Rapport Migration Cutover — WD Black SN770 NVMe¶
Date : 2026-04-02 → mis à jour 2026-04-03 (session 4)
Rédacteur : GitHub Copilot (relai session agent)
Contexte : Suite de 20260331_PLAN-ARCHITECTURE-NVME.md — Migration complète + phase de nettoyage post-migration
1. ÉTAT D'AVANCEMENT¶
Script post-cutover (/mnt/lxc-data/docker-101/zensical/docs/history/post-cutover-script.sh)¶
| Étape | Description | Statut | Notes |
|---|---|---|---|
| 1 | ZFS datasets (rpool/data, pbs, lxc-data, scratch) | ✅ | rpool/data existait déjà, skip |
| 2 | ARC ZFS cap (/etc/modprobe.d/zfs.conf) |
✅ | arc_max=6GB, arc_min=1GB |
| 3 | Enregistrer local-zfs dans Proxmox | ✅ | Existait déjà (créé par l'installeur), skip |
| 4 | vgchange -ay — activation LVM pve sur sda |
✅ | Tous LV vm-100 à vm-105 actifs |
| 5 | Mount ancien rootfs LXC 102 (PBS) | ✅ | /dev/mapper/pve-vm--102--disk--0 → /mnt/old-lxc102 |
| 6 | rsync PBS datastore → /rpool/pbs |
✅ | 38GB copié, confirmé par df -h |
| 7 | rsync lxc-data + ZFS mountpoint | ✅ | zfs set mountpoint=/mnt/lxc-data rpool/lxc-data (pas bind mount) |
| 8 | Bind mount scratch | ✅ | /rpool/scratch → /mnt/scratch |
| 9 | PBS installé sur host | ✅ | Après nombreux fixes (voir §3) |
| 10 | Storage PBS ajouté dans Proxmox | ✅ | pbs-local via API token root@pam!pve-token |
| 11 | Restaurer LXC 102 (PBS) | ✅ | pbs-local:backup/ct/102/2026-04-02T13:05:43Z |
| 12 | Restaurer LXC 100, 101, 103, 104, 105 | ✅ | Tous restaurés (voir §4 pour timestamps exacts) |
| 13 | Monter media (sdc1) et storage (sdd1) | ✅ | fstab corrigé avec UUIDs stables |
| 14 | Créer /mnt/lxc-data/downloads |
✅ | |
| 15 | Démarrer tous les LXC | ✅ | Tous actifs |
| 16 | Reconfigurer PBS job backup | ✅ | Job 2d447659 créé — 6 LXC, 23h00, zstd, storage=pbs-backups |
| 17 | PBS secondary sur sda | ✅ | sda reformaté ext4 (label=pbs-secondary), rsync cron 02h30 |
| 18 | Reconfigurer PBS dans LXC 102 | ✅ | Datastore backup sur /mnt/datastore (rpool/pbs bind), actif |
| 19 | Basculer storage PVE vers LXC 102 | ✅ | pbs-backups — 192.168.1.102, token root@pam!pve-token |
État services (17h30 CEST, 2026-04-02) — initial¶
| Service | LXC | État | Cause si KO |
|---|---|---|---|
| PBS host (temporaire) | host | ✅ | |
| sonarr, radarr, bazarr | 100 | ✅ | |
| flix, sabnzbd | 100 | ⚠️ 502 | /mnt/media ou /mnt/lxc-data/downloads pas monté dans LXC |
| auth | 103 | ✅ | |
| home, docs, portainer | 101 | ⚠️ 504 | /mnt/media pas encore monté (étape 13 incomplète) |
| run, feed | 104 | ✅ | |
| web (LXC 105) | 105 | ? | Non vérifié |
État services (session 2, post-nettoyage, 2026-04-02)¶
| Service | LXC | État | Notes |
|---|---|---|---|
| PBS (LXC 102) | 102 | ✅ | Datastore backup, 38GB, pbs-backups storage actif |
| jellyfin, sabnzbd | 100 | ✅ | Fix: /mnt/scratch permissions + subdirs créés |
| sonarr, radarr, bazarr, seerr | 100 | ✅ | |
| prowlarr, recyclarr, torznab | 100 | ✅ | |
| homepage, portainer, zensical | 101 | ✅ | outline-test supprimé (OOM → 574MB/1024MB stable) |
| uptime-kuma, silverbullet | 101 | ✅ | |
| auth (nginx + authelia) | 103 | ✅ | |
| freshrss, romm, endurain | 104 | ✅ | |
| web (LXC 105) | 105 | ✅ | |
| PBS host | host | ✅→❌ | Désactivé après bascule vers LXC 102 |
État accès SSH distant (session 4, 2026-04-03)¶
Suite à la migration, VS Code Remote SSH redemandait le mot de passe à chaque connexion depuis les PCs clients. Deux causes distinctes identifiées et résolues :
| Symptôme | Cause | Fix côté client |
|---|---|---|
| Avertissement "REMOTE HOST IDENTIFICATION HAS CHANGED" ou mot de passe redemandé | Clés hôte SSH du serveur régénérées à l'installation (2026-04-02 15:32) — known_hosts des clients contient l'ancienne empreinte |
ssh-keygen -R 192.168.1.21 sur chaque PC client |
| Mot de passe toujours demandé après acceptation nouvelle empreinte | Clé publique client absente de /etc/pve/priv/authorized_keys — seule la clé interne root@pve présente |
ssh-copy-id root@192.168.1.21 (ou équivalent PowerShell sur Windows) |
Point important Proxmox : ~/.ssh/authorized_keys sur PVE est un symlink → /etc/pve/priv/authorized_keys (géré par le cluster). ssh-copy-id écrit au bon endroit via le symlink. Ne jamais modifier ~/.ssh/authorized_keys directement.
# Sur chaque PC client (bash/PowerShell) — à faire une seule fois avec mot de passe
ssh-keygen -R 192.168.1.21
ssh-copy-id root@192.168.1.21
# Sur Windows PowerShell (si ssh-copy-id absent)
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh root@192.168.1.21 "cat >> /etc/pve/priv/authorized_keys"
État post-fix : connexion VS Code Remote SSH sans mot de passe ✅
État Uptime Kuma (session 3, 2026-04-02)¶
Suite au redémarrage post-migration, de nombreuses sondes étaient DOWN. Cause : artefacts host PVE perdus à la réinstallation (non couverts par PBS — voir §4).
| Sondes DOWN | Cause | Fix appliqué |
|---|---|---|
| LXC Statuts (100–105), PVE Node | monitoring@pve + token API inexistants |
✅ Recréés via pveum |
| Glances (PVE Host) | Glances non installé sur nouveau host | ✅ apt install glances + service systemd |
| Espaces Disques (push) | Cron scripts absents du rootfs | ✅ Scripts réécrits (ZFS quota, plus LVM) |
| Températures & Ventilateurs (push) | Cron scripts absents + noms disques (sdd→sdc, sde→sdd) | ✅ Scripts réécrits |
| LXC 105 – Web (PORT) | Faux positif lié au rechargement Kuma | ✅ Auto-résolu |
Module it87 (puce IT8628E) |
Non chargé après réinstallation → lm-sensors muet | ✅ modprobe it87 + persisté /etc/modules-load.d/it87.conf |
Script monitor-thermals.sh |
Utilisait Glances API /api/4/sensors → retournait [] |
✅ Réécrit avec sensors (lm-sensors, coretemp + it8628) |
| Monitors LXC 105 Web (port → http) | Ports 801x inaccessibles réseau local | ⬜ Migré vers type HTTP — investigation réseau en cours |
| Monitors 66/67/68 (LXC disks obsolètes) | Remplacés par monitors ZFS, références LXC mortes | ✅ Supprimés de kuma.db |
restore-host-artefacts.sh |
Incomplet : manquait étape it87 + thermal rewrite | ✅ Mis à jour : étape [2/4] it87 + script thermal regen avec sensors |
# Sur le host — vérifier que les disques sont montés
ls /mnt/media /mnt/storage
# Si pas montés :
mkdir -p /mnt/media /mnt/storage
mount UUID=05af2ac5-5cc6-4627-8b00-a908d20d12ff /mnt/media
mount UUID=dcb10492-1c84-497e-a027-6275e9b6d41f /mnt/storage
# Puis redémarrer les LXC affectés
pct restart 100
pct restart 101
2. CHANGEMENTS PAR RAPPORT AU PLAN¶
2.1 Mapping disques — CRITIQUE¶
Le plan supposait sdb = ancien Proxmox LVM. La réalité au moment du boot sur NVMe est :
| Rôle prévu (plan) | Device réel | Label/Contenu | UUID |
|---|---|---|---|
| Boot NVMe | nvme0n1 |
ZFS rpool (OS actuel) | — |
| Ancien LVM Proxmox | sda |
LVM2 pve VG — tous LV vm-100 à vm-105 | — |
| lxc-data Docker configs | sdb1 |
ext4, label lxc-storage |
2b18b88e-a498-4429-9a02-f22315d7b1fb |
| Media HGST 4TB | sdc1 |
ext4, label media |
05af2ac5-5cc6-4627-8b00-a908d20d12ff |
| Storage IronWolf 4TB | sdd1 |
ext4, label storage-cloud |
dcb10492-1c84-497e-a027-6275e9b6d41f |
Conséquence plan §5.2 :
sdcdans le plan = PBS secondary. Orsdc1= disque media (HGST 4TB). Le vrai candidat PBS secondary estsda(Samsung 850 EVO 250GB — l'ancien disque Proxmox) une fois les LV LXC inutiles supprimés.
2.2 lxc-data — ZFS mountpoint, pas bind mount¶
Le plan et le script prévoyaient un bind mount /rpool/lxc-data → /mnt/lxc-data. En pratique, la configuration a été faite via :
→ /mnt/lxc-data est monté directement par ZFS, pas via fstab bind mount.
Les lignes echo "/rpool/lxc-data /mnt/lxc-data zfs bind 0 0" >> /etc/fstab et echo "/rpool/scratch /mnt/scratch zfs bind 0 0" >> /etc/fstab ont probablement été écrites dans le fstab — à vérifier et nettoyer.
# Vérifier et corriger fstab
grep -n "rpool\|lxc-data\|scratch" /etc/fstab
# Supprimer les lignes bind mount ZFS si présentes (ZFS les monte lui-même)
2.3 fstab media/storage — UUIDs requis, pas /dev/sddX¶
Le script d'origine utilisait /dev/sdd1 et /dev/sde1. Ces noms peuvent changer au reboot. Les UUIDs stables sont :
# À ajouter dans /etc/fstab (remplacer ou compléter)
UUID=05af2ac5-5cc6-4627-8b00-a908d20d12ff /mnt/media ext4 defaults,nofail 0 2
UUID=dcb10492-1c84-497e-a027-6275e9b6d41f /mnt/storage ext4 defaults,nofail 0 2
Si des lignes
/dev/sdc1ou/dev/sdd1existent déjà dans fstab suite à l'étape 13 — les remplacer par les UUIDs ci-dessus.
2.4 Timestamps PBS réels (différent du script initial)¶
| LXC | Timestamp prévu (script) | Timestamp réel dans PBS |
|---|---|---|
| 100 | 2026-04-02T13:03:54Z | identique ✅ |
| 101 | 2026-04-02T13:04:50Z | identique ✅ |
| 102 | 2026-04-02T13:05:43Z | identique ✅ |
| 103 | 2026-04-02T13:09:00Z | 2026-04-02T13:08:59Z ⚠️ |
| 104 | 2026-04-02T13:09:30Z | 2026-04-02T13:09:14Z ⚠️ |
| 105 | 2026-04-02T13:10:00Z | 2026-04-02T13:09:46Z ⚠️ |
2.5 Format volid PBS — préfixe backup/ requis¶
pct restore nécessite le format : pbs-local:backup/ct/NNN/TIMESTAMP
(pas pbs-local:ct/NNN/TIMESTAMP)
2.6 ashift — 12 (pas 13)¶
Le plan recommandait ashift=13 (SN770 secteurs 4K natifs). L'installeur Proxmox a créé le pool avec ashift=12. Le pool est ONLINE, ne pas modifier — ashift=12 fonctionne correctement (performance non critique).
3. OBSTACLES RENCONTRÉS ET RÉSOLUTIONS¶
Phase 1 — Boot sur SN770¶
| Problème | Cause | Solution |
|---|---|---|
| ZFS rpool "previously in use from another system" | hostid différent entre VM d'installation et host physique | zpool import -f rpool + zgenhostid + update-initramfs -u |
| SSH/HTTPS timeout après boot | enp4s0 DOWN — pas configuré dans l'installeur |
ip link set enp4s0 up + ip link set enp4s0 master vmbr0 |
enp4s0 down à chaque reboot |
Absent de /etc/network/interfaces |
Ajout auto enp4s0 dans interfaces |
Phase 2 — APT et PBS¶
| Problème | Cause | Solution |
|---|---|---|
apt update 401 enterprise |
Proxmox 9.1 sur Debian trixie (pas bookworm) | Vider .sources enterprise, ajouter no-subscription en deb822 format |
| Doublons apt | sources.list + debian.sources coexistaient |
Vider /etc/apt/sources.list |
proxmox-backup.service crash — exit 255 |
/etc/proxmox-backup permissions 755 au lieu de 700 |
chmod 700 /etc/proxmox-backup |
PBS crash — wrong user (0 != 34) |
/etc/proxmox-backup appartient à root |
chown -R backup:backup /etc/proxmox-backup |
| PBS crash — datastore.cfg parse error | Indentation espaces au lieu de tabulations | printf 'datastore: backup\n\tpath /rpool/pbs\n' |
proxy.pem manquant |
PBS installé sans certificat TLS | openssl req -x509 -newkey rsa:4096 -days 3650 ... |
Phase 2 — Storage PBS dans PVE¶
| Problème | Cause | Solution |
|---|---|---|
pvesm add pbs → 401 Unauthorized |
root@pam s'authentifie PAM, pas LDAP PBS |
API token PBS : user generate-token root@pam pve-token |
apitoken not found |
Commande inexistante dans PBS 4.1 | user generate-token (bonne commande) |
Token pve-token already exists |
Token créé lors d'une tentative précédente | user delete-token root@pam pve-token avant recréation |
--auth-id root@pam!pve-token fail |
Le ! déclenche l'expansion d'historique bash |
Guillemets simples : --auth-id 'root@pam!pve-token' |
$password uninitialized + 401 |
pvesm add sans --password ne lit pas le .pw |
Passer --password "$TOKEN_SECRET" directement |
| Storage created → "Cannot find datastore 'backup'" | Token sans ACL sur le datastore | acl update /datastore/backup DatastoreAdmin --auth-id 'root@pam!pve-token' |
Phase 2 — Restauration LXC¶
| Problème | Cause | Solution |
|---|---|---|
--net0 "prompt >" interactif |
Guillemet non fermé (ligne tronquée dans script) | Corriger toutes les lignes --net0 dans le script |
Volid ct/103/... invalide |
Format incomplet, manque préfixe datastore | Format correct : pbs-local:backup/ct/103/... |
Timestamp 103/104/105 does not exist |
Secondes différentes (:00 vs :59) |
Vérifier avec pvesm list pbs-local \| grep ct/103 |
| "CT 103 already exist" | Première tentative avait partiellement créé le CT | pct destroy 103 + zfs destroy rpool/data/vm-103-disk-0 puis retry |
| SSH known_hosts mismatch | Nouvelle clé hôte après migration | ssh-keygen -R 192.168.1.21 sur le client Windows |
| VS Code Remote SSH redemande MdP (session 4) | Clé publique client absente de /etc/pve/priv/authorized_keys + nouvelles clés hôte |
ssh-keygen -R 192.168.1.21 + ssh-copy-id root@192.168.1.21 sur chaque client |
4. CONFIGURATION ACTUELLE DU SERVEUR¶
Réseau¶
Interface : enp4s0 (physique) ← vmbr0 (bridge Proxmox)
IP host : 192.168.1.21 / 24
Gateway : 192.168.1.254
DNS : configuré dans /etc/resolv.conf
ZFS¶
rpool ONLINE nvme0n1p3 (WD Black SN770)
├── ROOT/pve-1 ~10GB OS Proxmox
├── data/ quota=200G LXC rootfs (vm-NNN-disk-0)
├── pbs/ quota=450G recordsize=1M Datastore PBS
├── lxc-data/ quota=80G mountpoint=/mnt/lxc-data
└── scratch/ quota=120G sync=disabled
Disques non-NVMe (état post-nettoyage, session 2)¶
sda Samsung 850 EVO 250GB — ext4 label=pbs-secondary ✅ (reformaté session 2)
UUID=0318e50f-7d84-497e-b914-198df22ef827
Monté sur /mnt/pbs-secondary (229GB disponible)
Rsync nightly 02h30 : /rpool/pbs/ → /mnt/pbs-secondary/pbs/
sdb1 ext4 label=lxc-storage — SMART PASSED, non monté
UUID=2b18b88e-a498-4429-9a02-f22315d7b1fb
Rôle : spare froid (candidat second PBS backup ou SnapRAID)
sdc1 ext4 label=media — HGST 4TB media Jellyfin
UUID=05af2ac5-5cc6-4627-8b00-a908d20d12ff
Monté sur /mnt/media
sdd1 ext4 label=storage-cloud — IronWolf 4TB
UUID=dcb10492-1c84-497e-a027-6275e9b6d41f
Monté sur /mnt/storage
PBS — LXC 102 (configuration finale ✅)¶
LXC 102 : 192.168.1.102, unprivileged=0, 2c/2GB
Service : proxmox-backup.service + proxmox-backup-proxy.service — ACTIFS
Datastore : backup → /mnt/datastore (bind mount mp0=/rpool/pbs)
API token : root@pam!pve-token = 25f2915a-67d7-4a05-9f4f-a9f14d3fed02
Fingerprint: 36:97:a9:56:f1:ab:2b:aa:a6:11:cd:e4:d7:de:66:07:d1:44:88:9f:7a:27:99:08:8f:a3:4d:8a:cb:56:94:a4
Storage PVE: pbs-backups — 192.168.1.102, datastore=backup, 471GB total / 38GB utilisé
Job backup : 2d447659-7185-4945-a691-5bed3b42aebc — 6 LXC, 23h00, zstd
PBS host : DÉSACTIVÉ (systemctl disable proxmox-backup proxmox-backup-proxy)
LXC restaurés¶
102 — pbs — 192.168.1.102 unprivileged=0 2c/2GB mp0=/rpool/pbs→/mnt/datastore
100 — docker-media — 192.168.1.100 unprivileged=1 6c/8GB
101 — management — 192.168.1.101 unprivileged=1 2c/1GB
103 — network-gateway — 192.168.1.103 unprivileged=1 2c/2GB
104 — services — 192.168.1.104 unprivileged=1 2c/2GB
105 — web — 192.168.1.105 unprivileged=1 2c/2GB
5. TÂCHES RESTANTES¶
✅ MIGRATION COMPLÈTE — Toutes les tâches ont été réalisées en session 1 et session 2.
| Tâche | Statut | Session |
|---|---|---|
| Fix 502/504 (jellyfin, sabnzbd) | ✅ | 1 |
| fstab nettoyé (UUIDs, sans bind ZFS) | ✅ | 1 |
| LXC 100/101 configs dédupliquées | ✅ | 1 |
| PBS migré vers LXC 102 | ✅ | 1 |
| Job backup 6 LXC, 23h00 zstd | ✅ | 1 |
| PBS host désactivé | ✅ | 1 |
/etc/network/interfaces fix nic0→enp4s0 |
✅ | 2 |
| ZFS autotrim=ON, scrub cron mensuel | ✅ | 2 |
| outline-test supprimé (OOM) | ✅ | 2 |
| LVM pve désactivé sur sda | ✅ | 2 |
| sda reformaté ext4 pbs-secondary | ✅ | 2 |
| rsync cron 02h30 /rpool/pbs→pbs-secondary | ✅ | 2 |
| Sync initial 40.3GB | ✅ | 2 |
Éléments non critiques (décision différée)¶
sdb(232GB, lxc-storage) : spare froid, aucune action requise- SnapRAID sur sdd/sde : voir plan §4 Phase 4 — non prioritaire
- Uptime Kuma rétention 30 jours : réglage UI uniquement
6. INFORMATIONS TECHNIQUES CRITIQUES POUR L'AGENT¶
APT — Format deb822 obligatoire sur trixie¶
Ne jamais ajouter de repos dans /etc/apt/sources.list (coexistence avec debian.sources → doublons).
Utiliser /etc/apt/sources.list.d/*.sources (format deb822) :
# Exemple : /etc/apt/sources.list.d/pbs.sources
Types: deb
URIs: http://download.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-no-subscription
Fichiers enterprise à garder vides (pas supprimés) :
/etc/apt/sources.list.d/pve-enterprise.sources/etc/apt/sources.list.d/ceph.sources
PBS — Pièges connus¶
/etc/proxmox-backup→chmod 700+chown backup:backupobligatoiredatastore.cfg→ indentation tabulation (\t), jamais espacesproxy.pemdoit exister avant démarrage- Authentification PVE→PBS : ne pas utiliser
root@pamdirect (401 PAM) → API token PBS pvesm add pbs: passer--passwordexplicitement, le.pwn'est pas lu à la création
Bash — Pièges copier-coller¶
- Le
!dansroot@pam!pve-tokendéclenche l'expansion d'historique en bash interactif → toujours guillemets simples - Les commandes multilignes avec
\collées depuis le script peuvent se concaténer → copier-coller ligne par ligne ou via fichier temporaire set -edans le script original → si une commande échoue, tout s'arrête → exécution étape par étape recommandée
ZFS — Commandes utiles¶
zpool status rpool # santé pool
zfs list -o name,used,avail,quota # usage datasets
zpool get autotrim rpool # vérifier autotrim
zfs get compression,atime,recordsize rpool/pbs # paramètres PBS dataset
7. FICHIERS MODIFIÉS SUR LE SERVEUR (changelog)¶
| Fichier | Modification | Créé/Modifié |
|---|---|---|
/etc/network/interfaces |
nic0 → enp4s0 (bridge-ports), fix boot réseau |
Modifié (session 2) |
/etc/modprobe.d/zfs.conf |
arc_max=6GB, arc_min=1GB | Créé |
/etc/apt/sources.list |
Vidé (évite doublons) | Modifié |
/etc/apt/sources.list.d/pve-enterprise.sources |
Vidé (enterprise 401) | Modifié |
/etc/apt/sources.list.d/ceph.sources |
Vidé (enterprise 401) | Modifié |
/etc/apt/sources.list.d/pve-no-subscription.sources |
Nouveau repo PVE trixie | Créé |
/etc/apt/sources.list.d/pbs.sources |
Nouveau repo PBS trixie | Créé |
/etc/proxmox-backup/datastore.cfg |
datastore: backup\n\tpath /rpool/pbs |
Créé |
/etc/proxmox-backup/proxy.pem |
Certificat TLS auto-signé | Créé |
/etc/proxmox-backup/proxy.key |
Clé privée TLS | Créé |
/etc/pve/storage.cfg |
Ajout pbs-local via pvesm add |
Modifié |
/etc/pve/priv/storage/pbs-local.pw |
Token PBS secret | Créé |
/etc/pve/lxc/100.conf |
Restauré + mp0-4 + iGPU | Créé |
/etc/pve/lxc/101.conf |
Restauré + mp0-1 + cpulimit | Créé |
/etc/pve/lxc/102.conf |
Restauré + mp0=/rpool/pbs | Créé |
/etc/pve/lxc/103.conf |
Restauré + features + mp0 | Créé |
/etc/pve/lxc/104.conf |
Restauré + features + mp0-1 | Créé |
/etc/pve/lxc/105.conf |
Restauré + features + mp0 | Créé |
/etc/fstab |
Réécrit proprement — proc + 3×UUID (media/storage/pbs-secondary) | Modifié (session 1+2) |
/etc/pve/lxc/100.conf |
Dédupliqué — blocs swap/cgroup/mount en double supprimés | Modifié (session 1) |
/etc/pve/lxc/101.conf |
Dédupliqué — blocs en double supprimés | Modifié (session 1) |
/etc/pve/lxc/100.conf.bak |
Supprimé | Supprimé (session 2) |
/etc/pve/lxc/101.conf.bak |
Supprimé | Supprimé (session 2) |
/etc/pve/storage.cfg |
pbs-local → pbs-backups (LXC 102) |
Modifié (session 1) |
/etc/pve/priv/storage/pbs-backups.pw |
Token pve-token LXC 102 |
Créé (session 1) |
/etc/cron.d/zfs-scrub |
0 3 1 * * root zpool scrub rpool |
Créé (session 2) |
/etc/cron.d/pbs-secondary |
rsync 02h30 /rpool/pbs/ → /mnt/pbs-secondary/pbs/ | Créé (session 2) |
monitoring@pve user + token kuma |
Recréé via pveum, nouveau token patché dans kuma.db |
Créé (session 3) |
/etc/systemd/system/glances.service |
Glances API webserver sur port 61208 | Créé (session 3) |
/usr/local/bin/monitor-disk-space.sh |
Script push ZFS quota + df (remplace LVM) | Créé (session 3) |
/usr/local/bin/monitor-thermals.sh |
Script push thermals réécrit — sensors lm-sensors (coretemp-isa-0000 + it8628-isa-0a40) au lieu de Glances API |
Modifié (session 3) |
/etc/modules-load.d/it87.conf |
Persistance module IT8628E (lm-sensors — températures MB + vitesses ventilateurs) | Créé (session 3) |
/mnt/lxc-data/docker-101/uptime-kuma/restore-host-artefacts.sh |
Mis à jour : ajout étape [2/4] chargement it87 + régénération script thermal via sensors |
Modifié (session 3) |
/etc/cron.d/monitor-disk-space |
*/3 * * * * monitor-disk-space.sh |
Créé (session 3) |
/etc/cron.d/monitor-thermals |
*/3 * * * * monitor-thermals.sh |
Créé (session 3) |
/etc/pve/priv/authorized_keys |
Clés publiques clients SSH re-ajoutées (clé PC client) — absentes après migration | Modifié (session 4) |
4. ARTEFACTS HOST PVE — LACUNE DU PROCESS DE BACKUP¶
Contexte¶
La migration impliquait une réinstallation fraîche de Proxmox VE sur NVMe. Les backups PBS ne couvrent que les rootfs LXC — jamais le rootfs du host (rpool/ROOT/pve-1). Trois catégories d'artefacts ont donc été perdues et ont causé des sondes Uptime Kuma DOWN en session 3.
Ce qui est dans rpool/ROOT (perdu à la réinstall)¶
| Catégorie | Artefacts perdus | Impact |
|---|---|---|
| Users/tokens Proxmox | /etc/pve/user.cfg (monitoring@pve), /etc/pve/priv/tokens.cfg |
Monitors JSON Query DOWN |
| Services systemd custom | /etc/systemd/system/glances.service |
Glances DOWN → thermals DOWN |
| Scripts cron host | /usr/local/bin/monitor-*.sh, /etc/cron.d/monitor-* |
Monitors push DOWN après heartbeat timeout |
| Packages apt | Glances (non installé sur le nouveau OS) | Idem |
| Clés SSH autorisées clients | Clés publiques clients absentes — /etc/pve/priv/authorized_keys ne contient que root@pve après réinstall |
VS Code Remote SSH redemande le mot de passe indéfiniment |
Ce qui est dans rpool/lxc-data (survit)¶
kuma.dbavec les push tokens des monitors → les tokens survivent, mais sans les scripts cron pour les alimenter, les monitors passent DOWN- Tous les configs Docker des LXC (
docker-compose.yml, etc.) - Les scripts source Python (
setup-*.py,restore-host-artefacts.sh)
Pourquoi ces artefacts n'étaient pas dans le plan¶
Le plan 20260331_PLAN-ARCHITECTURE-NVME.md était centré sur la migration data (ZFS, PBS, LXC). Les artefacts host PVE ont été implicitement supposés "automatiquement présents" car ils avaient été créés manuellement lors de la mise en place initiale du monitoring — sans procédure documentée de re-déploiement.
Résolution systémique¶
Un unique script de restauration a été créé :
Ce script est idempotent et doit être ajouté au post-cutover de toute future migration PVE (après l'étape de démarrage des LXC).
6. SCRIPTS BACKUP HOST — PERTE ET RESTAURATION (session 5, 2026-04-03)¶
Constat¶
Les scripts de backup quotidiens (backup-proxmox-host.sh, backup-docker-configs.sh) et leur configuration associée ont été perdus lors de la migration : ils résidaient dans le rootfs de l'ancien Proxmox (sdb) et n'ont pas été restaurés en session ½ car la procédure de restauration couvrait uniquement les LXC (PBS) et les artefacts de monitoring (session 3).
| Élément perdu | Cause |
|---|---|
/usr/local/bin/backup-proxmox-host.sh |
Rootfs ancien sdb — non restauré |
/usr/local/bin/backup-docker-configs.sh |
Idem |
crontab -l (0 5 * * * ...) |
/var/spool/cron/crontabs/ absent du périmètre du script de backup |
rclone (binary) |
Non installé sur le nouveau Proxmox |
/root/.config/rclone/rclone.conf |
Hors périmètre du script de backup |
Conséquence : depuis le 2026-04-02 (migration), aucun backup configs host ni lxc-data ne s'était exécuté.
Diagnostic¶
Vérification immédiate : ni backup-proxmox-host.sh, ni backup-docker-configs.sh présents dans /usr/local/bin/, crontab -l vide, rclone absent du PATH, /root/.config/rclone/ inexistant.
Récupération¶
Les scripts étaient récupérables : le backup du 2026-04-02 05:00 (tourné sur l'ancien système avant le cutover) est présent sur Google Drive et contient les deux scripts.
# Extraction depuis GDrive via rclone de LXC 102 (déjà configuré)
pct exec 102 -- rclone cat "gdrive:backup/homeserver/proxmox/proxmox-host-config-20260402-050001.tar.gz" \
| tar -xzvf - --strip-components=0 \
usr/local/bin/backup-proxmox-host.sh \
usr/local/bin/backup-docker-configs.sh \
-C /
# Installer rclone v1.73.x (apt fournit v1.60 — trop ancien)
curl https://rclone.org/install.sh | bash
# Copier le token OAuth depuis LXC 102 (déjà valide)
mkdir -p /root/.config/rclone
pct exec 102 -- cat /root/.config/rclone/rclone.conf > /root/.config/rclone/rclone.conf
chmod 600 /root/.config/rclone/rclone.conf
# Restaurer les crons
( crontab -l 2>/dev/null; \
echo "0 5 * * * /usr/local/bin/backup-proxmox-host.sh"; \
echo "0 5 * * * /usr/local/bin/backup-docker-configs.sh" ) | crontab -
Fix lacune du script de backup¶
backup-proxmox-host.sh ne sauvegardait pas /var/spool/cron/crontabs/ (user crontab root) ni /root/.config/rclone/ — deux éléments indispensables à la restauration. Corrigé dans le script restauré :
État post-restauration (2026-04-03 22:59 CEST)¶
| Élément | Statut |
|---|---|
/usr/local/bin/backup-proxmox-host.sh |
✅ Restauré (version 2026-03-12) |
/usr/local/bin/backup-docker-configs.sh |
✅ Restauré (version 2026-03-12) |
rclone v1.73.3 |
✅ Installé (/usr/bin/rclone) |
/root/.config/rclone/rclone.conf |
✅ Token OAuth copié depuis LXC 102 |
crontab root (0 5 * * * ...) |
✅ Restauré × 2 entrées |
Test backup-proxmox-host.sh |
✅ Upload GDrive OK — proxmox-host-config-20260403-225853.tar.gz (54 KB) |
Test backup-docker-configs.sh |
✅ Upload GDrive OK — lxc-data-20260403-225902.tar.gz (1.9 MB) |
| Périmètre backup corrigé | ✅ rclone.conf + crontabs/ ajoutés |
Leçon pour futures migrations¶
Le
crontab -lde root et/root/.config/rclone/doivent impérativement figurer dans le périmètre du script de backup host. Une migration fraîche de Proxmox ne restaure aucun de ces éléments — et sans rclone + crontab, la chaîne de backup configs s'interrompt silencieusement.