Fehlerbehebung
Häufige Probleme und wie Sie sie diagnostizieren.
/readyz liefert 503
Abschnitt betitelt „/readyz liefert 503“Das Backend meldet sich als unhealthy. Prüfen Sie, was fehlschlägt:
docker compose psdocker compose logs backend | tail -50docker compose exec backend wget -qO- http://localhost:8095/readyz/readyz prüft Postgres + Redis + LiveKit. Die JSON-Antwort listet auf, welche
Abhängigkeit ausgefallen ist. Üblicherweise:
- Postgres ist noch nicht bereit (10–20 s nach
docker compose upwarten) - Redis-Passwort stimmt nicht zwischen
.envund dem Container überein - LiveKit-Signaling nicht erreichbar (prüfen, ob die Env-Variable
LIVEKIT_HOSTauflösbar ist)
LiveKit connection refused / WebSocket schlägt fehl
Abschnitt betitelt „LiveKit connection refused / WebSocket schlägt fehl“docker compose logs livekit | tail -30Zwei häufige Ursachen:
- API-Key/Secret stimmen nicht überein.
infra/livekit.yamlenthältkeys: { <KEY>: <SECRET> }, und das Backend liestLIVEKIT_API_KEY/LIVEKIT_API_SECRETaus.env. Sie müssen exakt übereinstimmen. Im Zweifelsfall beide Seiten neu generieren. - UDP-Ports blockiert. WebRTC-Medien laufen über UDP 50000–50200
(konfigurierbar in
infra/livekit.yaml). Auf einem Host mit Firewall müssen diese offen sein. Der TCP-Fallback nutzt 7881 — langsamer, funktioniert aber auch in restriktiven Netzwerken.
Cookie wird nach dem Login nicht gesetzt
Abschnitt betitelt „Cookie wird nach dem Login nicht gesetzt“Symptom: Die Login-API liefert 200 OK, aber der Browser springt sofort zurück
auf /login. Das Session-Cookie wurde nicht akzeptiert.
Ursachen:
- Die Env-Variable
DOMAINstimmt nicht mit dem aufgerufenen Host überein (Cookie-Domain-Mismatch) - Sie greifen über HTTP statt HTTPS zu —
Secure-Cookies erfordern in modernen Browsern TLS - Sie befinden sich hinter einem Proxy, der
Set-Cookieentfernt — Caddy-Logs prüfen
docker compose logs caddy | grep -i cookie401 Unauthorized auf geschützten Routen
Abschnitt betitelt „401 Unauthorized auf geschützten Routen“Access-Tokens haben eine TTL von 15 Minuten. Nach Ablauf erneuert das Studio sie bei der nächsten Anfrage stillschweigend über den opaken Refresh-Token (30 Tage, gleitend). Wenn Sie gehäuft 401-Fehler sehen:
- Refresh-Token ebenfalls abgelaufen → Benutzer muss sich neu anmelden
- Uhrzeitabweichung zwischen Client und Server > 30 s → NTP auf dem Host korrigieren
- Refresh-Token widerrufen (anderswo abgemeldet) → neu anmelden
Postgres-Migration schlägt fehl
Abschnitt betitelt „Postgres-Migration schlägt fehl“docker compose exec backend goose -dir /app/migrations \ postgres "$DATABASE_URL" statusFalls goose nicht mehr synchron ist (eine Migration wurde manuell angewendet oder ein vorheriger Lauf ist mitten in der Migration abgestürzt), können Sie:
# See the stategoose -dir migrations postgres "$DATABASE_URL" status
# Force to a known version (CAREFUL — does not run the SQL)goose -dir migrations postgres "$DATABASE_URL" versiongoose -dir migrations postgres "$DATABASE_URL" up-by-oneBei einer komplett beschädigten Entwicklungs-DB: löschen und neu anlegen:
docker compose down postgresdocker volume rm commentary_postgres-datadocker compose up -d postgres backendKommentator-Kiosk zeigt „keine Berechtigung” für das Mikrofon
Abschnitt betitelt „Kommentator-Kiosk zeigt „keine Berechtigung” für das Mikrofon“Der Browser hat den Mikrofonzugriff blockiert. Der Kiosk funktioniert nur mit
Chrome (nutzt AudioContext.sinkId für das Routing des Ausgabegeräts). In Chrome:
- Auf das Schloss-Symbol in der Adressleiste klicken
- Website-Einstellungen → Mikrofon → Zulassen
- Seite neu laden
Prüfen Sie unter macOS / Windows zusätzlich die Mikrofonberechtigung für Chrome auf Betriebssystemebene.
Caddy erhält kein TLS-Zertifikat
Abschnitt betitelt „Caddy erhält kein TLS-Zertifikat“docker compose logs caddy | grep -i acmeTypische Probleme:
- Port 80 blockiert oder bereits von einem anderen Dienst belegt (Caddy benötigt :80 für HTTP-01)
- DNS ist noch nicht propagiert — 5 Minuten warten, dann
docker compose restart caddy - Rate-Limit bei Let’s Encrypt erreicht (5 Zertifikate pro Domain pro Woche) —
warten oder vorübergehend den Staging-Endpunkt via
acme_ca https://acme-staging-v02.api.letsencrypt.org/directoryim Caddyfile verwenden
Immer noch blockiert?
Abschnitt betitelt „Immer noch blockiert?“Eröffnen Sie ein Issue mit der Ausgabe von:
docker compose psdocker compose logs --tail=100 backend caddy livekitEntfernen Sie alle Secrets, bevor Sie die Ausgabe veröffentlichen.