backups pi5

maj des backups + discord notification
This commit is contained in:
griffix 2025-09-23 19:52:45 +02:00
parent da3386bffa
commit 58ed343aa7
Signed by: griffix
GPG key ID: 9A72D1FAE36EC98A
2 changed files with 162 additions and 0 deletions

115
infra_conf/protonsync.sh Normal file
View file

@ -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 <<EOF
**🗂️ Rapport de sauvegarde Rclone**
**Début** : $START_HUMAN
**Fin** : $END_HUMAN
**Durée** : ${DURATION}s
**État** : $(if [[ $RC -eq 0 ]]; then echo "✅ Succès"; else echo "❌ Erreur (code $RC)"; fi)
**Statistiques**
\`\`\`
$STATS_LINE
\`\`\`
EOF
)
# Enregistrement du rapport texte
echo "$REPORT" >"$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 30jours…"
find "${LOG_DIR}" -type f -name "*.log" -mtime +30 -print -delete
exit $RC

47
infra_conf/tarbackup.sh Normal file
View file

@ -0,0 +1,47 @@
#!/usr/bin/env bash
# ------------------------------------------------------------
# Usage : ./archiver_et_nettoie.sh <répertoire_source>
# ------------------------------------------------------------
# ---------- 1⃣ Vérifications initiales ----------
if [[ -z "$1" ]]; then
echo "Usage : $0 <répertoire_source>"
exit 1
fi
SRC_DIR="$1"
if [[ ! -d "$SRC_DIR" ]]; then
echo "Erreur : '$SRC_DIR' nest pas un répertoire valide."
exit 1
fi
# ---------- 2⃣ Dossier de destination ----------
OUT_DIR="/media/Seagate/archives" # crée un sousdossier « archives » à côté du répertoire source
mkdir -p "$OUT_DIR" # le créer sil nexiste 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 sousdossier 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 >30jours ----------
# find <dossier> -type f -name "*.tar.gz" -mtime +30 -delete
# -mtime +30 → fichier modifié il y a plus de 30jours
# -delete → suppression sécurisée
echo "🧹 Suppression des archives de plus de 30jours…"
find "$OUT_DIR" -type f -name "*.tar.gz" -mtime +30 -print -delete
echo "✅ Nettoyage terminé."