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 :
http://127.0.0.1:22300/api/ping
avec les en-têtes :
Host: joplIn.server.meOrigin: https://joplIn.server.meX-Forwarded-Proto: https
Si la réponse est HTTP 200 et { "status": "ok" }, le statut est :
API Joplin : OK (200, <message>)
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 :
df -hT
Le résumé Discord affiche notamment l’occupation de / :
Disque racine : 32% used on /
3.3. Espace disque par utilisateur Linux
Pour chaque répertoire dans /home/* :
du -sb /home/<user>
Le script loggue une ligne de ce type :
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 :
ps -eo pid,user,pcpu,pmem,comm --sort=-pcpu | head -n 6 -
Top 5 processus RAM :
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 :
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 :
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 :
emailfull_nametotal_item_size(en octets)
La requête utilisée est :
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 :
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” :
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 :
Joplin users:
(Aucune donnée Joplin ou stats désactivées)
4. Prérequis
4.1. Outils
bashcurljq(obligatoire pour Discord)ps,df,free,du,uptimejournalctl(si systemd)psql(client PostgreSQL)
Installation minimale sur Debian/Ubuntu :
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 :
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 :
WEBHOOK="https://discord.com/api/webhooks/1234567890000000987654321/hsagsklzjkldhfgasouihfgdhfdousahFLDSAHFOUHFJNDAFOUADHFAOUSFHDOU"
⚠️ Si tu le changes, pense à adapter dans le script.
5. Installation
-
Créer le répertoire des scripts (si besoin) :
mkdir -p /home/scripts -
Créer le fichier :
nano /home/scripts/server_daily_diag.sh -
Coller la version complète du script.
-
Rendre le script exécutable :
chmod +x /home/scripts/server_daily_diag.sh -
Tester manuellement :
/home/scripts/server_daily_diag.shVé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 :
crontab -e
Ajouter la ligne :
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 à :
🧾 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 -Rspour encoder correctement le contenu multiligne :JSON_PAYLOAD="$(printf '%s' "${SUMMARY_TRIMMED}" | jq -Rs '{content: .}')" -
Limitation stricte (< 2000 caractères) :
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) :
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) :
ENABLE_JOPLIN_DB_STATS=0 -
Limiter les utilisateurs Joplin affichés dans le résumé (par exemple > 1 Go)
→ possible en ajoutant une condition surtotal_bytesdans la boucle.
10. Dépannage rapide
-
Pas de message Discord :
- Vérifier l’install de
jqetcurl. - Vérifier le webhook Discord.
- Regarder les logs dans
/var/log/server-daily-diag/.
- Vérifier l’install de
-
Section Joplin vide ou erreur DB :
-
Vérifier que
psqlest installé. -
Tester la connexion à la DB à la main :
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.
- Le conteneur / système n’utilise peut-être pas
Fin du README ✅