Public Access
Déploiement serveur pour test de génération multimédia (HuggingFace + Cloudflare)
Build and Push Docker Image / build-and-push (push) Successful in 35s
Build and Push Docker Image / build-and-push (push) Successful in 35s
This commit is contained in:
1 parent
391d9acae1
commit
916af3e62b
2 files changed
+19
-12
No files matched your search
@@ -20,13 +20,17 @@ from modules.billing_manager import charger_soldes, sauvegarder_soldes
|
|||||||
# Lancement du module d'auto-mise à jour en arrière-plan
|
# Lancement du module d'auto-mise à jour en arrière-plan
|
||||||
import modules.model_updater
|
import modules.model_updater
|
||||||
|
|
||||||
|
dossier_media = "/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media"
|
||||||
|
os.makedirs(dossier_media, exist_ok=True)
|
||||||
|
|
||||||
# --- MIDDLEWARE DE SÉCURITÉ ---
|
# --- MIDDLEWARE DE SÉCURITÉ ---
|
||||||
class SecurityMiddleware(BaseHTTPMiddleware):
|
class SecurityMiddleware(BaseHTTPMiddleware):
|
||||||
async def dispatch(self, request, call_next):
|
async def dispatch(self, request, call_next):
|
||||||
ip = request.headers.get("X-Forwarded-For", request.client.host).split(",")[0].strip()
|
ip = request.headers.get("X-Forwarded-For", request.client.host).split(",")[0].strip()
|
||||||
utilisateur = request.cookies.get("aethas_user", "visiteur")
|
utilisateur = request.cookies.get("aethas_user", "visiteur")
|
||||||
|
|
||||||
if not request.url.path.startswith("/Logo") and not request.url.path.startswith("/login"):
|
# EXCLUSION DE /Media POUR NE PAS BLOQUER L'IMAGE
|
||||||
|
if not request.url.path.startswith(("/Logo", "/login", "/Media")):
|
||||||
if verifier_et_bloquer_vpn(ip, utilisateur):
|
if verifier_et_bloquer_vpn(ip, utilisateur):
|
||||||
return HTMLResponse("<h1 style='color:red; text-align:center;'>Accès refusé</h1><p style='text-align:center;'>VPN ou Proxy strictement interdit.</p>", status_code=403)
|
return HTMLResponse("<h1 style='color:red; text-align:center;'>Accès refusé</h1><p style='text-align:center;'>VPN ou Proxy strictement interdit.</p>", status_code=403)
|
||||||
|
|
||||||
@@ -44,10 +48,16 @@ app, rt = fast_app(
|
|||||||
middleware=[Middleware(SecurityMiddleware)]
|
middleware=[Middleware(SecurityMiddleware)]
|
||||||
)
|
)
|
||||||
|
|
||||||
dossier_media = "/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media"
|
|
||||||
os.makedirs(dossier_media, exist_ok=True)
|
|
||||||
app.mount("/Logo", StaticFiles(directory="Logo"), name="Logo")
|
app.mount("/Logo", StaticFiles(directory="Logo"), name="Logo")
|
||||||
app.mount("/Media", StaticFiles(directory="/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media"), name="Media")
|
# (J'ai supprimé l'ancien montage /Media capricieux de Docker)
|
||||||
|
|
||||||
|
# --- ROUTE DÉDIÉE POUR L'AFFICHAGE ET TÉLÉCHARGEMENT DES MÉDIAS ---
|
||||||
|
@rt('/Media/{filename}')
|
||||||
|
def serve_media(filename: str):
|
||||||
|
chemin = os.path.join(dossier_media, filename)
|
||||||
|
if os.path.exists(chemin):
|
||||||
|
return FileResponse(chemin, media_type="image/png")
|
||||||
|
return HTMLResponse("Image introuvable sur le disque", status_code=404)
|
||||||
|
|
||||||
# --- ROUTES D'AUTHENTIFICATION ---
|
# --- ROUTES D'AUTHENTIFICATION ---
|
||||||
@rt('/login')
|
@rt('/login')
|
||||||
|
|||||||
+5
-8
@@ -2,7 +2,7 @@ import os
|
|||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
import concurrent.futures
|
import concurrent.futures
|
||||||
import base64 # <-- NOUVEL IMPORT POUR DECODER L'IMAGE
|
import base64
|
||||||
from modules.logger import log_event
|
from modules.logger import log_event
|
||||||
|
|
||||||
def generer_image_cloudflare(prompt: str) -> bytes:
|
def generer_image_cloudflare(prompt: str) -> bytes:
|
||||||
@@ -17,21 +17,16 @@ def generer_image_cloudflare(prompt: str) -> bytes:
|
|||||||
try:
|
try:
|
||||||
resp = requests.post(url, headers=headers, json={"prompt": prompt}, timeout=120)
|
resp = requests.post(url, headers=headers, json={"prompt": prompt}, timeout=120)
|
||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
# On vérifie si Cloudflare nous répond en texte (JSON)
|
|
||||||
if "application/json" in resp.headers.get("Content-Type", ""):
|
if "application/json" in resp.headers.get("Content-Type", ""):
|
||||||
data = resp.json()
|
data = resp.json()
|
||||||
if data.get("success") and "result" in data:
|
if data.get("success") and "result" in data:
|
||||||
# On transforme le texte Base64 en véritable fichier image binaire
|
|
||||||
return base64.b64decode(data["result"])
|
return base64.b64decode(data["result"])
|
||||||
else:
|
else:
|
||||||
# S'il répond nativement en binaire (parfois le cas selon la requête)
|
|
||||||
return resp.content
|
return resp.content
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log_event("WARNING", "MEDIA", f"Échec Cloudflare : {e}")
|
log_event("WARNING", "MEDIA", f"Échec Cloudflare : {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# ... (le reste du fichier reste identique)
|
|
||||||
|
|
||||||
def generer_image_huggingface(prompt: str) -> bytes:
|
def generer_image_huggingface(prompt: str) -> bytes:
|
||||||
"""Appel à l'API HuggingFace"""
|
"""Appel à l'API HuggingFace"""
|
||||||
api_key = os.getenv("HUGGINGFACE_API_KEY")
|
api_key = os.getenv("HUGGINGFACE_API_KEY")
|
||||||
@@ -72,7 +67,8 @@ def generer_les_deux_images(prompt: str, fichiers: list) -> tuple:
|
|||||||
if img_cf:
|
if img_cf:
|
||||||
nom_cf = f"img_cf_{int(time.time())}.png"
|
nom_cf = f"img_cf_{int(time.time())}.png"
|
||||||
with open(os.path.join(dossier_media, nom_cf), 'wb') as f: f.write(img_cf)
|
with open(os.path.join(dossier_media, nom_cf), 'wb') as f: f.write(img_cf)
|
||||||
reponse_md += f"### ☁️ Cloudflare Workers AI (SDXL)\n\n\n---\n\n"
|
reponse_md += f"### ☁️ Cloudflare Workers AI (SDXL)\n\n\n"
|
||||||
|
reponse_md += f"**[📥 Cliquez ici pour télécharger l'image](/Media/{nom_cf})**\n\n---\n\n"
|
||||||
fournisseurs_actifs.append("Cloudflare")
|
fournisseurs_actifs.append("Cloudflare")
|
||||||
trace.append("🟢 Cloudflare : Succès")
|
trace.append("🟢 Cloudflare : Succès")
|
||||||
else:
|
else:
|
||||||
@@ -83,6 +79,7 @@ def generer_les_deux_images(prompt: str, fichiers: list) -> tuple:
|
|||||||
nom_hf = f"img_hf_{int(time.time())}.png"
|
nom_hf = f"img_hf_{int(time.time())}.png"
|
||||||
with open(os.path.join(dossier_media, nom_hf), 'wb') as f: f.write(img_hf)
|
with open(os.path.join(dossier_media, nom_hf), 'wb') as f: f.write(img_hf)
|
||||||
reponse_md += f"### 🤗 HuggingFace (SDXL)\n\n\n"
|
reponse_md += f"### 🤗 HuggingFace (SDXL)\n\n\n"
|
||||||
|
reponse_md += f"**[📥 Cliquez ici pour télécharger l'image](/Media/{nom_hf})**\n\n"
|
||||||
fournisseurs_actifs.append("HuggingFace")
|
fournisseurs_actifs.append("HuggingFace")
|
||||||
trace.append("🟢 HF : Succès")
|
trace.append("🟢 HF : Succès")
|
||||||
else:
|
else:
|
||||||
@@ -90,7 +87,7 @@ def generer_les_deux_images(prompt: str, fichiers: list) -> tuple:
|
|||||||
|
|
||||||
# Si les deux ont échoué
|
# Si les deux ont échoué
|
||||||
if not img_hf and not img_cf:
|
if not img_hf and not img_cf:
|
||||||
return "*Échec critique : HuggingFace et Cloudflare ont échoué (ou clés manquantes).* \nVérifiez les logs du serveur.", "#ff4444", "Système", "Erreur", trace
|
return "*Échec critique : HuggingFace et Cloudflare ont échoué.*", "#ff4444", "Système", "Erreur", trace
|
||||||
|
|
||||||
return reponse_md, "#00e5ff", " + ".join(fournisseurs_actifs), "Stable Diffusion XL", trace
|
return reponse_md, "#00e5ff", " + ".join(fournisseurs_actifs), "Stable Diffusion XL", trace
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user