Migration vers pré-prod : refonte Docker et documentation

- Dockerfile modernisé avec venv Python et locales françaises
  - Configuration docker-compose simplifiée
  - README complètement réécrit pour l'architecture multi-plateformes
  - Suppression bot.py et statuts.txt (remplacés par modules webapp/discordbot)
  - Migration vers interface d'administration web
This commit is contained in:
skylanix
2025-08-12 01:33:04 +02:00
parent a96e3ebc63
commit 86e8e46959
7 changed files with 159 additions and 280 deletions

View File

@@ -1,8 +1,3 @@
# Configuration Discord Bot
TOKEN=votre_token_discord
STATUS=online
INTERVAL=3600
# Configuration Zabbix (optionnel)
ENABLE_ZABBIX=false
ZABBIX_SERVER=zabbix-server.example.com

View File

@@ -3,9 +3,12 @@ FROM debian:trixie-slim
WORKDIR /app
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG=fr_FR.UTF-8
ENV LC_ALL=fr_FR.UTF-8
RUN apt-get update && apt-get install -y --no-install-recommends \
apt-utils \
locales \
python3 \
python3-pip \
python3-venv \
@@ -14,16 +17,21 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
&& dpkg -i zabbix-release_latest_7.4+debian12_all.deb \
&& apt-get update \
&& apt-get install -y --no-install-recommends zabbix-agent2 \
&& sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen \
&& locale-gen \
&& rm -rf /var/lib/apt/lists/* \
&& rm zabbix-release_latest_7.4+debian12_all.deb
COPY requirements.txt .
COPY bot.py .
COPY statuts.txt .
COPY run-web.py .
COPY ./webapp ./webapp
COPY ./discordbot ./discordbot
COPY ./database ./database
COPY zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf
COPY start.sh /start.sh
RUN pip3 install --no-cache-dir --break-system-packages --root-user-action=ignore -r requirements.txt && \
RUN python3 -m venv /app/venv && \
/app/venv/bin/pip install --no-cache-dir -r requirements.txt && \
chmod +x /start.sh
CMD ["/start.sh"]

271
README.md
View File

@@ -1,175 +1,188 @@
# MamieHenriette 👵
# 👵 Mamie Henriette - Discord Status Bot 🤖
**Bot multi-plateformes pour Discord, Twitch et YouTube Live**
## 📖 Description
Mamie Henriette est un bot Discord intelligent qui change automatiquement de statut, surveillant et gérant votre serveur avec une touche d'humour et de caractère.
## Vue d'ensemble
## ✨ Fonctionnalités
Mamie Henriette est un bot intelligent open-source développé spécifiquement pour les communautés de [STEvE](https://www.youtube.com/@STEvE_YT) sur YouTube, [Twitch](https://www.twitch.tv/steve_yt) et Discord.
- Changement cyclique automatique des statuts
- Configuration flexible via variables d'environnement
- Gestion des erreurs et logging
- Support multi-statuts Discord
- Déploiement simplifié avec Docker
- 📊 Surveillance optionnelle avec Zabbix
> ⚠️ **Statut** : En cours de développement
## 🛠 Prérequis
### Caractéristiques principales
- Interface web d'administration complète
- Gestion multi-plateformes (Discord, Twitch, YouTube Live)
- Système de notifications automatiques
- Base de données intégrée pour la persistance
- Surveillance optionnelle avec Zabbix *(non testée)*
## Fonctionnalités
### Discord
- **Statuts dynamiques** : Rotation automatique des humeurs (10 min)
- **Notifications Humble Bundle** : Surveillance et alertes automatiques (30 min)
- **Commandes personnalisées** : Gestion via interface web
- **Modération** : Outils intégrés
### Twitch *(en développement)*
- **Chat bot** : Commandes et interactions
- **Événements live** : Notifications de stream
### YouTube Live *(en développement)*
- **Chat bot** : Modération et commandes
- **Événements** : Notifications de diffusion
### Interface d'administration
- **Dashboard** : Vue d'ensemble et statistiques
- **Configuration** : Tokens, paramètres des plateformes
- **Gestion des humeurs** : Création et modification des statuts
- **Commandes** : Édition des commandes personnalisées
- **Modération** : Outils de gestion communautaire
### Surveillance
- **Zabbix Agent 2** : Monitoring avancé *(non testé)*
- **Métriques** : Santé du bot et uptime
## Installation
### Prérequis
- Docker et Docker Compose
- Compte Discord et Token du bot
- (Optionnel) Serveur Zabbix pour la surveillance
- Token Discord pour le bot
## 📦 Installation
### Démarrage rapide
1. Clonez le dépôt
```bash
git clone https://git.favrep.ch/lapatatedouce/MamieHenrriette
cd MamieHenrriette
# 1. Cloner le projet
git clone https://github.com/skylanix/MamieHenrietteCredential
```
2. Copiez le fichier de configuration
```bash
cp .env.example .env
cd MamieHenriette
```
3. Éditez le fichier `.env` avec vos paramètres
```bash
nano .env
# 2. Lancer avec Docker
docker compose up --build -d
```
4. Démarrez le conteneur Docker
### Configuration
1. **Interface web** : Accédez à http://localhost
2. **Token Discord** : Section "Configurations"
3. **Humeurs** : Définir les statuts du bot
4. **Canaux** : Configurer les notifications
> ⚠️ **Important** : Après avoir configuré le token Discord, les humeurs et autres fonctionnalités via l'interface web, **redémarrez le conteneur** pour que les changements soient pris en compte :
> ```bash
> docker compose restart mamiehenriette
> ```
### Commandes Docker utiles
**Mode développement (avec logs):**
```bash
docker-compose up --build
# Logs en temps réel
docker compose logs -f mamiehenriette
```
**Mode production (en arrière-plan):**
```bash
docker-compose up --build -d
# Logs d'un conteneur en cours d'exécution
docker logs -f mamiehenriette
```
**Voir les logs:**
```bash
docker-compose logs -f discord-bot
# Redémarrer
docker compose restart mamiehenriette
```
**Arrêter le conteneur:**
```bash
docker-compose down
# Arrêter
docker compose down
```
## 🔧 Configuration
## Configuration avancée
### Variables d'environnement principales
### Variables d'environnement
- `TOKEN`: Votre token Discord (obligatoire)
- `STATUS`: Statut initial (défaut: online)
- `INTERVAL`: Intervalle de changement de statut (défaut: 3600 secondes)
```yaml
environment:
- ENABLE_ZABBIX=false # Surveillance (non testée)
- ZABBIX_SERVER=localhost
- ZABBIX_HOSTNAME=MamieHenriette
```
### 📊 Configuration Zabbix (optionnelle)
### Interface d'administration
- `ENABLE_ZABBIX`: Activer la surveillance Zabbix (défaut: false)
- `ZABBIX_SERVER`: Adresse du serveur Zabbix
- `ZABBIX_HOSTNAME`: Nom d'hôte pour identifier le bot
- `ZABBIX_PORT`: Port d'exposition Zabbix (défaut: 10050)
| Section | Fonction |
|---------|----------|
| **Configurations** | Tokens et paramètres généraux |
| **Humeurs** | Gestion des statuts Discord |
| **Commandes** | Commandes personnalisées |
| **Modération** | Outils de gestion |
#### Métriques surveillées par Zabbix
## Architecture du projet
- Statut du bot Discord
- Temps de fonctionnement (uptime)
- Utilisation mémoire
- Erreurs et avertissements dans les logs
- Connectivité à Discord
### Structure des modules
#### Activation de Zabbix
```
├── database/ # Couche données
│ ├── models.py # Modèles ORM
│ ├── helpers.py # Utilitaires BDD
│ └── schema.sql # Structure initiale
├── discordbot/ # Module Discord
│ └── __init__.py # Bot et handlers
└── webapp/ # Interface d'administration
├── static/ # Assets statiques
├── templates/ # Vues HTML
└── *.py # Contrôleurs par section
```
Dans votre fichier `.env` :
### Composants principaux
| Fichier | Rôle |
|---------|------|
| `run-web.py` | Point d'entrée principal |
| `start.sh` | Script de démarrage Docker |
| `docker-compose.yml` | Configuration des services |
| `requirements.txt` | Dépendances Python |
## Spécifications techniques
### Base de données (SQLite)
- **Configuration** : Paramètres et tokens
- **Humeur** : Statuts Discord rotatifs
- **Message** : Messages périodiques *(planifié)*
- **GameBundle** : Historique Humble Bundle
### Architecture multi-thread
- **Thread 1** : Interface web Flask (port 5000)
- **Thread 2** : Bot Discord et tâches automatisées
### Dépendances principales
```
discord.py # API Discord
flask # Interface web
requests # Client HTTP
waitress # Serveur WSGI
```
## Développement
### Installation locale
```bash
ENABLE_ZABBIX=true
ZABBIX_SERVER=votre-serveur-zabbix.com
ZABBIX_HOSTNAME=MamieHenriette
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python run-web.py
```
### Fichier `statuts.txt`
Créez un fichier `statuts.txt` avec vos statuts, un par ligne.
Exemple :
```
Surveiller le serveur
Mamie est là !
En mode supervision
```
## 📋 Dépendances
- discord.py==2.3.2
- python-dotenv==1.0.0
### Contribution
1. Fork du projet
2. Branche feature
3. Pull Request
---
# 🖥️ Installation environnement de développement
## Installation des dépendances système
```bash
sudo apt install python3 python3-pip
```
## Création de l'environnement Python local
Dans le dossier du projet :
```bash
python3 -m venv .venv
```
Puis activer l'environnement :
```bash
source .venv/bin/activate
```
## Installation des dépendances Python
```bash
pip install -r requirements.txt
```
## Exécution
```bash
python3 run-web.py
```
# Structure du projet
```
.
|-- database : module de connexion à la BDD
| |-- __init.py__
| |-- models.py : contient les pojo représentant chaque table
| |-- schema.sql : contient un scrip sql d'initialisation de la bdd, celui-ci doit être réentrant
|
|-- discordbot : module de connexion à discord
| |-- __init.py__
|
|-- webapp : module du site web d'administration
| |-- static : Ressource fixe directement accessible par le navigateir
| | |-- css
| | |-- ...
| |
| |-- template : Fichier html
| | |-- template.html : structure globale du site
| | |-- commandes.html : page de gestion des commandes
| | |-- ...
| |
| |-- __init.py__
| |-- index.py : controller de la page d'acceuil
| |-- commandes.py : controller de gestion des commandes
| |-- ...
|
|-- run-web.py : launcher
```
*Mamie Henriette vous surveille ! 👵👀*

114
bot.py
View File

@@ -1,114 +0,0 @@
import discord
import json
import random
import asyncio
import logging
import os
class DiscordStatusBot:
def __init__(self):
# Configuration des logs
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
# Charger la configuration à partir des variables d'environnement
self.config = self.charger_configuration()
if not self.config:
logging.error("Impossible de charger la configuration")
exit(1)
# Configuration des intents
intents = discord.Intents.default()
intents.message_content = False
# Création du client
self.client = discord.Client(intents=intents)
# Événements
self.setup_events()
def charger_configuration(self):
"""Chargement de la configuration à partir des variables d'environnement"""
config = {
'token': os.getenv('TOKEN'),
'status': os.getenv('STATUS', 'online'),
'interval': int(os.getenv('INTERVAL', 60))
}
if not config['token']:
logging.error("Token non fourni")
return None
return config
def charger_statuts(self):
"""Chargement des statuts depuis le fichier"""
try:
with open('/app/statuts.txt', 'r', encoding='utf-8') as fichier:
return [ligne.strip() for ligne in fichier.readlines() if ligne.strip()]
except FileNotFoundError:
logging.error("Fichier de statuts non trouvé")
return []
def setup_events(self):
"""Configuration des événements du bot"""
@self.client.event
async def on_ready():
logging.info(f'Bot connecté : {self.client.user}')
self.client.loop.create_task(self.changer_statut())
# Déplacez changer_statut à l'extérieur de setup_events
async def changer_statut(self):
"""Changement cyclique du statut"""
await self.client.wait_until_ready()
statuts = self.charger_statuts()
if not statuts:
logging.warning("Aucun statut disponible")
return
# Mapping des status Discord
status_mapping = {
'online': discord.Status.online,
'idle': discord.Status.idle,
'dnd': discord.Status.dnd,
'invisible': discord.Status.invisible
}
# Récupérer le status depuis la configuration
status_discord = status_mapping.get(self.config.get('status', 'online'), discord.Status.online)
while not self.client.is_closed():
try:
# Sélection du statut
statut = random.choice(statuts)
# Changement de statut avec custom activity
await self.client.change_presence(
status=status_discord,
activity=discord.CustomActivity(name=statut)
)
logging.info(f"Statut changé : {statut}")
# Délai entre les changements
await asyncio.sleep(self.config.get('interval', 60))
except Exception as e:
logging.error(f"Erreur lors du changement de statut : {e}")
await asyncio.sleep(30) # Attente en cas d'erreur
def executer(self):
"""Lancement du bot"""
try:
if self.config and 'token' in self.config:
self.client.run(self.config['token'])
else:
logging.error("Token non trouvé dans la configuration")
except discord.LoginFailure:
logging.error("Échec de connexion - Vérifiez votre token")
except Exception as e:
logging.error(f"Erreur lors du lancement : {e}")
def main():
bot = DiscordStatusBot()
bot.executer()
if __name__ == "__main__":
main()

View File

@@ -1,16 +1,15 @@
services:
discord-bot:
mamiehenriette:
container_name: MamieHenriette
build: .
restart: on-failure
environment:
- TOKEN=VOTRE_TOKEN_DISCORD_ICI
- STATUS=online
- INTERVAL=3600
- ENABLE_ZABBIX=false
- ZABBIX_SERVER=zabbix-server.example.com
- ZABBIX_HOSTNAME=mamie-henriette-bot
volumes:
- ./statuts.txt:/app/statuts.txt
# ports:
- ./instance:/app/instance
ports:
- 80:5000
# - "10050:10050" # Décommentez si ENABLE_ZABBIX=true

View File

@@ -18,4 +18,4 @@ else
fi
echo "Démarrage du bot Discord..."
exec python3 bot.py
exec /app/venv/bin/python run-web.py

View File

@@ -1,22 +0,0 @@
STEvE galère un peu, mais moi je gère le bazar.
Sans mamie, vous seriez bien vite paumés.
Ici, cest mamie qui veille, alors écoutez un peu.
STEvE dort, moi je fais tourner la baraque.
Jaime râler, mais cest pour vous réveiller un peu.
Restez sages, sinon mamie va grogner un peu.
Les malins, faites-moi plaisir, écoutez mamie.
Jamais le bazar ne sinstalle, je veille au grain.
Cest moi qui tiens la maison.
Vous aimez STEvE ? Moi, je vous tolère.
Gardez votre calme, mamie veille sur vous.
Quand STEvE foire, je suis là pour arranger ça.
Suivez STEvE, mais surtout ne perdez pas mamie de vue.
STEvE rêve, moi je travaille en coulisses.
Ecoutez mamie, cest pour votre bien.
Pas dembrouille, ou mamie va devoir intervenir.
STEvE dort, mais mamie veille toujours.
Vous râlez ? Moi aussi, mais on fait avec.
STEvE prend son temps, moi je veille au grain.
Pas de bazar, mamie préfère le calme.
STEvE est parfois perdu, mais mamie est là.
Le serveur est calme, grâce à mamie.