Paillasse/ansible/roles/sauvegardes/templates/sauvegarde-dedibackup.sh.j2
Adam Belkacemi e879a214a9 ajoute les sauvegardes chiffrées vers Dedibackup (rôle Ansible, timer quotidien, rotation)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-07 11:08:22 +02:00

75 lines
2.5 KiB
Django/Jinja

#!/bin/bash
# Géré par Ansible (rôle sauvegardes) — ne pas modifier à la main.
#
# Archive {{ sauvegardes_repertoires | join(', ') }} en tar.zst, chiffre avec age
# (clé publique du serveur — la clé privée ne quitte jamais le serveur, voir
# {{ sauvegardes_age_cle }}), envoie vers Dedibackup en FTP, puis applique la
# rotation ({{ sauvegardes_retention_quotidiennes }} quotidiennes,
# {{ sauvegardes_retention_hebdomadaires }} hebdomadaires).
set -euo pipefail
# Les identifiants ne sont jamais affichés ni journalisés : on désactive
# l'option xtrace pour cette ligne précise, par précaution.
set +x
source /root/.dedibackup
AGE_KEY="{{ sauvegardes_age_cle }}"
AGE_PUB=$(grep -oP '(?<=public key: )age1\S+' "$AGE_KEY")
DATE=$(date +%Y%m%d)
DOW=$(date +%u)
SEMAINE=$(date +%G-W%V)
WORKDIR=$(mktemp -d)
trap 'rm -rf "$WORKDIR"' EXIT
ARCHIVE_QUOT="quotidienne-${DATE}.tar.zst.age"
tar --exclude="{{ sauvegardes_age_dir }}" --exclude='/root/.dedibackup' \
-I zstd -cf - {{ sauvegardes_repertoires | join(' ') }} \
| age -r "$AGE_PUB" -o "$WORKDIR/$ARCHIVE_QUOT"
lftp -u "$DEDIBACKUP_USER,$DEDIBACKUP_PASS" "$DEDIBACKUP_HOST" -e "
set ftp:ssl-allow no
put $WORKDIR/$ARCHIVE_QUOT
quit
"
logger -t sauvegarde-dedibackup "Quotidienne envoyée : $ARCHIVE_QUOT"
if [ "$DOW" = "{{ sauvegardes_jour_hebdomadaire }}" ]; then
ARCHIVE_HEBDO="hebdomadaire-${SEMAINE}.tar.zst.age"
cp "$WORKDIR/$ARCHIVE_QUOT" "$WORKDIR/$ARCHIVE_HEBDO"
lftp -u "$DEDIBACKUP_USER,$DEDIBACKUP_PASS" "$DEDIBACKUP_HOST" -e "
set ftp:ssl-allow no
put $WORKDIR/$ARCHIVE_HEBDO
quit
"
logger -t sauvegarde-dedibackup "Hebdomadaire envoyée : $ARCHIVE_HEBDO"
fi
# --- Rotation : on ne garde que les N plus récentes de chaque catégorie. ---
rotation() {
local motif="$1" garder="$2"
local liste a_supprimer
liste=$(lftp -u "$DEDIBACKUP_USER,$DEDIBACKUP_PASS" "$DEDIBACKUP_HOST" -e "
set ftp:ssl-allow no
cls -1 ${motif}
quit
" 2>/dev/null | sort)
a_supprimer=$(echo "$liste" | head -n -"$garder")
if [ -n "$a_supprimer" ]; then
local commandes=""
while IFS= read -r fichier; do
[ -n "$fichier" ] && commandes+="rm $fichier;"
done <<< "$a_supprimer"
lftp -u "$DEDIBACKUP_USER,$DEDIBACKUP_PASS" "$DEDIBACKUP_HOST" -e "
set ftp:ssl-allow no
$commandes
quit
"
logger -t sauvegarde-dedibackup "Rotation $motif : supprimé $(echo "$a_supprimer" | wc -l) fichier(s)."
fi
}
rotation "quotidienne-*.tar.zst.age" {{ sauvegardes_retention_quotidiennes }}
rotation "hebdomadaire-*.tar.zst.age" {{ sauvegardes_retention_hebdomadaires }}