#!/bin/bash
#
# Sauvegarde d'un site → OVH Object Storage (via rclone) + rapport au Hub Pilotage.
# À copier sur chaque serveur, un fichier par site, et à planifier par cron (nuit).
# Un poller optionnel (backup-poller.sh) permet le déclenchement « à la demande »
# depuis le bouton du Hub.
#
# Prérequis (une fois par serveur) :
#   1) rclone installé + configuré : `rclone config` → remote "ovh" type "s3",
#      provider "Other", endpoint OVH (ex. s3.gra.io.cloud.ovh.net), access+secret key.
#   2) Adapter la section CONFIG ci-dessous.
#
# Cron ex. (3 h du matin) :  0 3 * * *  /home/ubuntu/backups/backup-evio.sh
#
set -uo pipefail

# ============================ CONFIG (à adapter) ============================
SITE_KEY="evio"
SITE_LABEL="Evio (RH)"
SERVER_NAME="VPS"

HUB_URL="https://hub.handivia.fr"
# Clé partagée = HUB_CRON_KEY du Hub. JAMAIS en dur dans le dépôt :
# la déposer sur le serveur dans /home/ubuntu/backups/.hub-key (chmod 600).
HUB_KEY="${HUB_CRON_KEY:-$(cat /home/ubuntu/backups/.hub-key 2>/dev/null)}"
[ -n "$HUB_KEY" ] || { echo "HUB_KEY manquante : renseigner /home/ubuntu/backups/.hub-key" >&2; exit 1; }

RCLONE_REMOTE="ovh:backups-handivia"  # remote:conteneur
KEEP_DAILY=14

MYSQL_DB="evio"; MYSQL_USER="evio"; MYSQL_PASS="******"
PG_DB=""
SQLITE_PATH=""
FILE_DIRS="/home/ubuntu/evio/storage/app/public"
# ===========================================================================

DATE=$(date +%F_%H%M)
TMP=$(mktemp -d)
ERR=""
ARCHIVE="backup-${SITE_KEY}-${DATE}.tar.gz"
trap 'rm -rf "$TMP"' EXIT

STAGE="$TMP/stage"; mkdir -p "$STAGE"
[ -n "$MYSQL_DB" ]  && { mysqldump --single-transaction -u "$MYSQL_USER" -p"$MYSQL_PASS" "$MYSQL_DB" 2>>"$TMP/e" | gzip > "$STAGE/db-mysql.sql.gz" || ERR="mysqldump KO"; }
[ -n "$PG_DB" ]     && { pg_dump "$PG_DB" 2>>"$TMP/e" | gzip > "$STAGE/db-pg.sql.gz" || ERR="pg_dump KO"; }
[ -n "$SQLITE_PATH" ] && [ -f "$SQLITE_PATH" ] && { gzip -c "$SQLITE_PATH" > "$STAGE/db-sqlite.gz" || ERR="sqlite KO"; }
[ -n "$FILE_DIRS" ] && { tar czf "$STAGE/files.tar.gz" $FILE_DIRS 2>>"$TMP/e" || ERR="tar KO"; }

# Une seule archive par sauvegarde.
tar czf "$TMP/$ARCHIVE" -C "$STAGE" . 2>>"$TMP/e" || ERR="archive KO"

DEST="$RCLONE_REMOTE/$SITE_KEY/daily"
rclone copyto "$TMP/$ARCHIVE" "$DEST/$ARCHIVE" 2>>"$TMP/e" || ERR="upload KO"
[ "$(date +%d)" = "01" ] && rclone copyto "$TMP/$ARCHIVE" "$RCLONE_REMOTE/$SITE_KEY/monthly/$ARCHIVE" 2>/dev/null

# Lien de téléchargement temporaire (presigné) si le remote le supporte.
LINK=$(rclone link "$DEST/$ARCHIVE" 2>/dev/null || echo "")

# Rotation : garder les KEEP_DAILY dernières.
mapfile -t OLD < <(rclone lsf "$DEST/" 2>/dev/null | grep '^backup-' | sort | head -n -"$KEEP_DAILY")
for f in "${OLD[@]}"; do rclone deletefile "$DEST/$f" 2>/dev/null; done

SIZE_MB=$(du -sm "$TMP/$ARCHIVE" 2>/dev/null | cut -f1)
OK=true; [ -n "$ERR" ] && OK=false

curl -s -X POST "$HUB_URL/api/backup-report?key=$HUB_KEY" -H "Content-Type: application/json" \
  -d "{\"key\":\"$SITE_KEY\",\"ok\":$OK,\"size_mb\":${SIZE_MB:-0},\"server\":\"$SERVER_NAME\",\"store\":\"$DEST/$ARCHIVE\",\"link\":\"$LINK\",\"error\":\"$ERR\",\"at\":\"$(date -u +%FT%TZ)\"}" \
  >/dev/null 2>&1

echo "[$(date)] backup $SITE_KEY → ${OK} (${SIZE_MB:-?} Mo) ${ERR}"
