Update README.md

This commit is contained in:
Ssyleric
2025-11-13 16:39:09 +01:00
committed by GitHub
parent 0a844c0871
commit 09c887c70d

368
README.md
View File

@@ -1 +1,367 @@
# Joplin_server_daily_diag
# 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 ✅