From 3c83b675383386ba2df82dd0ac8534325f89d1d4 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 22:52:41 +0000 Subject: [PATCH] =?UTF-8?q?Suppression=20de=20Caddy=20:=20l'app=20sert=20d?= =?UTF-8?q?irectement=20le=20HTTPS=20auto-sign=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Un conteneur de moins. Le HTTPS reste nécessaire pour l'accès micro (getUserMedia) depuis un autre appareil : certificat auto-signé généré au démarrage pour LIVEFLOW_HOST, servi par uvicorn. https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe --- Caddyfile | 18 ------------------ README.md | 27 ++++++++++++++------------- app/Dockerfile | 7 ++++++- app/entrypoint.sh | 26 ++++++++++++++++++++++++++ docker-compose.unraid.yml | 32 +++++++++----------------------- docker-compose.yml | 22 ++++------------------ 6 files changed, 59 insertions(+), 73 deletions(-) delete mode 100644 Caddyfile create mode 100644 app/entrypoint.sh diff --git a/Caddyfile b/Caddyfile deleted file mode 100644 index 2e0f65a..0000000 --- a/Caddyfile +++ /dev/null @@ -1,18 +0,0 @@ -{ - # Certificats auto-signés locaux : indispensable pour que le navigateur - # (surtout sur téléphone) autorise l'accès au micro (getUserMedia). - local_certs - # Les connexions par IP n'envoient pas de SNI : on force le certificat. - default_sni {$LIVEFLOW_HOST:localhost} -} - -# LIVEFLOW_HOST = IP ou nom d'hôte du serveur (défini dans docker-compose). -# Caddy génère un certificat auto-signé pour cette adresse au démarrage. -{$LIVEFLOW_HOST:localhost}:443 { - tls internal - reverse_proxy app:8000 -} - -:80 { - redir https://{host}{uri} permanent -} diff --git a/README.md b/README.md index 679b4a4..0ca1917 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,12 @@ Capture du micro depuis un navigateur (PC ou téléphone), transcription par **Qwen3-ASR** sur GPU NVIDIA, affichage du texte au fil de l'eau, historique et export (TXT, Markdown, SRT, JSON). -Architecture détaillée : voir [ARCHITECTURE.md](ARCHITECTURE.md) (proposition 2 retenue). +Architecture détaillée : voir [ARCHITECTURE.md](ARCHITECTURE.md) (proposition 2 retenue, +sans reverse proxy : l'app sert directement le HTTPS). ``` Navigateur (micro, HTTPS/WebSocket) - → Caddy (TLS local) - → app FastAPI (VAD + segments + SQLite + interface web) + → app FastAPI (HTTPS auto-signé + VAD + segments + SQLite + interface web) → conteneur ASR Qwen3-ASR via vLLM (API compatible OpenAI) ``` @@ -35,23 +35,24 @@ Hugging Face (quelques Go, mis en cache dans un volume). Suivre avec : docker compose logs -f asr ``` -Puis ouvrir **https://\** depuis un PC ou un téléphone du -réseau local, accepter le certificat auto-signé, autoriser le micro, et +Puis ouvrir **https://\:8443** depuis un PC ou un téléphone du +réseau local, accepter l'avertissement de certificat, autoriser le micro, et cliquer sur **Démarrer**. > ⚠️ Le HTTPS est obligatoire : les navigateurs n'autorisent l'accès au micro -> (`getUserMedia`) qu'en HTTPS (ou sur `localhost`). Caddy génère -> automatiquement un certificat local auto-signé. Pour supprimer -> l'avertissement du navigateur, vous pouvez installer la CA racine de Caddy -> sur vos appareils : `docker compose cp caddy:/data/caddy/pki/authorities/local/root.crt .` +> (`getUserMedia`) qu'en HTTPS (ou sur `localhost`). L'app génère elle-même un +> certificat auto-signé au premier démarrage pour l'adresse `LIVEFLOW_HOST` +> (stocké dans le volume de données ; supprimez `data/certs/` pour le +> régénérer après un changement d'adresse). ## Unraid Un compose dédié est fourni : [`docker-compose.unraid.yml`](docker-compose.unraid.yml) -(chemins `appdata`, GPU via `runtime: nvidia`, ports 8088/8443 car 80/443 sont -pris par l'interface Unraid). Prérequis : plugins **Nvidia Driver** et -**Docker Compose Manager**. Cloner le dépôt dans `/mnt/user/appdata/liveflow`, -créer une stack pointant sur ce fichier, puis ouvrir `https://:8443`. +(chemins `appdata`, GPU via `runtime: nvidia`, port 8443). Prérequis : plugins +**Nvidia Driver** et **Docker Compose Manager**. Extraire le dépôt dans +`/mnt/user/appdata/liveflow`, renseigner `LIVEFLOW_HOST` (IP du serveur) dans +le compose, créer une stack pointant sur ce fichier, puis ouvrir +`https://:8443`. ## Configuration diff --git a/app/Dockerfile b/app/Dockerfile index 8a02a6d..93393a4 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,11 +1,16 @@ FROM python:3.12-slim +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssl \ + && rm -rf /var/lib/apt/lists/* + WORKDIR /srv COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . +RUN chmod +x entrypoint.sh EXPOSE 8000 -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] +ENTRYPOINT ["./entrypoint.sh"] diff --git a/app/entrypoint.sh b/app/entrypoint.sh new file mode 100644 index 0000000..b6b31e9 --- /dev/null +++ b/app/entrypoint.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# Génère un certificat auto-signé (si absent ou si l'adresse a changé) puis +# lance l'app en HTTPS. Le HTTPS est requis par les navigateurs pour accéder +# au micro (getUserMedia) depuis un autre appareil que localhost. +set -e + +CERT_DIR=${CERT_DIR:-/data/certs} +HOST=${LIVEFLOW_HOST:-localhost} +CERT="$CERT_DIR/cert.pem" +KEY="$CERT_DIR/key.pem" +mkdir -p "$CERT_DIR" + +case "$HOST" in + *[!0-9.]*) SAN="DNS:$HOST" ;; # nom d'hôte + *) SAN="IP:$HOST" ;; # adresse IP +esac + +if [ ! -f "$CERT" ] || ! openssl x509 -in "$CERT" -noout -text 2>/dev/null | grep -q "$HOST"; then + echo "Génération du certificat auto-signé pour $HOST..." + openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \ + -keyout "$KEY" -out "$CERT" -subj "/CN=$HOST" \ + -addext "subjectAltName=$SAN,DNS:localhost,IP:127.0.0.1" +fi + +exec uvicorn main:app --host 0.0.0.0 --port 8000 \ + --ssl-certfile "$CERT" --ssl-keyfile "$KEY" diff --git a/docker-compose.unraid.yml b/docker-compose.unraid.yml index 01537de..812930a 100644 --- a/docker-compose.unraid.yml +++ b/docker-compose.unraid.yml @@ -2,37 +2,23 @@ # # Prérequis : # 1. Plugin "Nvidia Driver" installé (Community Applications) -# 2. Cloner ce dépôt dans /mnt/user/appdata/liveflow : -# cd /mnt/user/appdata && git clone -b claude/laughing-thompson-ci0zw1 liveflow -# 3. Créer une stack Compose Manager pointant sur ce fichier +# 2. Le dépôt extrait dans /mnt/user/appdata/liveflow +# 3. Une stack Compose Manager pointant sur ce fichier # -# Les ports 80/443 étant utilisés par l'interface Unraid, l'app est exposée -# uniquement en HTTPS sur 8443 : ouvrir https://:8443 -# (accepter le certificat auto-signé). +# L'app sert directement le HTTPS avec un certificat auto-signé (requis par +# les navigateurs pour autoriser le micro) : ouvrir https://:8443 +# et accepter l'avertissement de certificat. services: - caddy: - image: caddy:2-alpine - container_name: liveflow-caddy - restart: unless-stopped - ports: - - "8443:443" - environment: - # ← IP (ou nom d'hôte) de votre serveur Unraid : utilisée pour générer - # le certificat HTTPS auto-signé. À adapter si votre IP diffère. - - LIVEFLOW_HOST=192.168.1.16 - volumes: - - /mnt/user/appdata/liveflow/Caddyfile:/etc/caddy/Caddyfile:ro - - /mnt/user/appdata/liveflow/caddy/data:/data - - /mnt/user/appdata/liveflow/caddy/config:/config - depends_on: - - app - app: build: /mnt/user/appdata/liveflow/app container_name: liveflow-app restart: unless-stopped + ports: + - "8443:8000" environment: + # ← IP (ou nom d'hôte) de votre serveur Unraid, pour le certificat HTTPS + - LIVEFLOW_HOST=192.168.1.16 - ASR_BASE_URL=http://asr:8000/v1 - ASR_MODEL=Qwen/Qwen3-ASR-1.7B - ASR_API_KEY=sk-local diff --git a/docker-compose.yml b/docker-compose.yml index ac1e2cf..e46de81 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,24 +1,12 @@ services: - caddy: - image: caddy:2-alpine - restart: unless-stopped - ports: - - "80:80" - - "443:443" - environment: - # IP ou nom d'hôte du serveur, pour le certificat HTTPS auto-signé - - LIVEFLOW_HOST=${LIVEFLOW_HOST:-localhost} - volumes: - - ./Caddyfile:/etc/caddy/Caddyfile:ro - - caddy-data:/data - - caddy-config:/config - depends_on: - - app - app: build: ./app restart: unless-stopped + ports: + - "8443:8000" environment: + # IP ou nom d'hôte du serveur, pour le certificat HTTPS auto-signé + - LIVEFLOW_HOST=${LIVEFLOW_HOST:-localhost} - ASR_BASE_URL=http://asr:8000/v1 - ASR_MODEL=Qwen/Qwen3-ASR-1.7B - ASR_API_KEY=${ASR_API_KEY:-sk-local} @@ -50,7 +38,5 @@ services: capabilities: [gpu] volumes: - caddy-data: - caddy-config: liveflow-data: hf-cache: