#!/bin/sh
# Sauvegarde chiffrée de la base et des photos.
#
# Chiffrement avec age : la clé publique suffit pour sauvegarder, la clé privée
# n'est nécessaire qu'à la restauration. On peut donc laisser tourner ce script
# sur le serveur sans y stocker de quoi relire les sauvegardes.
#
#   ./scripts/backup.sh /chemin/de/destination
#
set -eu

DEST="${1:-./backups}"
STAMP="$(date +%Y%m%d-%H%M%S)"
KEEP_DAYS="${BACKUP_KEEP_DAYS:-30}"

mkdir -p "$DEST"

DB_USER="${POSTGRES_USER:-ama}"
DB_NAME="${POSTGRES_DB:-ama}"

echo "[backup] dump de la base…"
docker compose exec -T db pg_dump -U "$DB_USER" -d "$DB_NAME" --clean --if-exists \
  > "$DEST/ama-$STAMP.sql"

echo "[backup] photos des plats…"
docker compose run --rm -T --entrypoint tar api -cf - /srv/media 2>/dev/null \
  > "$DEST/media-$STAMP.tar" || echo "[backup] aucune photo à sauvegarder"

if [ -n "${BACKUP_AGE_RECIPIENT:-}" ] && command -v age >/dev/null 2>&1; then
  echo "[backup] chiffrement…"
  for file in "$DEST/ama-$STAMP.sql" "$DEST/media-$STAMP.tar"; do
    [ -f "$file" ] || continue
    age -r "$BACKUP_AGE_RECIPIENT" -o "$file.age" "$file"
    rm -f "$file"
  done
else
  echo "[backup] ATTENTION : BACKUP_AGE_RECIPIENT absent ou age non installé."
  echo "[backup] La sauvegarde contient des données personnelles EN CLAIR."
fi

echo "[backup] purge au-delà de $KEEP_DAYS jours…"
find "$DEST" -name 'ama-*' -mtime "+$KEEP_DAYS" -delete
find "$DEST" -name 'media-*' -mtime "+$KEEP_DAYS" -delete

echo "[backup] terminé : $DEST"
echo "[backup] Une sauvegarde jamais restaurée n'est pas une sauvegarde :"
echo "[backup] testez ./scripts/restore.sh une fois par trimestre."
