Set-OPS-Public/roles/client_backup/README.md
Daniel Allaire 11b5bb5733 temoins : l'instantane d'avant rasage est garde, et l'etat remis lui est compare
M4 a reconstruit Technolibre par le site qui la nomme ; les 7 jeux sont revenus
de l'instantane de 11:34, mais le premier depot d'apres reconstruction l'a chasse
par --keep-daily le jour meme : plus rien a quoi comparer.

Le depot d'avant rasage est etiquete avant-raser et garde jusqu'a la
reconstruction suivante. Le bilan dit ce qui a ete restaure et si c'est encore
au depot. setops-restaurer temoins et make temoins-etat comparent l'etat vivant
a cet instantane : une perte ou une identite changee est un ecart.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:48:00 -04:00

67 lines
3.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_etiquette_avant_raser` | `avant-raser` | étiquette du dépôt d'avant rasage, gardée par la rétention jusqu'à la reconstruction suivante |
| `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).
- Témoins : `setops-restaurer temoins` (comparateur `setops-temoins`) confronte l'état vivant
à l'instantané d'avant rasage ; `make temoins-etat`, et l'étape `bilan` de la reconstruction.
## 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).