Set-OPS-Public/roles/client_backup
Daniel Allaire f1a7e43645 supervision : c'est le DEPOT qui dit ou en sont les sauvegardes
Icinga ne surveillait rien : aucun objet Host ni Service de Set-OPS, seulement
la config Debian d'origine sur localhost.

Superviser setops-sauvegarde.service aurait reproduit le defaut du jour meme :
l'unite etait VERTE sur onze noeuds pendant qu'elle n'emportait rien. Le noeud
sait qu'il a LANCE sa sauvegarde, pas qu'elle est ARRIVEE. backup-01 evalue donc
ses depots et pousse un resultat passif par noeud vers l'API Icinga.

Trois criteres, parce qu'un seul suffit a mentir : l'instantane existe, il est
recent (26 h / 50 h), il contient au moins un fichier.

Le sens du flux est delibere : le depot parle a la supervision, jamais l'inverse
— compromettre mon-01 ne donne aucun acces aux sauvegardes.

Le ttl de 6 h fait la fraicheur : si le rapporteur se tait, Icinga perime les
services tout seul. C'est le silence qui a laisse le defaut vivre un mois.

Deux erreurs corrigees par la mesure :
  - --data-urlencode refuse en Bad Request (l'API veut du JSON) ; le flux, le TLS
    et l'auth marchaient, seule la charge etait perdue.
  - le seuil « vide » en octets signalait a tort idm-01 (2363 o) : un export LDIF
    d'un annuaire a un compte pese cela. « Vide » se mesure en FICHIERS. Et le
    verdict est un AVERTISSEMENT : la machine ne distingue pas « les donnees ont
    disparu » de « il n'y en a pas encore ».

Reserve assumee : curl -k — l'API presente le cert de sa propre AC, pas step-ca.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 21:39:05 -04:00
..
defaults supervision : c'est le DEPOT qui dit ou en sont les sauvegardes 2026-08-11 21:39:05 -04:00
handlers sauvegarde : le catalogue derive du groupe, et P36 le prouve 2026-08-11 20:50:46 -04:00
meta Reconstruction propre : orchestrateur ordonné, registre des flux + pare-feu 2026-07-07 03:08:09 -04:00
tasks supervision : c'est le DEPOT qui dit ou en sont les sauvegardes 2026-08-11 21:39:05 -04:00
templates Sauvegardes applicatives (restic) : serveur_backup + client_backup — Tier 0 prouvé 2026-07-03 22:49:26 -04:00
vars supervision : c'est le DEPOT qui dit ou en sont les sauvegardes 2026-08-11 21:39:05 -04:00
README.md docs : un README par rôle (12 manquants) + carte remise à l'état du code 2026-07-29 11:32:06 -04:00

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) :

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 cheminsrestic forget --prune (rétention).

Secrets requis (Vault)

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 : 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).