diff --git a/README.md b/README.md index 3ba4bd2..3efa09d 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,153 @@ -# đŸ› ïž Mission : Dev GameurBot v2 -## Centralisation du Monitoring et de la Gestion PM2 SĂ©curisĂ©e +# đŸ–„ïž Discord Status Bot -**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. +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. --- -## 📐 Architecture GĂ©nĂ©rale +## Architecture ``` -[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) +[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 ... ``` --- -## 1. L'Agent de TĂ©lĂ©mĂ©trie (`agent.py`) +## Installation -À 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. +### 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` : -- **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"], } ``` --- -## 2. Le Bot & Serveur d'Écoute (`bot.py`) +## Lancement -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. +### 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` : -- **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}, @@ -49,71 +155,38 @@ THRESHOLDS = { "swap": {"warning": 40, "critical": 70}, } ``` -*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").* + +### FrĂ©quence de mise Ă  jour + +- **Agent** → `PUSH_INTERVAL` dans `agent.py` (dĂ©faut : 15s) +- **Bot** → `@tasks.loop(seconds=20)` dans `bot.py` --- -## 3. La Passerelle de Gestion PM2 (SĂ©curitĂ© Maximale) +## Exemple de rendu -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Ă© -> ⚙ *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`.* +📊 Ressources +CPU ████████░░ 82% đŸŒĄïž 74°C +RAM █████████░ 91% (14.6/16.0 GB) +SWAP ████░░░░░░ 43% ---- +📈 Charge (1m / 5m / 15m) : 7.42 / 6.80 / 5.12 -## 4. Interface Discord & Commandes attendues +🎼 Services actifs +▾ ⛏ Minecraft đŸ”„ — CPU 45% | RAM 4.2 GB +▾ đŸ€– Ollama (IA) đŸ”„ — CPU 38% | RAM 8.1 GB +▾ 🏭 Satisfactory ⚡ — CPU 12% | RAM 2.1 GB -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) : +🔍 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 -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. +⏱ Retour Ă  la normale +⏱ Retour Ă  la normale dans ~8 min -### 📜 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`. +DerniĂšre mise Ă  jour 26/02/2026 21:34 +``` diff --git a/config.json b/config.json new file mode 100644 index 0000000..c165945 --- /dev/null +++ b/config.json @@ -0,0 +1,17 @@ +{ + "_comment": "Copier ce fichier en config.json et remplir les valeurs", + "discord_token": "MTA3NDcxNDMwODY2MDk2NTM5OA.Gj_JQf.V-Xd4DRW0cEOG6PYOBlnWAXFU5MPWlZWeHmgsk", + "api_secret": "Mon-cul-est-tres-doux", + "api_port": 8765, + "guilds": { + "_comment": "Sera rempli automatiquement par la commande /setup dans chaque serveur Discord", + "_example": { + "channel_id": 123456789012345678, + "message_id": null + }, + "1110604692263796746": { + "channel_id": 1227583375704064050, + "message_id": 1476543621137170625 + } + } +} \ No newline at end of file