LiveKit oppsett: Docker-container for WebRTC (oppgave 11.1)

Legger til LiveKit som Docker-tjeneste for WebRTC-støtte.
Konfigurasjonen bruker livekit/livekit-server med signaling
proxyet gjennom Caddy på /livekit/*, og UDP 50000-50100 eksponert
direkte for WebRTC media-strømmer.

Endringer:
- docker-compose.yml: livekit-service (på /srv/synops/)
- livekit.yaml: server-konfig (på /srv/synops/config/livekit/)
- Caddy: /livekit/* route aktivert
- UFW: åpnet UDP 50000-50100 + TCP 7881
- maskinrommet-env.sh: LIVEKIT_URL/KEY/SECRET for Rust-API
- produksjon.md: oppdatert med LiveKit-detaljer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-17 22:54:50 +00:00
parent 82b733b865
commit 02fc38eb3d
3 changed files with 17 additions and 9 deletions

View file

@ -31,10 +31,12 @@ sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd systemctl restart sshd
# Brannmur: kun SSH, HTTP, HTTPS # Brannmur: SSH, HTTP, HTTPS + LiveKit WebRTC
ufw allow OpenSSH ufw allow OpenSSH
ufw allow 80/tcp ufw allow 80/tcp
ufw allow 443/tcp ufw allow 443/tcp
ufw allow 7881/tcp # LiveKit ICE/TCP fallback
ufw allow 50000:50100/udp # LiveKit WebRTC media
ufw enable ufw enable
``` ```
@ -168,7 +170,7 @@ Tjenestene startes i rekkefølge fordi noen avhenger av andre. Alle defineres i
# Denne seksjonen dokumenterer strukturen og viktige regler. # Denne seksjonen dokumenterer strukturen og viktige regler.
# REGLER: # REGLER:
# - Ingen "ports:" mot host UTENOM Caddy (80, 443) # - Ingen "ports:" mot host UTENOM Caddy (80, 443) og LiveKit (UDP 50000-50100, TCP 7881)
# - Alle tjenester på samme interne nettverk (sidelinja-net) # - Alle tjenester på samme interne nettverk (sidelinja-net)
# - Volumer bruker bind mounts til /srv/synops/ # - Volumer bruker bind mounts til /srv/synops/
# - .env-filen lastes automatisk av Docker Compose # - .env-filen lastes automatisk av Docker Compose
@ -208,10 +210,10 @@ sidelinja.org {
reverse_proxy spacetimedb:3000 reverse_proxy spacetimedb:3000
} }
# LiveKit (WebSocket upgrade) — aktiveres i fase 11 # LiveKit signaling (WebSocket upgrade)
# handle_path /livekit/* { handle_path /livekit/* {
# reverse_proxy livekit:7880 reverse_proxy livekit:7880
# } }
# Podcast media (statiske filer med byte-range support) # Podcast media (statiske filer med byte-range support)
handle_path /media/* { handle_path /media/* {
@ -477,5 +479,5 @@ ikke i produksjon.
- [ ] `https://synops.no` viser placeholder - [ ] `https://synops.no` viser placeholder
- [ ] `https://vegard.info` svarer - [ ] `https://vegard.info` svarer
- [ ] SpacetimeDB: WebSocket-tilkobling fra nettleser fungerer - [ ] SpacetimeDB: WebSocket-tilkobling fra nettleser fungerer
- [ ] LiveKit: Test-rom med video/lyd fungerer - [x] LiveKit: Container kjører, signaling proxyet via Caddy (verifisert 2026-03-17)
- [ ] Media: `curl -I https://sidelinja.org/media/podcast/test.mp3` returnerer `Accept-Ranges: bytes` - [ ] Media: `curl -I https://sidelinja.org/media/podcast/test.mp3` returnerer `Accept-Ranges: bytes`

View file

@ -11,6 +11,8 @@ container_ip() { docker inspect "$1" --format '{{range .NetworkSettings.Networks
PG_IP=$(container_ip sidelinja-postgres-1) PG_IP=$(container_ip sidelinja-postgres-1)
STDB_IP=$(container_ip sidelinja-spacetimedb-1) STDB_IP=$(container_ip sidelinja-spacetimedb-1)
WHISPER_IP=$(container_ip sidelinja-faster-whisper-1 2>/dev/null || echo "") WHISPER_IP=$(container_ip sidelinja-faster-whisper-1 2>/dev/null || echo "")
AI_GW_IP=$(container_ip sidelinja-ai-gateway-1 2>/dev/null || echo "")
LIVEKIT_IP=$(container_ip sidelinja-livekit-1 2>/dev/null || echo "")
cat > /tmp/maskinrommet.env <<EOF cat > /tmp/maskinrommet.env <<EOF
DATABASE_URL=postgres://$(read_env POSTGRES_USER):$(read_env POSTGRES_PASSWORD)@${PG_IP}:5432/synops DATABASE_URL=postgres://$(read_env POSTGRES_USER):$(read_env POSTGRES_PASSWORD)@${PG_IP}:5432/synops
@ -22,6 +24,11 @@ AUTHENTIK_CLIENT_ID=$(read_env AUTHENTIK_CLIENT_ID)
BIND_ADDR=0.0.0.0:3100 BIND_ADDR=0.0.0.0:3100
CAS_ROOT=/srv/synops/media/cas CAS_ROOT=/srv/synops/media/cas
WHISPER_URL=http://${WHISPER_IP:-localhost}:8000 WHISPER_URL=http://${WHISPER_IP:-localhost}:8000
AI_GATEWAY_URL=http://${AI_GW_IP:-localhost}:4000
LITELLM_MASTER_KEY=$(read_env LITELLM_MASTER_KEY)
LIVEKIT_URL=http://${LIVEKIT_IP:-localhost}:7880
LIVEKIT_API_KEY=$(read_env LIVEKIT_API_KEY)
LIVEKIT_API_SECRET=$(read_env LIVEKIT_API_SECRET)
PROJECT_DIR=/home/vegard/synops PROJECT_DIR=/home/vegard/synops
RUST_LOG=maskinrommet=debug,tower_http=debug RUST_LOG=maskinrommet=debug,tower_http=debug
EOF EOF

View file

@ -125,8 +125,7 @@ Uavhengige faser kan fortsatt plukkes.
## Fase 11: Produksjons-pipeline ## Fase 11: Produksjons-pipeline
- [~] 11.1 LiveKit oppsett: Docker-container for WebRTC. Ref: `docs/setup/produksjon.md`. - [x] 11.1 LiveKit oppsett: Docker-container for WebRTC. Ref: `docs/setup/produksjon.md`.
> Påbegynt: 2026-03-17T22:50
- [ ] 11.2 Sanntidslyd: kommunikasjonsnode med live-status → LiveKit-rom for deltakere. - [ ] 11.2 Sanntidslyd: kommunikasjonsnode med live-status → LiveKit-rom for deltakere.
- [ ] 11.3 Pruning-logikk: TTL per modalitet, signaler som forlenger levetid, disk-nødventil. - [ ] 11.3 Pruning-logikk: TTL per modalitet, signaler som forlenger levetid, disk-nødventil.
- [ ] 11.4 Podcast-RSS: samlings-node med publiserings-edges → generert RSS-feed. - [ ] 11.4 Podcast-RSS: samlings-node med publiserings-edges → generert RSS-feed.