Compare commits

..

28 Commits

Author SHA1 Message Date
eb78df8671 passage siam.nicolasboyer.com 2026-03-03 13:43:20 +01:00
c6087ccc80 rajout du tunnel cloudflare 2026-02-26 10:27:34 +01:00
0eb7671ce9 erreur routing 2026-02-25 09:34:55 +01:00
6115c1a3c1 erreur server.py gradio > fast api 2026-02-25 09:17:06 +01:00
1d5193f946 erreur 2026-02-25 08:22:46 +01:00
eecc7db671 erreurs 2026-02-25 08:16:32 +01:00
e4c437d5c0 erreur 2026-02-24 20:05:36 +01:00
9ac9415599 erreur 2026-02-24 19:27:24 +01:00
a1b72e2d7e erreur 2026-02-24 19:22:53 +01:00
da5fadcae3 erreur 2026-02-24 18:44:23 +01:00
f0730389e0 errreur 2026-02-24 18:09:54 +01:00
2ebb89f113 erreurs 2026-02-24 17:52:46 +01:00
1c151c0e52 plus rapide 2026-02-24 17:35:44 +01:00
c26b2b8dbb plus rapide 2026-02-24 17:34:01 +01:00
3058446b7d erreur 2026-02-24 17:31:26 +01:00
d6e7ccd64d pb port 2026-02-24 17:29:28 +01:00
c1f7054088 probleme dependances 2026-02-24 16:56:27 +01:00
a143e27eea correction bug 2026-02-24 15:33:05 +01:00
05ddb3cac5 readme 2026-02-24 14:46:29 +01:00
f0b1dd07f6 avec nginx 2026-02-24 14:21:03 +01:00
c8ca363996 debut 2026-02-24 14:16:30 +01:00
751794aa0e debut 2026-02-24 13:51:01 +01:00
c6a6f3b22d debut 2026-02-24 13:49:14 +01:00
ad031dee70 debut 2026-02-24 13:46:11 +01:00
966fd7af5a debut 2026-02-24 13:44:44 +01:00
e6ca32c896 debut 2026-02-24 13:41:44 +01:00
7e18397527 debut repo 2026-02-24 13:36:07 +01:00
b2f80c436f version 2026-02-24 13:27:02 +01:00
5 changed files with 90 additions and 39 deletions

0
.env
View File

8
.env.example Normal file
View File

@ -0,0 +1,8 @@
# Clé secrète Open WebUI (générer avec: openssl rand -hex 32)
WEBUI_SECRET_KEY=your_secret_key_here
# IP publique de ta VM Vast.ai (change à chaque nouvelle instance)
WEBUI_URL=http://YOUR_VAST_AI_IP
# Token du tunnel Cloudflare
CF_TUNNEL_TOKEN=your_cloudflare_tunnel_token

View File

@ -16,14 +16,27 @@ services:
condition: service_started condition: service_started
restart: always restart: always
# --- LE TUNNEL HTTPS ---
cloudflared:
image: cloudflare/cloudflared:latest
container_name: studio-cloudflared
command: tunnel --no-autoupdate run --token ${CF_TUNNEL_TOKEN}
environment:
- CF_TUNNEL_TOKEN=${CF_TUNNEL_TOKEN}
networks:
- studio-net
depends_on:
- gateway
restart: always
# --- L'INTERFACE (Open WebUI) --- # --- L'INTERFACE (Open WebUI) ---
open-webui: open-webui:
image: ghcr.io/open-webui/open-webui:main image: ghcr.io/open-webui/open-webui:main
container_name: open-webui container_name: open-webui
environment: environment:
- OLLAMA_BASE_URL=http://ollama:11434 - OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:-supersecretkey} - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
- WEBUI_URL=http://93.108.34.236 - WEBUI_URL=${WEBUI_URL}
- ENABLE_WEBSOCKETS=True - ENABLE_WEBSOCKETS=True
volumes: volumes:
- webui_data:/app/backend/data - webui_data:/app/backend/data
@ -51,6 +64,8 @@ services:
- ollama_data:/root/.ollama - ollama_data:/root/.ollama
networks: networks:
- studio-net - studio-net
expose:
- "11434"
restart: always restart: always
# --- LE SERVICE AUDIO --- # --- LE SERVICE AUDIO ---
@ -59,11 +74,9 @@ services:
context: ./services/audio-api context: ./services/audio-api
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: audio-api container_name: audio-api
# Force Python à sortir les logs immédiatement
environment: environment:
- NVIDIA_VISIBLE_DEVICES=all - NVIDIA_VISIBLE_DEVICES=all
- PYTHONUNBUFFERED=1 - PYTHONUNBUFFERED=1
# On utilise le chemin absolu dans le container pour être sûr
entrypoint: ["python3.11", "/app/server.py"] entrypoint: ["python3.11", "/app/server.py"]
volumes: volumes:
- ./services/audio-api:/app - ./services/audio-api:/app
@ -76,14 +89,14 @@ services:
- driver: nvidia - driver: nvidia
count: all count: all
capabilities: [gpu] capabilities: [gpu]
ports:
- "7860:7860"
networks: networks:
- studio-net - studio-net
restart: always restart: always
networks: networks:
studio-net: studio-net:
driver: bridge driver: bridge
volumes: volumes:
webui_data: webui_data:
ollama_data: ollama_data:

View File

@ -1,31 +1,20 @@
server { server {
listen 80; listen 80;
# Interface principale & Flux Ollama # --- TRANSCRIPTION AUDIO (STT) ---
location / { # Doit être AVANT location / pour avoir la priorité
proxy_pass http://open-webui:8080; location /api/v1/audio/transcriptions {
proxy_pass http://audio-api:7860/v1/audio/transcriptions;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto $scheme;
# --- AJOUT INDISPENSABLE POUR LES WEBSOCKETS ---
proxy_http_version 1.1; ## Requis
proxy_set_header Upgrade $http_upgrade; ## Requis
proxy_set_header Connection "upgrade"; ## Requis
# -----------------------------------------------
# DESACTIVATION TOTALE DU CACHE ET DU BUFFER
proxy_buffering off; proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding on;
# Temps d'attente rallongé pour les gros modèles
proxy_read_timeout 600s; proxy_read_timeout 600s;
proxy_send_timeout 600s; proxy_send_timeout 600s;
client_max_body_size 25M;
} }
# API Audio # --- API AUDIO (accès direct Gradio/FastAPI) ---
location /audio/ { location /audio/ {
proxy_pass http://audio-api:7860/; proxy_pass http://audio-api:7860/;
proxy_http_version 1.1; proxy_http_version 1.1;
@ -34,5 +23,30 @@ server {
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_buffering off; proxy_buffering off;
proxy_read_timeout 600s; proxy_read_timeout 600s;
client_max_body_size 25M;
}
# --- INTERFACE PRINCIPALE & FLUX OLLAMA ---
location / {
proxy_pass http://open-webui:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# INDISPENSABLE POUR LES WEBSOCKETS
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# DÉSACTIVATION TOTALE DU CACHE ET DU BUFFER
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding on;
# Temps d'attente rallongé pour les gros modèles
proxy_read_timeout 600s;
proxy_send_timeout 600s;
client_max_body_size 25M;
} }
} }

View File

@ -1,19 +1,35 @@
import gradio as gr from fastapi import FastAPI, UploadFile, File, HTTPException
import time from faster_whisper import WhisperModel
import io
def generate_music(prompt, duration): app = FastAPI()
print(f"🎵 Génération demandée : {prompt} pour {duration} secondes")
# Simule un temps de calcul
time.sleep(2)
return "Dummy audio generated !"
# Interface pour Open WebUI # Chargement du modèle sur ton GPU RTX 4060 Ti
demo = gr.Interface( # On utilise "cuda" et "float16" pour la vitesse maximale
fn=generate_music, model = WhisperModel("base", device="cuda", compute_type="float16")
inputs=["text", "number"],
outputs="text", @app.get("/v1/models")
title="ACE-Step Audio API" async def get_models():
) # Indispensable pour qu'Open WebUI voie le modèle dans la liste
return {"data": [{"id": "whisper-1"}]}
@app.post("/v1/audio/transcriptions")
async def transcribe(file: UploadFile = File(...)):
try:
# On lit le fichier envoyé par le micro
audio_data = await file.read()
audio_file = io.BytesIO(audio_data)
# Transcription ultra-rapide avec ton GPU
segments, _ = model.transcribe(audio_file, beam_size=5)
text = " ".join([segment.text for segment in segments])
return {"text": text}
except Exception as e:
print(f"Erreur transcription: {e}")
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__": if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860) import uvicorn
# On lance sur le port 7860 comme prévu dans ton Docker-compose
uvicorn.run(app, host="0.0.0.0", port=7860)