# 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 ✅