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

368 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
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.
# 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 :
```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, <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 :
```bash
df -hT
```
Le résumé Discord affiche notamment loccupation de `/` :
```text
Disque racine : 32% used on /
```
---
### 3.3. Espace disque par utilisateur Linux
Pour chaque répertoire dans `/home/*` :
```bash
du -sb /home/<user>
```
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 nest 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"
```
Lutilisateur 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 :
- 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 :
```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 lheure 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 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 :
```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 nutilise peut-être pas `systemd`.
---
Fin du README ✅