diff --git a/Dockerfile b/Dockerfile index e40c22d..7465a47 100755 --- a/Dockerfile +++ b/Dockerfile @@ -7,21 +7,19 @@ 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 \ - wget \ - && wget https://repo.zabbix.com/zabbix/7.4/release/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.4+debian12_all.deb \ - && 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 + procps \ + apache2-utils \ + bash + +RUN 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/* + COPY requirements.txt . COPY run-web.py . COPY ./database ./database @@ -29,11 +27,14 @@ COPY ./discordbot ./discordbot COPY ./protondb ./protondb COPY ./webapp ./webapp COPY ./twitchbot ./twitchbot -COPY zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf COPY start.sh /start.sh 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 && \ + mkdir -p /app/logs -CMD ["/start.sh"] \ No newline at end of file +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"] diff --git a/README.md b/README.md index 82aa1a4..a26c22d 100755 --- a/README.md +++ b/README.md @@ -10,11 +10,11 @@ - [Twitch](#twitch) - [YouTube Live](#youtube-live-en-développement) - [Interface d'administration](#interface-dadministration) - - [Surveillance](#surveillance) - [Installation](#installation) - [Prérequis](#prérequis) - [Création du bot Discord](#création-du-bot-discord) - [Démarrage rapide](#démarrage-rapide) + - [Volumes persistants](#volumes-persistants) - [Commandes Docker utiles](#commandes-docker-utiles) - [Mise à jour](#mise-à-jour) - [Architecture du projet](#architecture-du-projet) @@ -24,6 +24,7 @@ - [Spécifications techniques](#spécifications-techniques) - [Base de données (SQLite)](#base-de-données-sqlite) - [Architecture multi-thread](#architecture-multi-thread) + - [Monitoring et logging](#monitoring-et-logging) - [Dépendances principales](#dépendances-principales) - [Développement](#développement) - [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) - Système de notifications automatiques - Base de données intégrée pour la persistance -- Surveillance optionnelle avec Zabbix *(non testée)* ## Fonctionnalités @@ -55,6 +55,11 @@ Mamie Henriette est un bot intelligent open-source développé spécifiquement p ### Twitch - **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)* - **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 - **Modération** : Outils de gestion communautaire -### Surveillance -- **Zabbix Agent 2** : Monitoring avancé *(non testé)* -- **Métriques** : Santé du bot et uptime ## Installation @@ -129,12 +131,11 @@ docker compose up --build -d > 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 -# Logs en temps réel -docker compose logs -f MamieHenriette -``` +### Commandes Docker utiles ```bash # Logs d'un conteneur en cours d'exécution @@ -190,9 +191,10 @@ python run-web.py | Section | Fonction | |---------|----------| | **Configurations** | Tokens Discord/Twitch, paramètres généraux et configuration ProtonDB | -| **Humeurs** | Gestion des statuts Discord | -| **Commandes** | Commandes personnalisées multi-plateformes | -| **Messages** | Messages automatiques et notifications | +| **Humeurs** | Gestion des statuts Discord rotatifs | +| **Commandes** | Commandes personnalisées multi-plateformes (Discord/Twitch) | +| **Alertes Live** | Configuration surveillance streamers Twitch avec notifications Discord | +| **Messages** | Messages automatiques et notifications périodiques | | **Modération** | Outils de gestion communautaire | ### Structure des modules @@ -204,18 +206,22 @@ python run-web.py │ └── schema.sql # Structure initiale │ ├── discordbot/ # Module Discord -│ └── __init__.py # Bot et handlers +│ ├── __init__.py # Bot et handlers principaux +│ └── humblebundle.py # Surveillance Humble Bundle │ ├── 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 │ └── __init__.py # API Algolia et recherche compatibilité │ └── webapp/ # Interface d'administration - ├── static/ # Assets statiques - ├── templates/ # Vues HTML - └── *.py # Contrôleurs par section + ├── static/ # Assets statiques (CSS, JS, images) + ├── templates/ # Vues HTML Jinja2 + ├── live_alert.py # Gestion des alertes Twitch + ├── twitch_auth.py # Authentification Twitch OAuth + └── *.py # Autres contrôleurs par section ``` ### Composants principaux @@ -230,28 +236,37 @@ python run-web.py ## Spécifications techniques ### Base de données (SQLite) -- **Configuration** : Paramètres et tokens -- **Humeur** : Statuts Discord rotatifs -- **Commande** : Commandes personnalisées Discord/Twitch +- **Configuration** : Paramètres et tokens des plateformes +- **Humeur** : Statuts Discord rotatifs avec gestion automatique +- **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 -- **GameBundle** : Historique Humble Bundle -- **Message** : Messages périodiques *(structure définie, non implémenté)* +- **GameBundle** : Historique et notifications Humble Bundle +- **Message** : Messages automatiques périodiques (implémenté) ### Architecture multi-thread -- **Thread 1** : Interface web Flask (port 5000) -- **Thread 2** : Bot Discord et tâches automatisées -- **Thread 3** : Bot Twitch et gestion du chat +- **Thread 1** : Interface web Flask (port 5000) avec logging rotatif +- **Thread 2** : Bot Discord et tâches automatisées (humeurs, Humble Bundle) +- **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 ``` -discord.py>=2.3.2 # API Discord -flask>=2.3.2 # Interface web -flask-sqlalchemy>=3.0.3 # ORM SQLAlchemy -requests>=2.32.4 # Client HTTP -waitress>=3.0.2 # Serveur WSGI -algoliasearch>=4 # API ProtonDB/SteamDB -twitchAPI>=4.5.0 # API Twitch -python-dotenv==1.0.0 # Variables d'environnement +discord.py==2.3.2 # API Discord avec support async +flask>=2.3.2 # Interface web et API REST +flask-sqlalchemy>=3.0.3 # ORM SQLAlchemy pour base de données +flask[async] # Extensions async pour Flask +requests>=2.32.4 # Client HTTP pour APIs externes +waitress>=3.0.2 # Serveur WSGI de production +algoliasearch>=4,<5 # API ProtonDB via Algolia +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 diff --git a/docker-compose.yml b/docker-compose.yml index cd5b762..ecea7ab 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,22 +2,19 @@ services: mamiehenriette: container_name: MamieHenriette # Nom du conteneur 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) # image: mamiehenriette # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire) environment: TZ: Europe/Paris # Fuseau horaire - ENABLE_ZABBIX: false # Surveillance désactivée - ZABBIX_SERVER: zabbix-server.example.com - ZABBIX_HOSTNAME: mamiehenriette volumes: - ./instance:/app/instance # Base de données et configuration persistante + - ./logs:/app/logs # Logs de l'application ports: - 5000:5000 # Interface web sur http://localhost:5000 -# - "10050:10050" # Port Zabbix (décommentez si nécessaire) watchtower: # Permet de mettre à jours automatiquement image: containrrr/watchtower:latest @@ -39,3 +36,13 @@ services: # WATCHTOWER_NOTIFICATIONS: shoutrrr # Service de notification utilisé pour Discord (décommentez si nécessaire) volumes: - /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 diff --git a/start.sh b/start.sh index b6cc32c..3f83efa 100644 --- a/start.sh +++ b/start.sh @@ -1,21 +1,7 @@ -#!/bin/sh - -# 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 +#!/bin/bash echo "Démarrage du bot Discord..." -exec /app/venv/bin/python run-web.py \ No newline at end of file +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 \ No newline at end of file diff --git a/zabbix_agent2.conf b/zabbix_agent2.conf deleted file mode 100644 index 4b6cfbe..0000000 --- a/zabbix_agent2.conf +++ /dev/null @@ -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 \ No newline at end of file