Skip to content

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 : sdc dans le plan = PBS secondary. Or sdc1 = disque media (HGST 4TB). Le vrai candidat PBS secondary est sda (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 :

zfs set mountpoint=/mnt/lxc-data rpool/lxc-data

/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/sdc1 ou /dev/sdd1 existent 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

  1. /etc/proxmox-backupchmod 700 + chown backup:backup obligatoire
  2. datastore.cfg → indentation tabulation (\t), jamais espaces
  3. proxy.pem doit exister avant démarrage
  4. Authentification PVE→PBS : ne pas utiliser root@pam direct (401 PAM) → API token PBS
  5. pvesm add pbs : passer --password explicitement, le .pw n'est pas lu à la création

Bash — Pièges copier-coller

  • Le ! dans root@pam!pve-token dé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 -e dans 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 nic0enp4s0 (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-localpbs-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.db avec 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éé :

bash /mnt/lxc-data/docker-101/uptime-kuma/restore-host-artefacts.sh

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é :

# Ajouté dans le tar de backup-proxmox-host.sh
/root/.config/rclone/ \
/var/spool/cron/crontabs/ \

É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 -l de 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.