# client_backup Intégration cliente **sauvegarde** : le nœud pousse ses **données** (pas sa VM) vers le dépôt restic hors-nœud (`serveur_backup`), chiffrées côté client, sur un timer systemd. ## Principe L'infrastructure est **reconstructible par le code** (`make reconstruire`). Ce qui ne se reconstruit pas, c'est l'**état** : clés de l'AC, annuaire, bases, courrier, dépôts Git. C'est cet état — et lui seul — que ce rôle sauvegarde. ## Rôle - Installe `restic`. - Dépose la clé SSH privée de sauvegarde et le mot de passe restic dans `/etc/setops` (`0600`), depuis la voûte. - Configure l'accès SSH vers la cible (utilisateur restreint `restic`). - Déploie `sauvegarder.sh` + l'unité et le **timer** systemd, et l'active. ## Jobs déclaratifs Chaque nœud déclare ses `client_backup_jobs` (en `group_vars`/`host_vars`) : ```yaml client_backup_jobs: - nom: step_ca chemins: [/etc/step-ca] - nom: postgresql commande: "sudo -u postgres pg_dumpall > /var/backups/setops/postgresql/all.sql" chemins: [/var/backups/setops/postgresql] ``` Le script exécute, dans l'ordre : les `commande` (dumps vers le *staging*) → `restic init` si le dépôt est neuf → `restic backup` de tous les `chemins` → `restic forget --prune` (rétention). ## Secrets requis (Vault) ```yaml vault_restic_password # mot de passe du dépôt restic (le chiffrement) vault_backup_ssh_privkey # clé privée SSH vers la cible (publique côté serveur_backup) ``` Sans eux, le rôle refuse de s'exécuter (assertion). ## Variables principales | Variable | Défaut | Rôle | | --- | --- | --- | | `client_backup_cible` | `backup-01.{{ domaine_interne }}` | Nœud dépôt | | `client_backup_repo` | `sftp:restic@:` | Un sous-dossier par nœud | | `client_backup_staging` | `/var/backups/setops` | Préparation des dumps | | `client_backup_retention` | `--keep-daily 7 --keep-weekly 4 --keep-monthly 6` | `restic forget` | | `client_backup_horaire` | `*-*-* 02:30:00` | Timer systemd | | `client_backup_jobs` | `[]` | **À déclarer par nœud** | ## Notes / limites - **Chiffrement côté client** : la cible ne voit que des blocs chiffrés — elle n'a donc pas besoin d'être aussi protégée que les sources. - `client_backup_jobs: []` = le timer tourne mais ne sauvegarde rien. C'est silencieux : vérifier que chaque nœud porteur d'état déclare ses jobs. - Un dépôt neuf est **vide jusqu'à la première exécution** : après une reconstruction from-zero, déclencher une première sauvegarde plutôt que d'attendre 02:30. - Restauration : `restic restore` avec le même mot de passe (cf. `docs/runbooks-exploitation.md`). ## Prérequis - `serveur_backup` déployé, et sa `serveur_backup_pubkey` correspondant à la clé privée de la voûte. Couche **agents** (après les services).