diff --git a/README.md b/README.md index f0fc4b9..79aad7e 100644 --- a/README.md +++ b/README.md @@ -1 +1,367 @@ -# Joplin_server_daily_diag \ No newline at end of file +# README – Script `Joplin_server_daily_diag.sh` + +## 1. Objectif + +Ce script exécute **un diagnostic complet du serveur Joplin** chaque jour et envoie un **rapport sur Discord** avec : + +- ✅ Statut de l’API Joplin (`/api/ping`) +- ✅ Espace disque global (`df -hT`) +- ✅ Ressources système (CPU / RAM / top process) +- ✅ Événements système majeurs des dernières 24h (`journalctl -p 0..3`) +- ✅ Espace disque utilisé par chaque utilisateur **Linux** (dossiers `/home/*`) +- ✅ Espace disque utilisé par chaque utilisateur **Joplin** (via PostgreSQL, champ `total_item_size`) +- ✅ Envoi **Discord** : + - message résumé (sous la limite **2000 caractères**) + - + **fichier log complet en pièce jointe** + +Il est prévu pour tourner automatiquement via **cron** tous les jours à **06:00**. + +--- + +## 2. Emplacement et fichiers + +- Script principal : + `/home/scripts/server_daily_diag.sh` + +- Dossier des logs : + `/var/log/server-daily-diag/` + +- Exemple de fichier log généré : + `/var/log/server-daily-diag/server_daily_diag_YYYY-MM-DD_HH-MM-SS.log` + +--- + +## 3. Fonctionnalités détaillées + +### 3.1. Ping Joplin Server + +Le script interroge : + +```bash +http://127.0.0.1:22300/api/ping +``` + +avec les en-têtes : + +- `Host: joplIn.server.me` +- `Origin: https://joplIn.server.me` +- `X-Forwarded-Proto: https` + +Si la réponse est `HTTP 200` et `{ "status": "ok" }`, le statut est : + +```text +API Joplin : OK (200, ) +``` + +Sinon, le statut est marqué comme **KO** et la réponse brute est loggée dans le fichier. + +--- + +### 3.2. Espace disque global + +Commande utilisée : + +```bash +df -hT +``` + +Le résumé Discord affiche notamment l’occupation de `/` : + +```text +Disque racine : 32% used on / +``` + +--- + +### 3.3. Espace disque par utilisateur Linux + +Pour chaque répertoire dans `/home/*` : + +```bash +du -sb /home/ +``` + +Le script loggue une ligne de ce type : + +```text +User Linux: USER$ -> 12GB (~ 12884901888 B) [/home/ersyl] +``` + +--- + +### 3.4. Ressources système + +- **Uptime & load average** : `uptime` + lecture de `/proc/loadavg` +- **Mémoire** : `free -h` +- **Top 5 processus CPU** : + + ```bash + ps -eo pid,user,pcpu,pmem,comm --sort=-pcpu | head -n 6 + ``` + +- **Top 5 processus RAM** : + + ```bash + ps -eo pid,user,pcpu,pmem,comm --sort=-pmem | head -n 6 + ``` + +Toutes ces infos sont écrites dans le log joint, et un résumé est inclus dans le message Discord : + +```text +Charge (1/5/15min): 0.00,0.01,0.05 +Mémoire : 247Mi / 979Mi used +``` + +--- + +### 3.5. Événements système (24h) + +Les événements critiques sont récupérés via : + +```bash +journalctl -p 0..3 --since "24 hours ago" --no-pager | tail -n 300 +``` + +> Niveaux 0..3 = `emerg`, `alert`, `crit`, `err`. + +Seuls les **300 dernières lignes** sont gardées pour éviter un log énorme. + +--- + +### 3.6. Espace disque par utilisateur Joplin (PostgreSQL) + +Le script interroge la base Joplin pour récupérer, **par utilisateur** : + +- `email` +- `full_name` +- `total_item_size` (en octets) + +La requête utilisée est : + +```sql +SELECT email, full_name, COALESCE(total_item_size,0) AS total_item_size +FROM users +ORDER BY total_item_size DESC; +``` + +Chaque ligne est logguée ainsi : + +```text +Joplin user: USER_0001@gmail.com (admin) -> 0B (~ 0 B) +Joplin user: USER_0002@gmail.com (syleric) -> 0B (~ 0 B) +``` + +Et **un extrait** est ajouté dans le résumé Discord, juste après la ligne “Mémoire” : + +```text +Mémoire : 247Mi / 979Mi used + +Joplin users: +Joplin user: USER_0001@gmail.com (admin) -> 0B (~ 0 B) +Joplin user: USER_0002@gmail.com (syleric) -> 0B (~ 0 B) +``` + +Si aucune donnée n’est disponible, le message contient : + +```text +Joplin users: +(Aucune donnée Joplin ou stats désactivées) +``` + +--- + +## 4. Prérequis + +### 4.1. Outils + +- `bash` +- `curl` +- `jq` (obligatoire pour Discord) +- `ps`, `df`, `free`, `du`, `uptime` +- `journalctl` (si systemd) +- `psql` (client PostgreSQL) + +Installation minimale sur Debian/Ubuntu : + +```bash +apt update +apt install -y jq postgresql-client +``` + +*(adapter si certains paquets sont déjà présents)* + +--- + +### 4.2. Accès base de données Joplin + +Le script suppose que Joplin Server utilise PostgreSQL, avec les variables suivantes configurées dans le script : + +```bash +ENABLE_JOPLIN_DB_STATS=1 + +JOPLIN_DB_HOST="127.0.0.1" +JOPLIN_DB_PORT="5432" +JOPLIN_DB_NAME="joplin" +JOPLIN_DB_USER="joplin" +JOPLIN_DB_PASSWORD="PASSWORDxxxXXX1233764" +``` + +L’utilisateur PostgreSQL `joplin` doit avoir les droits **SELECT** sur la table `users`. + +--- + +### 4.3. Webhook Discord + +Le script utilise ton webhook : + +```bash +WEBHOOK="https://discord.com/api/webhooks/1234567890000000987654321/hsagsklzjkldhfgasouihfgdhfdousahFLDSAHFOUHFJNDAFOUADHFAOUSFHDOU" +``` + +> ⚠️ Si tu le changes, pense à adapter dans le script. + +--- + +## 5. Installation + +1. Créer le répertoire des scripts (si besoin) : + + ```bash + mkdir -p /home/scripts + ``` + +2. Créer le fichier : + + ```bash + nano /home/scripts/server_daily_diag.sh + ``` + +3. Coller la version complète du script. + +4. Rendre le script exécutable : + + ```bash + chmod +x /home/scripts/server_daily_diag.sh + ``` + +5. Tester manuellement : + + ```bash + /home/scripts/server_daily_diag.sh + ``` + + Vérifier : + - qu’aucune erreur critique n’apparaît, + - que tu reçois un message dans Discord, + - qu’il y a une **pièce jointe** avec le log complet. + +--- + +## 6. Planification via cron (tous les jours à 6h) + +En **root** sur le conteneur / VM Joplin : + +```bash +crontab -e +``` + +Ajouter la ligne : + +```cron +0 6 * * * /home/scripts/server_daily_diag.sh >/dev/null 2>&1 +``` + +Cela exécutera le diagnostic tous les jours à **06:00** et enverra automatiquement le rapport sur Discord. + +--- + +## 7. Format du message Discord + +Le message ressemble à : + +```text +🧾 Rapport quotidien serveur + +Host : joplin +Date : 2025-11-13 06:00:01 + +API Joplin : OK (200, Joplin Server is running) +Disque racine : 32% used on / +Charge (1/5/15min): 0.00,0.01,0.05 +Mémoire : 247Mi / 979Mi used + +Joplin users: +Joplin user: USER_0001@gmail.com (admin) -> 0B (~ 0 B) +Joplin user: USER_0002@gmail.com (syleric) -> 0B (~ 0 B) +Détails complets (logs, stats Joplin & users) dans le fichier joint. +``` + +Le fichier joint contient **toutes les sections complètes** (df, free, ps, journalctl, etc.). + +--- + +## 8. Respect des règles Discord (personnalisées) + +Le script respecte tes règles Discord : + +- Utilisation de `jq -Rs` pour encoder correctement le contenu multiligne : + + ```bash + JSON_PAYLOAD="$(printf '%s' "${SUMMARY_TRIMMED}" | jq -Rs '{content: .}')" + ``` + +- Limitation stricte (< 2000 caractères) : + + ```bash + SUMMARY_TRIMMED="$(printf '%s +' "${SUMMARY}" | cut -c1-1900)" + ``` + +- Envoi du message **+ fichier joint** : + + ```bash + curl -sS -X POST -F "payload_json=${JSON_PAYLOAD}" -F "file=@${LOG_FILE};type=text/plain" "${WEBHOOK}" + ``` + +--- + +## 9. Personnalisation possible + +- Modifier l’heure de la tâche cron (ex : 3h du matin) : + + ```cron + 0 3 * * * /home/scripts/server_daily_diag.sh >/dev/null 2>&1 + ``` + +- Désactiver temporairement les stats Joplin (par exemple si la DB est indisponible) : + + ```bash + ENABLE_JOPLIN_DB_STATS=0 + ``` + +- Limiter les utilisateurs Joplin affichés dans le résumé (par exemple > 1 Go) + → possible en ajoutant une condition sur `total_bytes` dans la boucle. + +--- + +## 10. Dépannage rapide + +- **Pas de message Discord :** + - Vérifier l’install de `jq` et `curl`. + - Vérifier le webhook Discord. + - Regarder les logs dans `/var/log/server-daily-diag/`. + +- **Section Joplin vide ou erreur DB :** + - Vérifier que `psql` est installé. + - Tester la connexion à la DB à la main : + + ```bash + JOPLIN_DB_PASSWORD="PASSWORDxxxXXX1233764" psql -h 127.0.0.1 -p 5432 -U joplin -d joplin -c "SELECT 1;" + ``` + +- **Journalctl vide ou erreur :** + - Le conteneur / système n’utilise peut-être pas `systemd`. + +--- + +Fin du README ✅