Gameurbot/README.md

119 lines
5.4 KiB
Markdown

# 🛠️ 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`.