Choix : sauvegarder la donnée d'état (non régénérable), pas les VM (reconstructibles par le code). restic (chiffré, dédupliqué, rétention). serveur_backup = cible SFTP (backup-01). client_backup = intégration par nœud : restic + jobs déclaratifs + timer systemd + rétention, secrets voûte. Prouvé de bout en bout sur le Tier 0 : infra-pki-01 → /etc/step-ca sauvegardé hors-nœud vers backup-01, restauration byte-identique des clés CA. Reste : jobs Tier 1 (pg_dump/slapcat/vmail/forgejo) + offsite (3-2-1). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
30 lines
959 B
Django/Jinja
30 lines
959 B
Django/Jinja
#!/bin/bash
|
|
# Géré par Set-OPS (rôle client_backup). Ne pas éditer à la main.
|
|
# Sauvegarde applicative du nœud -> dépôt restic hors-nœud (chiffré, dédupliqué).
|
|
set -euo pipefail
|
|
export RESTIC_REPOSITORY="{{ client_backup_repo }}"
|
|
export RESTIC_PASSWORD_FILE="/etc/setops/restic.pass"
|
|
|
|
# 1. Dumps applicatifs (pg_dump, slapcat, forgejo dump...) vers le staging.
|
|
{% for job in client_backup_jobs %}
|
|
{% if job.commande is defined %}
|
|
install -d -m 0700 "{{ client_backup_staging }}/{{ job.nom }}"
|
|
{{ job.commande }}
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
# 2. Initialiser le dépôt s'il n'existe pas encore.
|
|
restic snapshots >/dev/null 2>&1 || restic init
|
|
|
|
# 3. Snapshot de tous les chemins déclarés.
|
|
CHEMINS=(
|
|
{% for job in client_backup_jobs %}
|
|
{% for c in job.chemins %}
|
|
"{{ c }}"
|
|
{% endfor %}
|
|
{% endfor %}
|
|
)
|
|
restic backup --host "{{ inventory_hostname }}" --tag setops "${CHEMINS[@]}"
|
|
|
|
# 4. Rétention.
|
|
restic forget {{ client_backup_retention }} --prune
|