backups pi5
maj des backups + discord notification
This commit is contained in:
parent
da3386bffa
commit
58ed343aa7
2 changed files with 162 additions and 0 deletions
115
infra_conf/protonsync.sh
Normal file
115
infra_conf/protonsync.sh
Normal 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 30 jours…"
|
||||
find "${LOG_DIR}" -type f -name "*.log" -mtime +30 -print -delete
|
||||
|
||||
exit $RC
|
||||
47
infra_conf/tarbackup.sh
Normal file
47
infra_conf/tarbackup.sh
Normal 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' 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 <dossier> -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é."
|
||||
Loading…
Add table
Add a link
Reference in a new issue