mirror of
https://github.com/skylanix/MamieHenriette.git
synced 2026-02-06 06:40:35 +01:00
27
Dockerfile
27
Dockerfile
@@ -7,21 +7,19 @@ ENV LANG=fr_FR.UTF-8
|
|||||||
ENV LC_ALL=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 \
|
locales \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
python3-venv \
|
python3-venv \
|
||||||
wget \
|
procps \
|
||||||
&& wget https://repo.zabbix.com/zabbix/7.4/release/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.4+debian12_all.deb \
|
apache2-utils \
|
||||||
&& dpkg -i zabbix-release_latest_7.4+debian12_all.deb \
|
bash
|
||||||
&& apt-get update \
|
|
||||||
&& apt-get install -y --no-install-recommends zabbix-agent2 \
|
RUN sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen; \
|
||||||
&& sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen \
|
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
|
|
||||||
COPY requirements.txt .
|
COPY requirements.txt .
|
||||||
COPY run-web.py .
|
COPY run-web.py .
|
||||||
COPY ./database ./database
|
COPY ./database ./database
|
||||||
@@ -29,11 +27,14 @@ COPY ./discordbot ./discordbot
|
|||||||
COPY ./protondb ./protondb
|
COPY ./protondb ./protondb
|
||||||
COPY ./webapp ./webapp
|
COPY ./webapp ./webapp
|
||||||
COPY ./twitchbot ./twitchbot
|
COPY ./twitchbot ./twitchbot
|
||||||
COPY zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf
|
|
||||||
COPY start.sh /start.sh
|
COPY start.sh /start.sh
|
||||||
|
|
||||||
RUN python3 -m venv /app/venv && \
|
RUN python3 -m venv /app/venv && \
|
||||||
/app/venv/bin/pip install --no-cache-dir -r requirements.txt && \
|
/app/venv/bin/pip install --no-cache-dir -r requirements.txt && \
|
||||||
chmod +x /start.sh
|
chmod +x /start.sh && \
|
||||||
|
mkdir -p /app/logs
|
||||||
|
|
||||||
CMD ["/start.sh"]
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||||
|
CMD pgrep python > /dev/null && ! (tail -n 1000 $(ls -t /app/logs/*.log 2>/dev/null | head -1) 2>/dev/null | grep -iE "(ERROR|CRITICAL|Exception|sqlite3\.OperationalError)")
|
||||||
|
|
||||||
|
CMD ["/start.sh"]
|
||||||
|
|||||||
83
README.md
83
README.md
@@ -10,11 +10,11 @@
|
|||||||
- [Twitch](#twitch)
|
- [Twitch](#twitch)
|
||||||
- [YouTube Live](#youtube-live-en-développement)
|
- [YouTube Live](#youtube-live-en-développement)
|
||||||
- [Interface d'administration](#interface-dadministration)
|
- [Interface d'administration](#interface-dadministration)
|
||||||
- [Surveillance](#surveillance)
|
|
||||||
- [Installation](#installation)
|
- [Installation](#installation)
|
||||||
- [Prérequis](#prérequis)
|
- [Prérequis](#prérequis)
|
||||||
- [Création du bot Discord](#création-du-bot-discord)
|
- [Création du bot Discord](#création-du-bot-discord)
|
||||||
- [Démarrage rapide](#démarrage-rapide)
|
- [Démarrage rapide](#démarrage-rapide)
|
||||||
|
- [Volumes persistants](#volumes-persistants)
|
||||||
- [Commandes Docker utiles](#commandes-docker-utiles)
|
- [Commandes Docker utiles](#commandes-docker-utiles)
|
||||||
- [Mise à jour](#mise-à-jour)
|
- [Mise à jour](#mise-à-jour)
|
||||||
- [Architecture du projet](#architecture-du-projet)
|
- [Architecture du projet](#architecture-du-projet)
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
- [Spécifications techniques](#spécifications-techniques)
|
- [Spécifications techniques](#spécifications-techniques)
|
||||||
- [Base de données (SQLite)](#base-de-données-sqlite)
|
- [Base de données (SQLite)](#base-de-données-sqlite)
|
||||||
- [Architecture multi-thread](#architecture-multi-thread)
|
- [Architecture multi-thread](#architecture-multi-thread)
|
||||||
|
- [Monitoring et logging](#monitoring-et-logging)
|
||||||
- [Dépendances principales](#dépendances-principales)
|
- [Dépendances principales](#dépendances-principales)
|
||||||
- [Développement](#développement)
|
- [Développement](#développement)
|
||||||
- [Installation locale](#installation-locale)
|
- [Installation locale](#installation-locale)
|
||||||
@@ -42,7 +43,6 @@ Mamie Henriette est un bot intelligent open-source développé spécifiquement p
|
|||||||
- Gestion multi-plateformes (Discord opérationnel, Twitch intégré, YouTube Live en développement)
|
- Gestion multi-plateformes (Discord opérationnel, Twitch intégré, YouTube Live en développement)
|
||||||
- Système de notifications automatiques
|
- Système de notifications automatiques
|
||||||
- Base de données intégrée pour la persistance
|
- Base de données intégrée pour la persistance
|
||||||
- Surveillance optionnelle avec Zabbix *(non testée)*
|
|
||||||
|
|
||||||
## Fonctionnalités
|
## Fonctionnalités
|
||||||
|
|
||||||
@@ -55,6 +55,11 @@ Mamie Henriette est un bot intelligent open-source développé spécifiquement p
|
|||||||
|
|
||||||
### Twitch
|
### Twitch
|
||||||
- **Chat bot** : Commandes et interactions automatiques
|
- **Chat bot** : Commandes et interactions automatiques
|
||||||
|
- **Alertes Live** : Surveillance automatique des streamers (vérification toutes les 5 minutes)
|
||||||
|
- Support jusqu'à 100 chaînes simultanément
|
||||||
|
- Notifications Discord avec aperçu du stream
|
||||||
|
- Gestion via interface d'administration
|
||||||
|
- Détection automatique des débuts/fins de stream
|
||||||
|
|
||||||
### YouTube Live *(en développement)*
|
### YouTube Live *(en développement)*
|
||||||
- **Chat bot** : Modération et commandes
|
- **Chat bot** : Modération et commandes
|
||||||
@@ -67,9 +72,6 @@ Mamie Henriette est un bot intelligent open-source développé spécifiquement p
|
|||||||
- **Commandes** : Édition des commandes personnalisées
|
- **Commandes** : Édition des commandes personnalisées
|
||||||
- **Modération** : Outils de gestion communautaire
|
- **Modération** : Outils de gestion communautaire
|
||||||
|
|
||||||
### Surveillance
|
|
||||||
- **Zabbix Agent 2** : Monitoring avancé *(non testé)*
|
|
||||||
- **Métriques** : Santé du bot et uptime
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -129,12 +131,11 @@ docker compose up --build -d
|
|||||||
> docker compose restart MamieHenriette
|
> docker compose restart MamieHenriette
|
||||||
> ```
|
> ```
|
||||||
|
|
||||||
### Commandes Docker utiles
|
### Volumes persistants
|
||||||
|
- `./instance/` : Base de données SQLite et configuration
|
||||||
|
- `./logs/` : Logs applicatifs rotatifs (50MB max par fichier)
|
||||||
|
|
||||||
```bash
|
### Commandes Docker utiles
|
||||||
# Logs en temps réel
|
|
||||||
docker compose logs -f MamieHenriette
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Logs d'un conteneur en cours d'exécution
|
# Logs d'un conteneur en cours d'exécution
|
||||||
@@ -190,9 +191,10 @@ python run-web.py
|
|||||||
| Section | Fonction |
|
| Section | Fonction |
|
||||||
|---------|----------|
|
|---------|----------|
|
||||||
| **Configurations** | Tokens Discord/Twitch, paramètres généraux et configuration ProtonDB |
|
| **Configurations** | Tokens Discord/Twitch, paramètres généraux et configuration ProtonDB |
|
||||||
| **Humeurs** | Gestion des statuts Discord |
|
| **Humeurs** | Gestion des statuts Discord rotatifs |
|
||||||
| **Commandes** | Commandes personnalisées multi-plateformes |
|
| **Commandes** | Commandes personnalisées multi-plateformes (Discord/Twitch) |
|
||||||
| **Messages** | Messages automatiques et notifications |
|
| **Alertes Live** | Configuration surveillance streamers Twitch avec notifications Discord |
|
||||||
|
| **Messages** | Messages automatiques et notifications périodiques |
|
||||||
| **Modération** | Outils de gestion communautaire |
|
| **Modération** | Outils de gestion communautaire |
|
||||||
|
|
||||||
### Structure des modules
|
### Structure des modules
|
||||||
@@ -204,18 +206,22 @@ python run-web.py
|
|||||||
│ └── schema.sql # Structure initiale
|
│ └── schema.sql # Structure initiale
|
||||||
│
|
│
|
||||||
├── discordbot/ # Module Discord
|
├── discordbot/ # Module Discord
|
||||||
│ └── __init__.py # Bot et handlers
|
│ ├── __init__.py # Bot et handlers principaux
|
||||||
|
│ └── humblebundle.py # Surveillance Humble Bundle
|
||||||
│
|
│
|
||||||
├── twitchbot/ # Module Twitch
|
├── twitchbot/ # Module Twitch
|
||||||
│ └── __init__.py # Bot Twitch et handlers
|
│ ├── __init__.py # Bot Twitch et handlers
|
||||||
|
│ └── live_alert.py # Surveillance des streams live
|
||||||
│
|
│
|
||||||
├── protondb/ # Module ProtonDB
|
├── protondb/ # Module ProtonDB
|
||||||
│ └── __init__.py # API Algolia et recherche compatibilité
|
│ └── __init__.py # API Algolia et recherche compatibilité
|
||||||
│
|
│
|
||||||
└── webapp/ # Interface d'administration
|
└── webapp/ # Interface d'administration
|
||||||
├── static/ # Assets statiques
|
├── static/ # Assets statiques (CSS, JS, images)
|
||||||
├── templates/ # Vues HTML
|
├── templates/ # Vues HTML Jinja2
|
||||||
└── *.py # Contrôleurs par section
|
├── live_alert.py # Gestion des alertes Twitch
|
||||||
|
├── twitch_auth.py # Authentification Twitch OAuth
|
||||||
|
└── *.py # Autres contrôleurs par section
|
||||||
```
|
```
|
||||||
|
|
||||||
### Composants principaux
|
### Composants principaux
|
||||||
@@ -230,28 +236,37 @@ python run-web.py
|
|||||||
## Spécifications techniques
|
## Spécifications techniques
|
||||||
|
|
||||||
### Base de données (SQLite)
|
### Base de données (SQLite)
|
||||||
- **Configuration** : Paramètres et tokens
|
- **Configuration** : Paramètres et tokens des plateformes
|
||||||
- **Humeur** : Statuts Discord rotatifs
|
- **Humeur** : Statuts Discord rotatifs avec gestion automatique
|
||||||
- **Commande** : Commandes personnalisées Discord/Twitch
|
- **Commande** : Commandes personnalisées multi-plateformes (Discord/Twitch)
|
||||||
|
- **LiveAlert** : Configuration surveillance streamers Twitch (nom, canal Discord, statut)
|
||||||
- **GameAlias** : Alias pour améliorer les recherches ProtonDB
|
- **GameAlias** : Alias pour améliorer les recherches ProtonDB
|
||||||
- **GameBundle** : Historique Humble Bundle
|
- **GameBundle** : Historique et notifications Humble Bundle
|
||||||
- **Message** : Messages périodiques *(structure définie, non implémenté)*
|
- **Message** : Messages automatiques périodiques (implémenté)
|
||||||
|
|
||||||
### Architecture multi-thread
|
### Architecture multi-thread
|
||||||
- **Thread 1** : Interface web Flask (port 5000)
|
- **Thread 1** : Interface web Flask (port 5000) avec logging rotatif
|
||||||
- **Thread 2** : Bot Discord et tâches automatisées
|
- **Thread 2** : Bot Discord et tâches automatisées (humeurs, Humble Bundle)
|
||||||
- **Thread 3** : Bot Twitch et gestion du chat
|
- **Thread 3** : Bot Twitch et surveillance live streams (vérification 5min)
|
||||||
|
|
||||||
|
### Monitoring et logging
|
||||||
|
- **Healthcheck Docker** : Surveillance processus Python + détection erreurs logs
|
||||||
|
- **Logs rotatifs** : Fichiers limités à 50MB avec rotation automatique
|
||||||
|
- **Persistance** : Logs sauvegardés sur l'hôte dans `./logs/`
|
||||||
|
|
||||||
### Dépendances principales
|
### Dépendances principales
|
||||||
```
|
```
|
||||||
discord.py>=2.3.2 # API Discord
|
discord.py==2.3.2 # API Discord avec support async
|
||||||
flask>=2.3.2 # Interface web
|
flask>=2.3.2 # Interface web et API REST
|
||||||
flask-sqlalchemy>=3.0.3 # ORM SQLAlchemy
|
flask-sqlalchemy>=3.0.3 # ORM SQLAlchemy pour base de données
|
||||||
requests>=2.32.4 # Client HTTP
|
flask[async] # Extensions async pour Flask
|
||||||
waitress>=3.0.2 # Serveur WSGI
|
requests>=2.32.4 # Client HTTP pour APIs externes
|
||||||
algoliasearch>=4 # API ProtonDB/SteamDB
|
waitress>=3.0.2 # Serveur WSGI de production
|
||||||
twitchAPI>=4.5.0 # API Twitch
|
algoliasearch>=4,<5 # API ProtonDB via Algolia
|
||||||
python-dotenv==1.0.0 # Variables d'environnement
|
twitchAPI>=4.5.0 # API Twitch pour streams et chat
|
||||||
|
python-dotenv==1.0.0 # Gestion variables d'environnement
|
||||||
|
aiohttp>=3.7.4,<4 # Client HTTP async (requis par discord.py)
|
||||||
|
audioop-lts # Compatibilité audio Python 3.13+
|
||||||
```
|
```
|
||||||
|
|
||||||
## Développement
|
## Développement
|
||||||
|
|||||||
@@ -2,22 +2,19 @@ services:
|
|||||||
mamiehenriette:
|
mamiehenriette:
|
||||||
container_name: MamieHenriette # Nom du conteneur
|
container_name: MamieHenriette # Nom du conteneur
|
||||||
image: ghcr.io/skylanix/mamiehenriette:latest # Image hébergée sur GitHub Container Registry
|
image: ghcr.io/skylanix/mamiehenriette:latest # Image hébergée sur GitHub Container Registry
|
||||||
restart: "no" # N'autorise pas le redémarrage automatique
|
restart: unless-stopped # Redémarre automatiquement sauf si arrêté manuellement
|
||||||
|
|
||||||
# build: . # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire)
|
# build: . # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire)
|
||||||
# image: mamiehenriette # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire)
|
# image: mamiehenriette # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire)
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
TZ: Europe/Paris # Fuseau horaire
|
TZ: Europe/Paris # Fuseau horaire
|
||||||
ENABLE_ZABBIX: false # Surveillance désactivée
|
|
||||||
ZABBIX_SERVER: zabbix-server.example.com
|
|
||||||
ZABBIX_HOSTNAME: mamiehenriette
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./instance:/app/instance # Base de données et configuration persistante
|
- ./instance:/app/instance # Base de données et configuration persistante
|
||||||
|
- ./logs:/app/logs # Logs de l'application
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- 5000:5000 # Interface web sur http://localhost:5000
|
- 5000:5000 # Interface web sur http://localhost:5000
|
||||||
# - "10050:10050" # Port Zabbix (décommentez si nécessaire)
|
|
||||||
|
|
||||||
watchtower: # Permet de mettre à jours automatiquement
|
watchtower: # Permet de mettre à jours automatiquement
|
||||||
image: containrrr/watchtower:latest
|
image: containrrr/watchtower:latest
|
||||||
@@ -39,3 +36,13 @@ services:
|
|||||||
# WATCHTOWER_NOTIFICATIONS: shoutrrr # Service de notification utilisé pour Discord (décommentez si nécessaire)
|
# WATCHTOWER_NOTIFICATIONS: shoutrrr # Service de notification utilisé pour Discord (décommentez si nécessaire)
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock # Monte le socket Docker pour permettre à Watchtower de surveiller les conteneurs
|
- /var/run/docker.sock:/var/run/docker.sock # Monte le socket Docker pour permettre à Watchtower de surveiller les conteneurs
|
||||||
|
|
||||||
|
# sqlite-web: # Interface web pour visualiser et éditer la base de données SQLite
|
||||||
|
# image: ghcr.io/coleifer/sqlite-web:latest # Image officielle sqlite-web
|
||||||
|
# container_name: sqlite_web # Nom du conteneur
|
||||||
|
# ports:
|
||||||
|
# - "5001:8080" # Accès web via localhost:8080
|
||||||
|
# volumes:
|
||||||
|
# - ./instance/database.db:/data/database.db # Monte la base de données locale dans le conteneur
|
||||||
|
# environment:
|
||||||
|
# - SQLITE_DATABASE=/data/database.db # Chemin vers la base de données dans le conteneur
|
||||||
|
|||||||
24
start.sh
24
start.sh
@@ -1,21 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
# Script de démarrage conditionnel pour Zabbix et le bot Discord
|
|
||||||
|
|
||||||
# Vérifier si Zabbix est activé
|
|
||||||
if [ "$ENABLE_ZABBIX" = "true" ]; then
|
|
||||||
echo "Zabbix activé - Configuration de l'agent..."
|
|
||||||
|
|
||||||
# Remplacer les variables dans la config Zabbix
|
|
||||||
sed -i "s/Server=.*/Server=$ZABBIX_SERVER/" /etc/zabbix/zabbix_agent2.conf
|
|
||||||
sed -i "s/ServerActive=.*/ServerActive=$ZABBIX_SERVER:10051/" /etc/zabbix/zabbix_agent2.conf
|
|
||||||
sed -i "s/Hostname=.*/Hostname=$ZABBIX_HOSTNAME/" /etc/zabbix/zabbix_agent2.conf
|
|
||||||
|
|
||||||
zabbix_agent2 -f &
|
|
||||||
echo "Zabbix Agent démarré"
|
|
||||||
else
|
|
||||||
echo "Zabbix désactivé"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Démarrage du bot Discord..."
|
echo "Démarrage du bot Discord..."
|
||||||
exec /app/venv/bin/python run-web.py
|
LOG_FILE="/app/logs/$(date '+%Y%m%d_%H%M%S').log"
|
||||||
|
exec /app/venv/bin/python run-web.py 2>&1 | while IFS= read -r line; do
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S%z') $line" | tee -a "$LOG_FILE" # RFC 3339 / ISO 8601
|
||||||
|
done
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# Configuration Zabbix Agent 2 pour Mamie Henrriette Bot
|
|
||||||
|
|
||||||
# Serveur Zabbix
|
|
||||||
Server=zabbix-server.example.com
|
|
||||||
ServerActive=zabbix-server.example.com:10051
|
|
||||||
|
|
||||||
# Configuration de l'agent
|
|
||||||
Hostname=MamieHenriette
|
|
||||||
ListenPort=10050
|
|
||||||
ListenIP=0.0.0.0
|
|
||||||
|
|
||||||
# Logs
|
|
||||||
LogType=console
|
|
||||||
LogLevel=3
|
|
||||||
DebugLevel=3
|
|
||||||
|
|
||||||
# Timeout
|
|
||||||
Timeout=30
|
|
||||||
|
|
||||||
# Métriques personnalisées pour le bot Discord
|
|
||||||
UserParameter=discord.bot.status,python3 /app/bot_status.py
|
|
||||||
UserParameter=discord.bot.uptime,cat /proc/uptime | awk '{print $1}'
|
|
||||||
UserParameter=discord.bot.memory,ps -o pid,vsz,rss,comm -p $(pgrep -f bot.py) | tail -1 | awk '{print $3}'
|
|
||||||
|
|
||||||
# Surveillance des logs
|
|
||||||
UserParameter=discord.bot.errors,grep -c "ERROR" /var/log/discord-bot.log 2>/dev/null || echo 0
|
|
||||||
UserParameter=discord.bot.warnings,grep -c "WARNING" /var/log/discord-bot.log 2>/dev/null || echo 0
|
|
||||||
Reference in New Issue
Block a user