Dump -Fc avec vérification de relecture et rotation, test de restauration qui compare les comptages table par table, extraction par instance, contrôle de fraîcheur, units systemd et procédure de restauration écrite. Le dump Mongo est volontairement en lecture seule : aucun mongorestore, pour qu'aucune erreur de manipulation ne puisse écrire dans la prod. Ce qui manque pour que ce soit une sauvegarde : BACKUP_DEST n'est pas tranché. Tant qu'il est vide, le dump reste sur la machine qui héberge la base et ne protège de rien — le script le dit à chaque exécution. Et notify.sh ne fait qu'un logger, donc les trois surveillances écrivent dans un journal que personne ne lit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
41 lines
1.1 KiB
Bash
41 lines
1.1 KiB
Bash
#!/bin/sh
|
|
# Le mode de panne reel n'est pas "le script plante", c'est "le script ne tourne
|
|
# plus depuis trois semaines et personne ne l'a vu". Un OnFailure n'attrape pas
|
|
# ca : il faut regarder l'age de la derniere sauvegarde, pas un code de sortie.
|
|
set -eu
|
|
|
|
MAX_AGE_HOURS=${MAX_AGE_HOURS:-48}
|
|
DEST=${BACKUP_DEST:?export BACKUP_DEST}
|
|
|
|
is_remote() {
|
|
case "$1" in
|
|
/*|./*|../*) return 1 ;;
|
|
*:*) return 0 ;;
|
|
*) return 1 ;;
|
|
esac
|
|
}
|
|
|
|
if is_remote "$DEST"; then
|
|
LATEST=$(rclone lsl "$DEST" | sort -k2 | tail -1)
|
|
else
|
|
LATEST=$(ls -1t "$DEST" 2>/dev/null | head -1)
|
|
fi
|
|
|
|
if [ -z "${LATEST:-}" ]; then
|
|
echo "Aucune sauvegarde dans $DEST" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if is_remote "$DEST"; then
|
|
AGE_S=$(( $(date +%s) - $(date -d "$(echo "$LATEST" | awk '{print $2" "$3}')" +%s) ))
|
|
else
|
|
AGE_S=$(( $(date +%s) - $(stat -c %Y "$DEST/$LATEST") ))
|
|
fi
|
|
|
|
AGE_H=$(( AGE_S / 3600 ))
|
|
if [ "$AGE_H" -gt "$MAX_AGE_HOURS" ]; then
|
|
echo "Derniere sauvegarde vieille de ${AGE_H}h (seuil ${MAX_AGE_HOURS}h) : $LATEST" >&2
|
|
exit 1
|
|
fi
|
|
echo "OK — derniere sauvegarde il y a ${AGE_H}h"
|