- Minimale Web-UI (app/web/, vanilla, same-origin -> kein CORS): Text-Prompt + Mikrofon-Button (Aufnahme im Browser -> /ws/voice -> Antwort wird vorgelesen), Token-Streaming, PCM-Wiedergabe, Identitaet/Logout/Admin im Menue - Forward-/Trusted-Header-Auth (app/auth.py): Identitaet aus SSO-Header, nur von TRUSTED_PROXY_IPS akzeptiert; sonst Token/Anonymous-Fallback. Auto-Provisioning via store.get_or_create_user_by_external_id (+ external_id-Spalte/Migration) - /api/me um is_admin + sso_logout_url erweitert; GET /api/admin/users (Liste) und GET /api/admin/request-headers (SSO-Header-Discovery), Admin-gated - StaticFiles-Mount; Config: TRUSTED_AUTH_HEADER/_PROXY_IPS, ADMIN_USERS, SSO_LOGOUT_URL - WS-Auth liest Identitaet aus dem Handshake-Header - Deploy: nginx-Vorlage (WS-Upgrade!) + deploy/README.md (HTTPS/SSO/Firewall/Discovery) - Tests: Forward-Auth (Provisioning, Admin-Flag, Proxy-IP-Trust, 401/403, Static) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 lines
898 B
Text
22 lines
898 B
Text
# Nur an die LAN-IP binden (NICHT 0.0.0.0), erreichbar allein fuer den Reverse-Proxy.
|
|
HOST=192.168.0.50 # <-- LAN-IP der GPU-Box
|
|
PORT=8003
|
|
OPENROUTER_API_KEY=
|
|
|
|
# Profil und Konfiguration
|
|
VA_PROFILE=cloud
|
|
|
|
# Authentifizierung (Produktion: an). ADMIN_API_KEY fuer die Nutzerverwaltung (Fallback).
|
|
AUTH_ENABLED=true
|
|
ADMIN_API_KEY=
|
|
|
|
# --- Forward-/Trusted-Header-Auth via YunoHost-SSO ---------------------------
|
|
# Nach der Discovery (GET /api/admin/request-headers hinter dem SSO) den echten
|
|
# Header-Namen eintragen. Identitaet wird nur von der Proxy-Quell-IP akzeptiert.
|
|
TRUSTED_AUTH_HEADER=X-Remote-User
|
|
TRUSTED_PROXY_IPS=192.168.0.10 # <-- LAN-IP des YunoHost-Servers (linix.de)
|
|
ADMIN_USERS=atoor,dieterschlueter,dschlueter
|
|
SSO_LOGOUT_URL=https://linix.de/yunohost/sso/?action=logout
|
|
|
|
# Persistente Datenbank (Pfad auf dem Host)
|
|
DB_PATH=/var/lib/voice-assistant/voice-assistant.db
|