Set-OPS-Public/roles/client_backup/README.md
Daniel Allaire 8a9da0c31a restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00

64 lines
3 KiB
Markdown

# 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@<cible>:<hôte>` | 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 : **faite par la reconstruction elle-même** depuis le 2026-09-30 — chaque rôle
propriétaire inclut `tasks/restaurer.yml` et remet l'état de l'incarnation précédente ;
l'outil de nœud est `setops-restaurer` (cf. `docs/runbooks-exploitation.md` §5.0).
## 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).