Update README.md
This commit is contained in:
368
README.md
368
README.md
@@ -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 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, <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 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/<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 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 ✅
|
||||
|
||||
Reference in New Issue
Block a user