Module 14 / 16← Ordre des modules
● Backup · NFS · intégrité · systemd

Sauvegarde / stockage réseau

Configurer et activer la chaîne Golden jarvis-backup-safe → jarvis-backup-extra → jarvis-backup. Les scripts eux-mêmes sont maintenant distribués publiquement avec le site ; seules les valeurs locales du NAS sont renseignées dans jarvis.env.

Scripts

3

Contrôle

SHA-256

Rétention

14 jours par défaut

Code immuable : ne modifiez plus jarvis-backup pour changer de NAS. Éditez uniquement ~/.config/jarvis/jarvis.env.
Mode dégradé prévu : si le NFS est indisponible, la sauvegarde locale reste valide. Le Module 14 n’est toutefois complètement validé qu’après une copie NFS vérifiée.

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 seule
command -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

Modification
nano "$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

Validation
set -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

Validation
set -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

Validation
bash -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

Modification
jarvis-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

Validation
test -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

Modification
jarvis-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

Validation
set -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é

Validation
set -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

Validation
set -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 seule
set -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

Modification
mkdir -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

Modification
cat > "$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

Validation
systemd-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

Modification
loginctl 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

Modification
systemctl --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

Validation
systemctl --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 seule
jarvis-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.

Architecture de sauvegarde

1 · Wrapper sûr

jarvis-backup-safe arrête Hermes si actif et garantit son redémarrage via trap.

2 · Snapshot cohérent

jarvis-backup-extra capture Camofox, Open WebUI et les métadonnées/caches voix dans ~/.hermes/backup-extra.

3 · Archive + SHA

jarvis-backup produit l’archive locale, le checksum et les vérifie avant copie réseau.

4 · NFS + rotation

La copie distante est revérifiée par SHA-256. La rétention est pilotée par JARVIS_BACKUP_RETENTION_DAYS.

Validation du Module 14

Les trois scripts de backup sont installés en 700.
jarvis.env contient les bonnes valeurs NFS.
SG_NFS_WRITE=OK est obtenu.
jarvis-backup-extra produit status=OK.
webui.db est présent dans le snapshot.
jarvis-backup-safe termine sur OK.
L’archive locale et son SHA-256 sont valides.
La copie NFS et son SHA-256 sont valides.
La rotation correspond à la valeur configurée.
Le service et le timer systemd sont valides.
Linger=yes.
Une exécution via systemd réussit.
Les services applicatifs reviennent dans leur état attendu.
jarvis-bootstrap --simulate-restore fonctionne en lecture seule.

STOP — Module 14 validé

La sauvegarde est maintenant locale + NFS, vérifiée par SHA-256, planifiée par systemd et restaurable via le bootstrap. Le Module 15 activera le watchdog à partir du script public déjà installé.