Files
nettoyage-des-downloads/README.md
2025-12-10 13:05:11 +01:00

264 lines
6.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 dun **log propre** (un seul run à la fois) : `/var/log/cleanup_downloads.log`
- Envoi dun **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 derreur é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 quaucun 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 à lexclusion des `.nfs*`.
Il est prêt à être utilisé en production dans le LXC `docker-ptr` avec une exécution hebdomadaire via cron.