Thomas Fransolet c9580fd0a8 Scripts de sauvegarde Postgres
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>
2026-09-07 16:11:33 +02:00

39 lines
1.5 KiB
Bash

#!/bin/sh
# Sauvegarde de la prod MongoDB. LECTURE SEULE : ce script ne contient
# volontairement aucun mongorestore, pour qu'aucune erreur de manipulation
# ne puisse écrire dans la prod.
set -eu
URI=${MONGO_URI:?export MONGO_URI="mongodb://user:pass@host:27017/?authSource=admin"}
DB=${MONGO_DB:-TabletDb}
LABEL=${LABEL:-prod}
OUT=${OUT:-./backups/mongo}
COLLECTIONS=${COLLECTIONS:-Instances Configurations Sections Resources Users Devices}
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
DEST="$OUT/${LABEL}_${STAMP}"
mkdir -p "$DEST"
# MSYS_NO_PATHCONV : sous Git Bash, un argument commençant par "/" est réécrit en chemin Windows.
# Variable ignorée ailleurs, le script reste utilisable tel quel sur le VPS.
HOST_DEST=$(cd "$DEST" && { pwd -W 2>/dev/null || pwd; })
run() { MSYS_NO_PATHCONV=1 docker run --rm -w /out -v "$HOST_DEST:/out" mongo:6 "$@"; }
# 1. Archive BSON : le vrai filet, types préservés, restaurable dans un Mongo local.
run mongodump --uri="$URI" --db="$DB" --gzip --archive=dump.gz
# 2. JSON par collection : lisible, diffable, et sert aux comptages de contrôle
# après la bascule Postgres (point 15 du §1quinquies).
for c in $COLLECTIONS; do
run mongoexport --uri="$URI" --db="$DB" --collection="$c" \
--jsonArray --pretty --out="$DB.$c.json"
done
echo "--- comptages ---"
for c in $COLLECTIONS; do
n=$(run mongosh "$URI" --quiet --eval "db.getSiblingDB('$DB').$c.countDocuments()")
printf '%-18s %s\n' "$c" "$n"
done | tee "$DEST/counts.txt"
echo "$DEST"