#!/bin/sh # Trouve-KA — sauvegarde quotidienne Postgres (hub M2M32) # Author: Simon-Pierre Boucher # Contact: contact@spboucher.ai # # pg_dump format custom (compressé, restaurable sélectivement) → # ~/trouveka-backups/pg/ + copie croisée sur M2M32b (un node ≠ un backup). # Rotation : 7 quotidiennes locales; les dimanches sont gardés 28 jours. # Restauration : pg_restore -d --clean --if-exists # Pivot 2026-08-23 : deux bases — trouveka (ancien corpus web ouvert, gelé) # et trouveka_ka (moteur Groupe KA, base active). PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" export PATH DIR="$HOME/trouveka-backups/pg" LOG="$HOME/trouveka-backups/backup.log" STAMP=$(date '+%Y%m%d') mkdir -p "$DIR" log() { echo "$(date '+%F %T') [pg] $*" >> "$LOG"; } for DB in trouveka trouveka_ka; do OUT="$DIR/$DB-$STAMP.dump" if ! docker exec trouve-ka-postgres-1 pg_dump -U trouveka -d "$DB" -Fc > "$OUT.tmp" 2>>"$LOG"; then log "ÉCHEC pg_dump ($DB)" rm -f "$OUT.tmp" exit 1 fi mv "$OUT.tmp" "$OUT" SIZE=$(du -h "$OUT" | cut -f1) log "dump OK : $OUT ($SIZE)" done # Rotation : quotidiennes > 7 jours supprimées, sauf dimanches gardés 28 jours find "$DIR" \( -name 'trouveka-*.dump' -o -name 'trouveka_ka-*.dump' \) -mtime +7 | while read -r f; do d=$(basename "$f" | sed 's/.*-\([0-9]*\)\.dump/\1/') dow=$(date -j -f '%Y%m%d' "$d" '+%u' 2>/dev/null || echo 1) if [ "$dow" = "7" ]; then find "$f" -mtime +28 -delete 2>/dev/null else rm -f "$f" fi done # La copie croisée est TIRÉE par M2M32b (pull-backups.sh + clé à commande # forcée tar) — ce script n'a aucun accès sortant à assurer. exit 0