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