#!/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"