Installation pas à pas
Le Module 01 a préparé le stockage réseau ; le Module 13 a installé les scripts. Ici on assemble et automatise la chaîne.
14.1 · Vérifier les prérequis
Lecture seulecommand -v jarvis-backup
command -v jarvis-backup-extra
command -v jarvis-backup-safe
command -v findmnt
command -v sha256sum
command -v sg
systemctl --user is-active hermes-gateway.service || true
docker inspect open-webui >/dev/null 2>&1 && echo "Open WebUI : présent
Pourquoi : Les scripts publics sont déjà installés au Module 13. Ce module configure leur environnement et leur planification.
Résultat attendu : Les trois scripts sont résolus depuis ~/.local/bin et les outils système sont disponibles.
14.2 · Configurer jarvis.env
Modificationnano "$HOME/.config/jarvis/jarvis.env
Pourquoi : Le point de montage, l’export NFS et le GID appartiennent à l’installation locale, pas au code public.
Résultat attendu : Les variables JARVIS_NFS_MOUNT, JARVIS_NFS_SOURCE, JARVIS_NFS_GROUP et JARVIS_NFS_GID correspondent à votre environnement.
14.3 · Vérifier la configuration sans afficher de secret
Validationset -a
. "$HOME/.config/jarvis/jarvis.env"
set +a
printf 'Montage NFS : %s
' "$JARVIS_NFS_MOUNT"
printf 'Groupe NFS : %s
' "$JARVIS_NFS_GROUP"
printf 'GID NFS : %s
' "$JARVIS_NFS_GID"
findmnt -T "$JARVIS_NFS_MOUNT
Pourquoi : Le fichier jarvis.env ne doit contenir que des paramètres non secrets.
Résultat attendu : Le point de montage correspond au partage préparé au Module 01.
14.4 · Vérifier le groupe NFS
Validationset -a; . "$HOME/.config/jarvis/jarvis.env"; set +a
getent group "$JARVIS_NFS_GROUP"
id
sg "$JARVIS_NFS_GROUP" -c "test -w '$JARVIS_NFS_MOUNT' && echo SG_NFS_WRITE=OK
Pourquoi : jarvis-backup-safe exécute le backup principal avec le groupe NFS afin d’éviter les problèmes de groupes hérités par systemd utilisateur.
Résultat attendu : La commande affiche SG_NFS_WRITE=OK.
14.5 · Valider à nouveau les scripts publics
Validationbash -n "$HOME/.local/bin/jarvis-backup"
bash -n "$HOME/.local/bin/jarvis-backup-extra"
bash -n "$HOME/.local/bin/jarvis-backup-safe"
grep -nE '192\.168\.|/home/[A-Za-z0-9._-]+' "$HOME/.local/bin/jarvis-backup" "$HOME/.local/bin/jarvis-backup-extra" "$HOME/.local/bin/jarvis-backup-safe" || true
Pourquoi : Aucune édition manuelle des scripts n’est nécessaire : seules les variables de jarvis.env changent.
Résultat attendu : Syntaxe Bash valide et aucune ancienne valeur privée.
14.6 · Tester le snapshot complémentaire
Modificationjarvis-backup-extra
cat "$HOME/.hermes/backup-extra-status.txt"
find "$HOME/.hermes/backup-extra" -maxdepth 3 -type f | sort | head -80
Pourquoi : Le script stoppe brièvement Camofox/Open WebUI si nécessaire, copie les données persistantes dans un staging puis publie le snapshot seulement après validation.
Résultat attendu : status=OK et présence de open-webui/data/webui.db.
14.7 · Contrôler les éléments critiques du snapshot
Validationtest -f "$HOME/.hermes/backup-extra/open-webui/data/webui.db" && echo "Open WebUI DB : OK"
test -f "$HOME/.hermes/backup-extra/open-webui/container-inspect.json" && echo "Docker inspect : OK"
test -f "$HOME/.hermes/backup-extra/voice/requirements.txt" && echo "Voix metadata : OK" || true
find "$HOME/.hermes/backup-extra/.camofox" -maxdepth 2 -type d 2>/dev/null | head -40
Pourquoi : webui.db est bloquant ; les éléments voix/Camofox reflètent les composants réellement installés.
Résultat attendu : La base Open WebUI est présente, les autres éléments sont cohérents avec votre installation.
14.8 · Lancer le backup complet
Modificationjarvis-backup-safe
Pourquoi : C’est le point d’entrée normal : arrêt temporaire du Gateway si nécessaire, snapshot complémentaire, backup principal avec groupe NFS puis redémarrage garanti par trap.
Résultat attendu : La commande termine sur JARVIS SAFE BACKUP : OK.
14.9 · Identifier et contrôler la dernière archive locale
Validationset -a; . "$HOME/.config/jarvis/jarvis.env"; set +a
BACKUP_DIR="${JARVIS_BACKUP_DIR:-$HOME/jarvis-backups}"
LATEST="$(ls -1t "$BACKUP_DIR"/jarvis-*.tar.gz | head -1)"
CHECKSUM="${LATEST}.sha256"
ls -lh "$LATEST" "$CHECKSUM"
sha256sum -c "$CHECKSUM"
tar -tzf "$LATEST" >/dev/null && echo "Archive locale : OK
Pourquoi : Le script principal effectue déjà ces contrôles ; on les répète pour valider la chaîne de bout en bout.
Résultat attendu : Checksum OK et archive tar.gz lisible.
14.10 · Vérifier le contenu sauvegardé
Validationset -a; . "$HOME/.config/jarvis/jarvis.env"; set +a
BACKUP_DIR="${JARVIS_BACKUP_DIR:-$HOME/jarvis-backups}"
LATEST="$(ls -1t "$BACKUP_DIR"/jarvis-*.tar.gz | head -1)"
tar -tzf "$LATEST" | grep -E '^\.hermes/|^\.local/bin/jarvis-(health|system-info)$|^\.config/systemd/user/' | head -100
tar -tzf "$LATEST" | grep -E '^\.hermes/backup-extra/' | head -40
Pourquoi : Le runtime Hermes et ses caches temporaires sont volontairement exclus, tandis que les données persistantes et le snapshot complémentaire sont sauvegardés.
Résultat attendu : Les éléments attendus sont visibles dans l’archive.
14.11 · Vérifier la copie NFS et son checksum
Validationset -a; . "$HOME/.config/jarvis/jarvis.env"; set +a
BACKUP_DIR="${JARVIS_BACKUP_DIR:-$HOME/jarvis-backups}"
LATEST="$(ls -1t "$BACKUP_DIR"/jarvis-*.tar.gz | head -1)"
NAME="$(basename "$LATEST")"
sg "$JARVIS_NFS_GROUP" -c "test -f '$JARVIS_NFS_MOUNT/$NAME' && test -f '$JARVIS_NFS_MOUNT/$NAME.sha256' && echo NFS_COPY=OK"
sg "$JARVIS_NFS_GROUP" -c "cd '$JARVIS_NFS_MOUNT' && sha256sum -c '$NAME.sha256'
Pourquoi : La sauvegarde réseau n’est validée que si la copie et son checksum sont tous les deux présents et cohérents.
Résultat attendu : NFS_COPY=OK puis checksum OK.
14.12 · Contrôler la rotation
Lecture seuleset -a; . "$HOME/.config/jarvis/jarvis.env"; set +a
DAYS="${JARVIS_BACKUP_RETENTION_DAYS:-14}"
BACKUP_DIR="${JARVIS_BACKUP_DIR:-$HOME/jarvis-backups}"
find "$BACKUP_DIR" -maxdepth 1 -type f -mtime "+$DAYS" -print
sg "$JARVIS_NFS_GROUP" -c "find '$JARVIS_NFS_MOUNT' -maxdepth 1 -type f -mtime '+$DAYS' -print
Pourquoi : Le script applique la rotation automatiquement. Ici on liste seulement ce qui est assez ancien pour être concerné.
Résultat attendu : La politique de rétention correspond à la valeur définie dans jarvis.env.
14.13 · Créer le service systemd utilisateur
Modificationmkdir -p "$HOME/.config/systemd/user"
cat > "$HOME/.config/systemd/user/jarvis-backup.service" <<'EOF'
[Unit]
Description=Backup de la configuration Jarvis
After=network-online.target
[Service]
Type=oneshot
ExecStart=%h/.local/bin/jarvis-backup-safe
EOF
Pourquoi : Le service appelle uniquement le wrapper sûr, jamais jarvis-backup directement.
Résultat attendu : Le fichier jarvis-backup.service existe.
14.14 · Créer le timer quotidien
Modificationcat > "$HOME/.config/systemd/user/jarvis-backup.timer" <<'EOF'
[Unit]
Description=Backup quotidien de Jarvis
[Timer]
OnCalendar=*-*-* 03:15:00
RandomizedDelaySec=10m
Persistent=true
Unit=jarvis-backup.service
[Install]
WantedBy=timers.target
EOF
Pourquoi : Le Golden Build planifie un backup quotidien vers 03:15 avec un léger décalage aléatoire.
Résultat attendu : Le timer pointe vers le service de backup sûr.
14.15 · Valider les unités systemd
Validationsystemd-analyze --user verify "$HOME/.config/systemd/user/jarvis-backup.service" "$HOME/.config/systemd/user/jarvis-backup.timer"
systemctl --user daemon-reload
Pourquoi : On refuse d’activer une unité contenant une erreur de syntaxe.
Résultat attendu : Aucune erreur concernant les unités Jarvis.
14.16 · Activer le timer
Modificationloginctl show-user "$USER" -p Linger
systemctl --user enable --now jarvis-backup.timer
systemctl --user list-timers jarvis-backup.timer
Pourquoi : Linger=yes permet au gestionnaire systemd utilisateur de fonctionner hors session interactive.
Résultat attendu : Le timer est activé et une prochaine exécution est planifiée.
14.17 · Tester via systemd
Modificationsystemctl --user start jarvis-backup.service
systemctl --user status jarvis-backup.service --no-pager
journalctl --user -u jarvis-backup.service -n 120 --no-pager
Pourquoi : Une exécution directe ne suffit pas : le même workflow doit fonctionner dans l’environnement du gestionnaire systemd utilisateur.
Résultat attendu : Le journal se termine sans échec et montre JARVIS SAFE BACKUP : OK.
14.18 · Vérifier le retour des services
Validationsystemctl --user is-active hermes-gateway.service || true
systemctl --user is-active camofox.service || true
docker inspect -f '{{.State.Running}}' open-webui 2>/dev/null || true
Pourquoi : Les wrappers mémorisent l’état initial et restaurent les services qui étaient actifs avant le snapshot.
Résultat attendu : Hermes, Camofox et Open WebUI retrouvent leur état attendu.
14.19 · Simuler une restauration
Lecture seulejarvis-bootstrap --simulate-restore
Pourquoi : Le bootstrap vérifie checksum, intégrité de l’archive et chemins dangereux avant toute restauration réelle.
Résultat attendu : La simulation audite le dernier backup sans écraser la machine.