Files
Joplin_server_daily_diag/README.md
2025-11-13 16:39:09 +01:00

7.8 KiB
Raw Permalink Blame History

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 lAPI 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.me
  • Origin: https://joplIn.server.me
  • X-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 loccupation 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 :

  • email
  • full_name
  • total_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 nest disponible, le message contient :

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 :

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"

Lutilisateur 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

  1. Créer le répertoire des scripts (si besoin) :

    mkdir -p /home/scripts
    
  2. Créer le fichier :

    nano /home/scripts/server_daily_diag.sh
    
  3. Coller la version complète du script.

  4. Rendre le script exécutable :

    chmod +x /home/scripts/server_daily_diag.sh
    
  5. Tester manuellement :

    /home/scripts/server_daily_diag.sh
    

    Vérifier :

    • quaucune erreur critique napparaît,
    • que tu reçois un message dans Discord,
    • quil 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 -Rs pour 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 lheure 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 sur total_bytes dans la boucle.


10. Dépannage rapide

  • Pas de message Discord :

    • Vérifier linstall 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 :

    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 nutilise peut-être pas systemd.

Fin du README