# đŸ› ïž Mission : Dev GameurBot v2 ## Centralisation du Monitoring et de la Gestion PM2 SĂ©curisĂ©e **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 GĂ©nĂ©rale ``` [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) ``` --- ## 1. L'Agent de TĂ©lĂ©mĂ©trie (`agent.py`) À 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"], } ``` --- ## 2. Le Bot & Serveur d'Écoute (`bot.py`) 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}, "ram": {"warning": 80, "critical": 90}, "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").* --- ## 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 ``` > ⚙ *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`.* --- ## 4. Interface Discord & Commandes attendues 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) : 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. ### 📜 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`.