diff --git a/README.md b/README.md index 3efa09d..3ba4bd2 100644 --- a/README.md +++ b/README.md @@ -1,153 +1,47 @@ -# đŸ–„ïž Discord Status Bot +# đŸ› ïž Mission : Dev GameurBot v2 +## Centralisation du Monitoring et de la Gestion PM2 SĂ©curisĂ©e -Bot Discord de monitoring serveur en temps rĂ©el. -Affiche et met Ă  jour automatiquement un message Ă©pinglĂ© dans chaque serveur Discord -avec l'Ă©tat des ressources, la cause des ralentissements, et une ETA de retour Ă  la normale. +**Objectif :** Faire Ă©voluer/crĂ©er un bot composĂ© de deux Ă©lĂ©ments : un agent de tĂ©lĂ©mĂ©trie distant (`agent.py`) qui remonte les mĂ©triques du serveur, et le bot Discord principal (`bot.py`) qui gĂšre un tableau de bord en temps rĂ©el (embed Ă©pinglĂ©) tout en permettant aux utilisateurs autorisĂ©s de relancer des services via une passerelle Linux ultra-sĂ©curisĂ©e. --- -## Architecture +## 📐 Architecture GĂ©nĂ©rale ``` -[Serveur de jeux] [n'importe oĂč] - agent.py ──── HTTP POST ────▶ bot.py - (psutil) /metrics ├── serveur aiohttp (port 8765) - ├── StatusEngine (analyse) - └── discord.py (mise Ă  jour embed Ă©pinglĂ©) - │ - ┌─────────┌─────────┐ - Guilde 1 Guilde 2 Guilde 3 ... +[Serveur de Jeux / Minecraft] [HĂ©bergement du Bot] + agent.py (psutil) bot.py + │ ├── Serveur aiohttp (Port 8765) + │─── HTTP POST (/metrics avec Secret) ───▶├── StatusEngine (Analyse & Seuils) + │ └── discord.py / disnake + │ │ (Mise Ă  jour Embed ÉpinglĂ©) + [Wrapper Bash local & PM2] │ + /usr/local/bin/manage_minecraft.sh ◀──── Applique Sudo ────────┘ (Commandes Slash /minecraft) ``` --- -## Installation +## 1. L'Agent de TĂ©lĂ©mĂ©trie (`agent.py`) -### 1. DĂ©pendances - -```bash -pip install -r requirements.txt -``` - -### 2. Configuration - -```bash -cp config.example.json config.json -``` - -Remplis `config.json` : - -| ClĂ© | Description | -|-----------------|--------------------------------------------------------------------| -| `discord_token` | Token de ton bot (https://discord.com/developers/applications) | -| `api_secret` | Mot de passe partagĂ© entre le bot et l'agent (chaĂźne alĂ©atoire) | -| `api_port` | Port HTTP du bot (dĂ©faut : 8765) | - -> ⚠ Le mĂȘme `api_secret` doit ĂȘtre renseignĂ© dans `agent.py` (`API_SECRET`) et dans `config.json`. - -### 3. Adapter l'agent - -Dans `agent.py`, modifie : - -```python -BOT_API_URL = "http://ADRESSE_DU_BOT:8765/metrics" -API_SECRET = "le_meme_secret_que_dans_config.json" -``` - -Si le bot et l'agent tournent sur la mĂȘme machine, laisse `http://localhost:8765/metrics`. - -Si le bot est sur une autre machine (VPS dĂ©diĂ© Discord), utilise son IP/domaine. - -### 4. Ajouter les mots-clĂ©s de tes services - -Dans `agent.py`, `SERVICE_KEYWORDS` : +À installer sur le serveur de jeux. Il s'exĂ©cute en tĂąche de fond (`PUSH_INTERVAL = 15s`) pour remonter les infos systĂšmes au bot principal. +- **SĂ©curitĂ© :** Authentification obligatoire via un header contenant un `API_SECRET` partagĂ©. +- **Filtrage des processus :** L'agent utilise `psutil` pour calculer la charge des services selon cette table de mots-clĂ©s : ```python SERVICE_KEYWORDS = { "minecraft": ["java", "minecraft", "paper"], "satisfactory": ["factoryserver"], "ollama": ["ollama"], - # Ajoute tes propres services ici - "mon_jeu": ["mon_process_name"], } ``` --- -## Lancement +## 2. Le Bot & Serveur d'Écoute (`bot.py`) -### Bot (Ă  lancer en premier) - -```bash -python bot.py -``` - -Ou en service systemd : - -```ini -[Unit] -Description=Discord Status Bot -After=network.target - -[Service] -WorkingDirectory=/chemin/vers/discord-status-bot -ExecStart=/usr/bin/python3 bot.py -Restart=always - -[Install] -WantedBy=multi-user.target -``` - -### Agent (sur le serveur de jeux) - -```bash -python agent.py -``` - -Idem, peut ĂȘtre lancĂ© en service systemd. - ---- - -## Configuration Discord - -### CrĂ©er le bot Discord - -1. Aller sur https://discord.com/developers/applications -2. **New Application** → donne-lui un nom -3. Onglet **Bot** → **Reset Token** → copier le token dans `config.json` -4. Activer **Server Members Intent** et **Message Content Intent** si nĂ©cessaire -5. Onglet **OAuth2 > URL Generator** : - - Scopes : `bot`, `applications.commands` - - Bot Permissions : `Send Messages`, `Manage Messages`, `Embed Links`, `Read Message History` -6. Copier l'URL gĂ©nĂ©rĂ©e et l'ouvrir pour inviter le bot sur tes serveurs - -### Configurer chaque serveur Discord - -Une fois le bot invitĂ© sur un serveur et lancĂ© localement : - -1. Va dans le salon oĂč tu veux le tableau de bord -2. Tape `/setup` -3. Le bot envoie et Ă©pingle le premier message de statut -4. RĂ©pĂšte sur chaque serveur Discord - ---- - -## Commandes slash disponibles - -| Commande | Description | Permissions | -|--------------|--------------------------------------------------|-------------| -| `/status` | Affiche l'Ă©tat actuel (message Ă©phĂ©mĂšre) | Tous | -| `/services` | DĂ©tail de chaque service dĂ©tectĂ© | Tous | -| `/setup` | Configure le salon actuel comme tableau de bord | Admin | - ---- - -## Personnalisation - -### Seuils d'alerte - -Dans `status_engine.py`, modifie `THRESHOLDS` : +Le code principal doit faire tourner un serveur Web lĂ©ger (`aiohttp`) sur le port `8765` en parallĂšle du client Discord pour intercepter les requĂȘtes de l'agent. +- **Route `POST /metrics` :** VĂ©rifie le secret. Si incorrect ──▶ renvoie un code `401`. +- **StatusEngine :** Analyse la charge selon les seuils suivants : ```python THRESHOLDS = { "cpu": {"warning": 70, "critical": 85}, @@ -155,38 +49,71 @@ THRESHOLDS = { "swap": {"warning": 40, "critical": 70}, } ``` - -### FrĂ©quence de mise Ă  jour - -- **Agent** → `PUSH_INTERVAL` dans `agent.py` (dĂ©faut : 15s) -- **Bot** → `@tasks.loop(seconds=20)` dans `bot.py` +*Si un seuil est franchi, le bot doit automatiquement trouver le processus coupable via la table des mots-clĂ©s et gĂ©nĂ©rer une explication claire (ex: "CPU Ă  82% — principal consommateur : Minecraft").* --- -## Exemple de rendu +## 3. La Passerelle de Gestion PM2 (SĂ©curitĂ© Maximale) +Pour le redĂ©marrage des serveurs via Discord, **il est strictement interdit de manipuler directement le terminal ou d'utiliser `shell=True` / `os.system`**. Tout doit passer par ce script Bash intermĂ©diaire Ă  placer sur la machine dans `/usr/local/bin/manage_minecraft.sh` (Droits `755`, propriĂ©taire `root`) : + +```bash +#!/bin/bash + +USER_MINECRAFT="discord" +PM2_PATH="/home/discord/.nvm/versions/node/v24.15.0/bin/pm2" +export PM2_HOME="/home/discord/.pm2" + +# Whitelist stricte des applications PM2 gĂ©rables +SERVEURS_AUTORISES=("survie" "skyblock" "creatif") + +ACTION=$1 # 'restart' ou 'status' +SERVEUR=$2 # ex: 'survie' + +# 1. Validation de l'action +if [[ "$ACTION" != "restart" && "$ACTION" != "status" ]]; then + echo "Erreur : Action non valide." >&2 + exit 1 +fi + +# 2. Validation du serveur (Contre les injections d'arguments ou de flags) +IN_LIST=false +for s in "${SERVEURS_AUTORISES[@]}"; do + if [[ "$s" == "$SERVEUR" ]]; then + IN_LIST=true + break + fi +done + +if [ "$IN_LIST" = false ]; then + echo "Erreur : Serveur non autorisĂ©." >&2 + exit 1 +fi + +# 3. ExĂ©cution propre avec switch d'utilisateur +case "$ACTION" in + restart) + sudo -u $USER_MINECRAFT $PM2_PATH restart "$SERVEUR" + ;; + status) + sudo -u $USER_MINECRAFT $PM2_PATH describe "$SERVEUR" + ;; +esac ``` -🔮 Serveur — SurchargĂ© -📊 Ressources -CPU ████████░░ 82% đŸŒĄïž 74°C -RAM █████████░ 91% (14.6/16.0 GB) -SWAP ████░░░░░░ 43% +> ⚙ *Note SystĂšme : L'utilisateur Linux du bot (`gameurbot`) possĂ©dera la rĂšgle `gameurbot ALL=(ALL) NOPASSWD: /usr/local/bin/manage_minecraft.sh *` dans le fichier `/etc/sudoers`.* -📈 Charge (1m / 5m / 15m) : 7.42 / 6.80 / 5.12 +--- -🎼 Services actifs -▾ ⛏ Minecraft đŸ”„ — CPU 45% | RAM 4.2 GB -▾ đŸ€– Ollama (IA) đŸ”„ — CPU 38% | RAM 8.1 GB -▾ 🏭 Satisfactory ⚡ — CPU 12% | RAM 2.1 GB +## 4. Interface Discord & Commandes attendues -🔍 Pourquoi ça rame ? -‱ CPU Ă  82% — principal consommateur : Minecraft (45%) -‱ RAM Ă  91% (14.6/16.0 GB) — Ollama (IA) occupe 8.1 GB -‱ 💡 Conflit probable : Ollama (IA) et Minecraft, Satisfactory se partagent les ressources +Tu dois implĂ©menter ces 3 commandes d'interaction (en utilisant exclusivement des listes de choix `choices`, **aucune saisie de texte libre** pour les arguments) : -⏱ Retour Ă  la normale -⏱ Retour Ă  la normale dans ~8 min +1. `/setup` *(Admin seulement)* : Initialise le salon actuel. Le bot y envoie un Embed et l'**Ă©pingle**. C'est cet embed prĂ©cis qui sera Ă©ditĂ© dynamiquement toutes les 15-20 secondes avec le rapport d'Ă©tat de l'infrastructure (graphiques en barres ASCII textuelles, charge systĂšme, alertes de goulot d'Ă©tranglement). +2. `/status` *(Tous)* : Affiche le statut complet sous forme de message Ă©phĂ©mĂšre (invisible pour les autres joueurs). +3. `/minecraft action [choices: restart, status] serveur [choices: survie, skyblock, creatif]` : + - ExĂ©cute le script systĂšme via un appel `subprocess.run(..., shell=False)`. + - Utilise impĂ©rativement `inter.response.defer()` dĂšs le dĂ©but de la commande pour Ă©viter les dĂ©connexions/timeouts de 3 secondes de Discord pendant les redĂ©marrages d'instances Java. -DerniĂšre mise Ă  jour 26/02/2026 21:34 -``` +### 📜 TraçabilitĂ© (Logs d'Audit) +DĂšs qu'un utilisateur clique sur une commande `/minecraft action`, le bot doit instantanĂ©ment envoyer un rapport dĂ©taillĂ© dans notre salon privĂ© de logs administrateur : `[Audit] Qui a cliquĂ© / Quelle heure / Quel serveur / Statut final de la commande`.