feat: Préparation au déploiement Docker, sécurisation du README et ajout du module de facturation

This commit is contained in:
xavier committed 2026-08-18 14:43:31 +02:00
1 parent 317ecddc56
commit 37ee5c6234
5 files changed
+163 -12

No files matched your search

+24 -2
View File
@@ -2,18 +2,40 @@ import uuid
from fasthtml.common import *
from starlette.staticfiles import StaticFiles
from starlette.responses import FileResponse
from starlette.middleware.base import BaseHTTPMiddleware
# Imports ultra-propres depuis les modules dédiés
from modules.theme import get_theme_hdrs
from modules.database import nettoyer_vieilles_discussions, HISTORY_FILE, load_history, save_history
from modules.ui_components import render_main_page, render_sidebar
from modules.chat_handler import handle_chat_request
from modules.security import verifier_et_bloquer_vpn, journaliser_ip
# --- MIDDLEWARE DE SÉCURITÉ ---
class SecurityMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
# Récupération de l'IP du client (gère le proxy NPM si configuré avec X-Forwarded-For)
ip = request.headers.get("X-Forwarded-For", request.client.host).split(",")[0].strip()
# On exclut les requêtes internes et statiques pour ne pas spammer les logs
if ip not in ["127.0.0.1", "localhost", "::1"] and not request.url.path.startswith("/Logo"):
# 1. Vérification VPN
if verifier_et_bloquer_vpn(ip):
return HTMLResponse("<h1 style='color:red; text-align:center;'>Accès refusé</h1><p style='text-align:center;'>Les connexions via VPN, Proxy ou Datacenter sont strictement interdites sur cette plateforme.</p>", status_code=403)
# 2. Journalisation RGPD
journaliser_ip(ip, f"Accès à {request.url.path}")
return await call_next(request)
# On exécute le nettoyage au démarrage
nettoyer_vieilles_discussions()
# Initialisation du serveur FastHTML
app, rt = fast_app(hdrs=get_theme_hdrs(), secret_key="super_secret_aethas")
# Initialisation du serveur FastHTML avec le Middleware de sécurité
app, rt = fast_app(
hdrs=get_theme_hdrs(),
secret_key="super_secret_aethas",
middleware=[Middleware(SecurityMiddleware)]
)
# Montage du dossier statique pour rendre accessible le logo
app.mount("/Logo", StaticFiles(directory="Logo"), name="Logo")