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) # Configuration Zabbix (optionnel)
ENABLE_ZABBIX=false ENABLE_ZABBIX=false
ZABBIX_SERVER=zabbix-server.example.com ZABBIX_SERVER=zabbix-server.example.com

View File

@@ -3,9 +3,12 @@ FROM debian:trixie-slim
WORKDIR /app WORKDIR /app
ENV DEBIAN_FRONTEND=noninteractive 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 \ RUN apt-get update && apt-get install -y --no-install-recommends \
apt-utils \ apt-utils \
locales \
python3 \ python3 \
python3-pip \ python3-pip \
python3-venv \ 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 \ && dpkg -i zabbix-release_latest_7.4+debian12_all.deb \
&& apt-get update \ && apt-get update \
&& apt-get install -y --no-install-recommends zabbix-agent2 \ && 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 -rf /var/lib/apt/lists/* \
&& rm zabbix-release_latest_7.4+debian12_all.deb && rm zabbix-release_latest_7.4+debian12_all.deb
COPY requirements.txt . COPY requirements.txt .
COPY bot.py . COPY run-web.py .
COPY statuts.txt . COPY ./webapp ./webapp
COPY ./discordbot ./discordbot
COPY ./database ./database
COPY zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf COPY zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf
COPY start.sh /start.sh 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 chmod +x /start.sh
CMD ["/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 > ⚠️ **Statut** : En cours de développement
- Configuration flexible via variables d'environnement
- Gestion des erreurs et logging
- Support multi-statuts Discord
- Déploiement simplifié avec Docker
- 📊 Surveillance optionnelle avec Zabbix
## 🛠 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 - Docker et Docker Compose
- Compte Discord et Token du bot - Token Discord pour le bot
- (Optionnel) Serveur Zabbix pour la surveillance
## 📦 Installation ### Démarrage rapide
1. Clonez le dépôt
```bash ```bash
git clone https://git.favrep.ch/lapatatedouce/MamieHenrriette # 1. Cloner le projet
cd MamieHenrriette git clone https://github.com/skylanix/MamieHenrietteCredential
``` ```
2. Copiez le fichier de configuration
```bash ```bash
cp .env.example .env cd MamieHenriette
``` ```
3. Éditez le fichier `.env` avec vos paramètres
```bash ```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 ```bash
docker-compose up --build # Logs en temps réel
docker compose logs -f mamiehenriette
``` ```
**Mode production (en arrière-plan):**
```bash ```bash
docker-compose up --build -d # Logs d'un conteneur en cours d'exécution
docker logs -f mamiehenriette
``` ```
**Voir les logs:**
```bash ```bash
docker-compose logs -f discord-bot # Redémarrer
docker compose restart mamiehenriette
``` ```
**Arrêter le conteneur:**
```bash ```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) ```yaml
- `STATUS`: Statut initial (défaut: online) environment:
- `INTERVAL`: Intervalle de changement de statut (défaut: 3600 secondes) - 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) | Section | Fonction |
- `ZABBIX_SERVER`: Adresse du serveur Zabbix |---------|----------|
- `ZABBIX_HOSTNAME`: Nom d'hôte pour identifier le bot | **Configurations** | Tokens et paramètres généraux |
- `ZABBIX_PORT`: Port d'exposition Zabbix (défaut: 10050) | **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 ### Structure des modules
- Temps de fonctionnement (uptime)
- Utilisation mémoire
- Erreurs et avertissements dans les logs
- Connectivité à Discord
#### 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 ```bash
ENABLE_ZABBIX=true python3 -m venv venv
ZABBIX_SERVER=votre-serveur-zabbix.com source venv/bin/activate
ZABBIX_HOSTNAME=MamieHenriette pip install -r requirements.txt
python run-web.py
``` ```
### Fichier `statuts.txt` ### Contribution
1. Fork du projet
Créez un fichier `statuts.txt` avec vos statuts, un par ligne. 2. Branche feature
3. Pull Request
Exemple :
```
Surveiller le serveur
Mamie est là !
En mode supervision
```
## 📋 Dépendances
- discord.py==2.3.2
- python-dotenv==1.0.0
--- ---
# 🖥️ Installation environnement de développement *Mamie Henriette vous surveille ! 👵👀*
## 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
```

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: services:
discord-bot: mamiehenriette:
container_name: MamieHenriette container_name: MamieHenriette
build: . build: .
restart: on-failure restart: on-failure
environment: environment:
- TOKEN=VOTRE_TOKEN_DISCORD_ICI
- STATUS=online
- INTERVAL=3600
- ENABLE_ZABBIX=false - ENABLE_ZABBIX=false
- ZABBIX_SERVER=zabbix-server.example.com - ZABBIX_SERVER=zabbix-server.example.com
- ZABBIX_HOSTNAME=mamie-henriette-bot - ZABBIX_HOSTNAME=mamie-henriette-bot
volumes: volumes:
- ./statuts.txt:/app/statuts.txt - ./instance:/app/instance
# ports:
ports:
- 80:5000
# - "10050:10050" # Décommentez si ENABLE_ZABBIX=true # - "10050:10050" # Décommentez si ENABLE_ZABBIX=true

View File

@@ -18,4 +18,4 @@ else
fi fi
echo "Démarrage du bot Discord..." 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.