5.4 KiB
🛠️ 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_SECRETpartagé. - Filtrage des processus : L'agent utilise
psutilpour calculer la charge des services selon cette table de mots-clés :
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 code401. - StatusEngine : Analyse la charge selon les seuils suivants :
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) :
#!/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èglegameurbot 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) :
/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)./status(Tous) : Affiche le statut complet sous forme de message éphémère (invisible pour les autres joueurs)./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.
- Exécute le script système via un appel
📜 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.