From 58ed343aa72ac03d15210ca4a9cd93fa2d1322bd Mon Sep 17 00:00:00 2001 From: griffix Date: Tue, 23 Sep 2025 19:52:45 +0200 Subject: [PATCH] backups pi5 maj des backups + discord notification --- infra_conf/protonsync.sh | 115 +++++++++++++++++++++++++++++++++++++++ infra_conf/tarbackup.sh | 47 ++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 infra_conf/protonsync.sh create mode 100644 infra_conf/tarbackup.sh diff --git a/infra_conf/protonsync.sh b/infra_conf/protonsync.sh new file mode 100644 index 0000000..b69e196 --- /dev/null +++ b/infra_conf/protonsync.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ------------------------------------------------- +# Rclone sync + Discord webhook (via ENV) +# ------------------------------------------------- + +# ---------- Vérification de la variable ---------- +: "${DISCORD_WEBHOOK:?La variable d'environnement DISCORD_WEBHOOK n'est pas définie.}" + +# ---------- Configuration ---------- +SRC="/media/Seagate/archives/" +DST="remote:/backups/" +LOG_DIR="/media/Seagate/backups/" +mkdir -p "$LOG_DIR" + +DATE=$(date +"%Y%m%d_%H%M%S") +TXT_LOG="${LOG_DIR}sync_${DATE}.log" +TMP_OUT=$(mktemp) + +# ---------- Options Rclone ---------- +RCLONE_OPTS=( + --transfers 1 + --drive-chunk-size 32M + --protondrive-replace-existing-draft=true + --tpslimit 5 + --timeout 30s + --low-level-retries 10 + --stats 1s + --stats-one-line +) + +# ---------- Lancement ---------- +START_EPOCH=$(date +%s) +START_HUMAN=$(date +"%Y-%m-%d %H:%M:%S") +echo "▶️ Démarrage : $START_HUMAN" + +rclone sync "$SRC" "$DST" "${RCLONE_OPTS[@]}" >"$TMP_OUT" 2>&1 +RC=$? +END_EPOCH=$(date +%s) +END_HUMAN=$(date +"%Y-%m-%d %H:%M:%S") +DURATION=$((END_EPOCH-START_EPOCH)) + +# ---------- Extraction des stats ---------- +STATS_LINE=$(grep -i "Transferred:" "$TMP_OUT" | tail -n1 || true) +[[ -z "$STATS_LINE" ]] && STATS_LINE="Aucune statistique disponible." + +# ---------- Construction du rapport ---------- +REPORT=$(cat <"$TXT_LOG" + +# ---------- Envoi vers Discord ---------- +# Valeur par défaut au cas où RC ne serait pas défini +RC=${RC:-1} + +# Couleur selon le résultat (vert = succès, rouge = échec) +COLOR=$([ "$RC" -eq 0 ] && echo 3066993 || echo 15158332) + +# Construction sécurisée du JSON avec jq +payload=$(jq -n \ + --arg username "Rclone-Backup" \ + --arg description "$REPORT" \ + --argjson color "$COLOR" \ + ' + { + username: $username, + avatar_url: $avatar, + allowed_mentions: { parse: [] }, + embeds: [ + { + title: "Rapport de sauvegarde", + description: $description, + color: $color + } + ] + } + ') + +# Envoi avec curl, on capture le code HTTP pour le logging +http_code=$(curl -s -o /dev/null -w "%{http_code}" \ + -X POST -H "Content-Type: application/json" \ + -d "$payload" "$DISCORD_WEBHOOK") + +if [[ "$http_code" != "204" ]]; then + echo "$(date) – Webhook Discord échoué (HTTP $http_code)" >> ${LOG_DIR}/discord_error.log + echo $DISCORD_WEBHOOK >> ${LOG_DIR}/discord_error.log + echo $payload >> ${LOG_DIR}/discord_error.log +fi + +# ---------- Affichage final ---------- +echo "$REPORT" +echo "📁 Log complet → $TXT_LOG" + +# Nettoyage +rm -f "$TMP_OUT" + +echo "🧹 Suppression des logs de plus de 30 jours…" +find "${LOG_DIR}" -type f -name "*.log" -mtime +30 -print -delete + +exit $RC \ No newline at end of file diff --git a/infra_conf/tarbackup.sh b/infra_conf/tarbackup.sh new file mode 100644 index 0000000..f144cbb --- /dev/null +++ b/infra_conf/tarbackup.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------ +# Usage : ./archiver_et_nettoie.sh +# ------------------------------------------------------------ + +# ---------- 1⃣ Vérifications initiales ---------- +if [[ -z "$1" ]]; then + echo "Usage : $0 " + exit 1 +fi + +SRC_DIR="$1" + +if [[ ! -d "$SRC_DIR" ]]; then + echo "Erreur : '$SRC_DIR' n’est pas un répertoire valide." + exit 1 +fi + +# ---------- 2⃣ Dossier de destination ---------- +OUT_DIR="/media/Seagate/archives" # crée un sous‑dossier « archives » à côté du répertoire source +mkdir -p "$OUT_DIR" # le créer s’il n’existe pas encore + +# ---------- 3⃣ Création des archives ---------- +cd "$SRC_DIR" || exit 1 + +for dir in */ ; do + [[ -d "$dir" ]] || continue # ignorer les fichiers éventuels + name="${dir%/}" # nom du sous‑dossier sans le slash final + timestamp=$(date +"%Y%m%d_%H%M%S") # horodatage au format souhaité + archive_name="${name}_${timestamp}.tar.gz" + + # Crée l'archive dans le répertoire de sortie + tar -czf "${OUT_DIR}/${archive_name}" "$name" + + echo "✅ Archive créée : ${OUT_DIR}/${archive_name}" +done + +# ---------- 4⃣ Nettoyage des archives >30 jours ---------- +# find -type f -name "*.tar.gz" -mtime +30 -delete +# -mtime +30 → fichier modifié il y a plus de 30 jours +# -delete → suppression sécurisée + +echo "🧹 Suppression des archives de plus de 30 jours…" +find "$OUT_DIR" -type f -name "*.tar.gz" -mtime +30 -print -delete + +echo "✅ Nettoyage terminé." \ No newline at end of file