diff --git a/README.md b/README.md index 1e63116..aeef315 100644 --- a/README.md +++ b/README.md @@ -1 +1,263 @@ -# nettoyage-des-downloads \ No newline at end of file +# Nettoyage des downloads (`cleanup_downloads.sh`) + +## 🎯 Objectif + +Automatiser le **nettoyage hebdomadaire** des dossiers de downloads temporaires sur le conteneur LXC **`docker-ptr`**, avec : + +- Suppression des fichiers de plus de **168 heures (7 jours)** dans : + - `/downloads/incoming/medias` + - `/downloads/incoming/music` +- Suppression des **dossiers vides** résiduels. +- Génération d’un **log propre** (un seul run à la fois) : `/var/log/cleanup_downloads.log` +- Envoi d’un **rapport détaillé sur Discord** : + - Résumé par dossier (avant / après / nombre de fichiers supprimés) + - Log complet joint en **pièce jointe**. + +Ce script est prévu pour tourner **1 fois par semaine via cron** sur `docker-ptr`. + +--- + +## 📂 Emplacement et nom du script + +- Hôte : conteneur LXC **`docker-ptr`** +- Script : + ```bash + /home/scripts/cleanup_downloads.sh + ``` + +--- + +## ⚙️ Dossiers concernés + +Le script traite **exactement** ces deux répertoires : + +- `/downloads/incoming/medias` +- `/downloads/incoming/music` + +Les deux répertoires doivent être **accessibles dans le LXC** (typiquement montés depuis OMV via NFS). + +--- + +## ⏱️ Rétention + +- Rétention actuelle : **168 heures** (7 jours) +- Paramètre dans le script : + ```bash + MIN_AGE_HOURS=168 + ``` + +Tous les fichiers plus vieux que cette durée sont candidats à la suppression (hors fichiers `.nfs*`). + +--- + +## 🧩 Pré-requis + +Sur le conteneur `docker-ptr` : + +1. **Binaire `jq`** (installé automatiquement si absent) +2. **`curl`** (normalement déjà présent) +3. Accès réseau sortant vers Discord (port HTTPS 443) +4. Dossier `/home/scripts` présent (sinon créé manuellement) : + ```bash + mkdir -p /home/scripts + ``` + +--- + +## 🧾 Contenu fonctionnel du script + +### 1. Variables principales + +- **Discord Webhook** (déjà configuré dans le script) : + + ```bash + WEBHOOK_URL="https://discord.com/api/webhooks/…" + ``` +- **Dossiers à nettoyer** : + + ```bash + DIRS=( + "/downloads/incoming/medias" + "/downloads/incoming/music" + ) + ``` +- **Rétention (168h)** : + + ```bash + MIN_AGE_HOURS=168 + ``` +- **Fichier de log** : + + ```bash + LOG_FILE="/var/log/cleanup_downloads.log" + ``` + +### 2. Comportement détaillé + +Pour chaque dossier de `DIRS` : + +1. Mesure la **taille avant** avec `du -sh`. +2. Cherche les fichiers **plus vieux que la rétention**, en excluant les `.nfs*` : + ```bash + find "$DIR" -type f -mmin +"$min_age_minutes" ! -name '.nfs*' -print + ``` +3. Supprime chaque fichier trouvé et compte le nombre de suppressions. +4. Supprime les **répertoires vides** restants : + ```bash + find "$DIR" -mindepth 1 -type d -empty -print -delete + ``` +5. Mesure la **taille après** (`du -sh`). + +Les informations sont enregistrées dans le log et résumées dans le message Discord. + +--- + +## 📝 Gestion du log + +- Fichier : `/var/log/cleanup_downloads.log` +- À chaque exécution, le log est **réinitialisé** : + ```bash + : > "$LOG_FILE" + ``` +- Le fichier joint envoyé à Discord contient **uniquement le dernier run**, avec : + - Date/heure + - Dossiers traités + - Taille avant / après + - Liste des fichiers supprimés + - Dossiers vides supprimés + - Messages d’erreur éventuels (ex. permissions). + +--- + +## 💬 Notification Discord + +Le script construit un message multi-ligne du type : + +```text +📂 Cleanup downloads (docker-ptr) + +Date : 2025-12-10 12:56:32 +Rétention : 168h (7 jours) + +Résumé par répertoire : +/downloads/incoming/medias : + • avant : 262G + • après : 262G + • supprimés : 0 +/downloads/incoming/music : + • avant : 155G + • après : 155G + • supprimés : 10 + +Log complet en pièce jointe. +``` + +Le contenu est envoyé avec `jq -Rs` pour respecter le format JSON de Discord et la limite de **2000 caractères** sur le champ `content`. +Le log est joint comme fichier texte via `curl -F "file=@…"`. + +--- + +## 🔐 Particularités NFS (`.nfs*`) + +Les fichiers de type `.nfsXXXXXXXX` sont **propres à NFS** et apparaissent lorsque : + +- un fichier est supprimé côté serveur, +- mais encore ouvert par un process côté client (lecteur, client torrent, etc.). + +Pour éviter les erreurs répétées et inutiles, le script **ignore** ces fichiers : + +```bash +! -name '.nfs*' +``` + +Ils seront nettoyés automatiquement par NFS une fois qu’aucun process ne les utilise. + +--- + +## 🚀 Installation / Mise à jour + +1. Sur `docker-ptr` : + + ```bash + mkdir -p /home/scripts + nano /home/scripts/cleanup_downloads.sh + ``` +2. Coller le script complet fourni. +3. Rendre le script exécutable : + + ```bash + chmod +x /home/scripts/cleanup_downloads.sh + ``` +4. Test manuel : + + ```bash + /home/scripts/cleanup_downloads.sh + tail -n 80 /var/log/cleanup_downloads.log + ``` +5. Vérifier que : + + - un message apparaît bien sur Discord, + - le log (`cleanup_downloads.log`) décrit uniquement le dernier run, + - les tailles avant/après et le nombre de fichiers supprimés sont cohérents. + +--- + +## ⏲️ Cron : exécution automatique hebdomadaire + +Pour lancer le script **une fois par semaine** (dimanche à 04h00) sur `docker-ptr` : + +```bash +crontab -e +``` + +Ajouter la ligne suivante : + +```cron +0 4 * * 0 /home/scripts/cleanup_downloads.sh +``` + +> ⚠️ Le chemin doit rester **absolu** (`/home/scripts/...`) pour être compatible avec cron. + +--- + +## 🔧 Personnalisation future + +- **Modifier la rétention** :Changer : + + ```bash + MIN_AGE_HOURS=168 + ``` + + Exemple pour 3 jours : + + ```bash + MIN_AGE_HOURS=72 + ``` +- **Ajouter / retirer des dossiers** :Modifier la liste : + + ```bash + DIRS=( + "/downloads/incoming/medias" + "/downloads/incoming/music" + # Ajouter ici un autre dossier éventuel + ) + ``` +- **Changer le webhook Discord** : + Modifier la valeur de : + + ```bash + WEBHOOK_URL="..." + ``` + +--- + +## ✅ Résumé + +Ce script `cleanup_downloads.sh` assure : + +- un nettoyage **automatique, sécurisé et tracé** des dossiers de downloads temporaires, +- un log clair, limité au **dernier run**, +- une **visibilité complète** via Discord (résumé + log joint), +- la compatibilité avec NFS grâce à l’exclusion des `.nfs*`. + +Il est prêt à être utilisé en production dans le LXC `docker-ptr` avec une exécution hebdomadaire via cron.