--- # Sauvegarde applicative (logique) d'un nœud vers la cible restic hors-nœud. # Chaque nœud déclare ses "jobs" ; restic chiffre côté client + applique la rétention. client_backup_paquets: - restic # Cible (nœud serveur_backup) + transport SSH. client_backup_cible: "backup-01.{{ domaine_interne }}" client_backup_utilisateur_distant: "restic" client_backup_ssh_key: "/etc/setops/backup_ed25519" # Dépôt restic (un sous-dossier par nœud, relatif au home de l'utilisateur distant). client_backup_repo: "sftp:{{ client_backup_utilisateur_distant }}@{{ client_backup_cible }}:{{ inventory_hostname }}" client_backup_password: "{{ vault_restic_password | default('') }}" client_backup_ssh_privkey: "{{ vault_backup_ssh_privkey | default('') }}" # Dossier de préparation des dumps (pg_dump, slapcat, forgejo dump...). client_backup_staging: "/var/backups/setops" # Rétention (restic forget). client_backup_retention: "--keep-daily 7 --keep-weekly 4 --keep-monthly 6" # Planification (timer systemd). client_backup_horaire: "*-*-* 02:30:00" # Jobs déclaratifs. Chaque job : # nom : identifiant # commande : (optionnel) dump écrivant dans {{ staging }}/{{ nom }} # chemins : liste de chemins à inclure dans le snapshot restic # # CATALOGUE PAR GROUPE — c'est le rôle qui POSSEDE la donnée qui dit comment la sortir. # On sauvegarde l'ETAT NON REGENERABLE, pas ce que le code reconstruit : ni les zones # PowerDNS ni les tableaux de bord Grafana ne figurent ici, ils se redéploient. # # Les chemins reprennent les defauts du role proprietaire, mais NE PEUVENT PAS y faire # reference : `make deployer` deroule un play par groupe, et les defaults de # `serveur_forgejo` ne sont pas charges pendant le play de `client_backup`. D'ou la forme # `var | default(litteral)` — la variable gagne si l'inventaire la definit, sinon le # defaut du role proprietaire, recopie ici et a garder aligne avec lui. client_backup_catalogue: serveur_step_ca: nom: step_ca chemins: - "{{ serveur_step_ca_steppath | default('/etc/step-ca') }}" serveur_openldap: nom: openldap # slapcat lit la base a plat : pas d'authentification, coherent meme slapd arrete. commande: >- slapcat -b '{{ serveur_openldap_base_dn | default("dc=" + domaine_interne.split(".") | join(",dc=")) }}' > {{ client_backup_staging }}/openldap/annuaire.ldif chemins: ["{{ client_backup_staging }}/openldap"] serveur_postgresql: nom: postgresql # pg_dumpall : TOUTES les bases + les roles et leurs mots de passe. Une base oubliee # ici serait une base perdue — d'ou le dump global plutot qu'une liste a maintenir. commande: >- runuser -u postgres -- pg_dumpall --clean > {{ client_backup_staging }}/postgresql/toutes-bases.sql chemins: ["{{ client_backup_staging }}/postgresql"] serveur_dovecot: nom: courriel chemins: ["{{ serveur_dovecot_vmail_base | default('/var/vmail') }}"] serveur_forgejo: nom: forgejo chemins: - "{{ serveur_forgejo_data | default('/var/lib/forgejo') }}" - "{{ serveur_forgejo_config_dir | default('/etc/forgejo') }}" serveur_nextcloud: nom: nextcloud chemins: - "{{ serveur_nextcloud_data_dir | default('/var/www/nextcloud/data') }}" - "{{ (serveur_nextcloud_racine | default('/var/www/nextcloud')) + '/config' }}" serveur_rspamd: # Le bayes APPRIS est de l'etat : reconstruire le noeud reinstalle rspamd, pas ce # qu'il a appris. Les regles, elles, se redeploient et ne sont pas ici. nom: rspamd chemins: ["/var/lib/rspamd"] serveur_web_frontal: nom: web_frontal chemins: ["{{ serveur_web_frontal_racine_base | default('/srv/web') }}"] serveur_web_dorsal: nom: web_dorsal chemins: ["{{ serveur_web_dorsal_racine | default('/srv/webapp') }}"] # Jeux retenus pour CE noeud : intersection du catalogue et de ses groupes. Derive, donc # un tenant qui deplace un service emporte sa sauvegarde avec lui, sans rien re-declarer. client_backup_jobs: >- {{ client_backup_catalogue | dict2items | selectattr('key', 'in', group_names) | map(attribute='value') | list }}