# LiveKit 시그널링(wss) 리버스 프록시 — 도커 컨테이너 nginx 용 참조 설정 # # 사용법: # 1) 이 파일을 운영 nginx 의 conf.d 에 복사: nginx.livekit.conf (.example 제거) # 2) <도메인> / 인증서 경로를 실제 값으로 치환 # 3) nginx 컨테이너를 base compose 의 외부 `proxy` 네트워크에 join (아래 주석 참고) # 4) docker compose ... exec nginx nginx -s reload (또는 컨테이너 재기동) # # 전제(자세한 내용: livekit/DEPLOY.md 4·4-1장): # - LiveKit 컨테이너는 `selfhost-livekit` 프로파일로 기동되어 `proxy` 네트워크에 있다. # - nginx 컨테이너도 같은 `proxy` 네트워크에 있어야 `livekit` 이름이 해석된다. # (호스트 설치형 nginx 라면 docker-compose 의 livekit 7880 을 ports 로 publish 한 뒤 # proxy_pass 를 http://127.0.0.1:7880 으로 바꾼다.) # - 미디어(RTC: 7881/tcp, 7882/udp)는 이 프록시를 거치지 않고 서버 공인 IP 로 직접 통신한다. # HTTP → HTTPS 강제 리다이렉트 (Let's Encrypt 갱신 경로는 통과) server { listen 80; server_name livekit.<도메인>; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } # 시그널링(wss) 종단 → LiveKit 7880 server { listen 443 ssl; http2 on; server_name livekit.<도메인>; # 이 서브도메인용 인증서 (certbot 등으로 발급) ssl_certificate /etc/letsencrypt/live/livekit.<도메인>/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/livekit.<도메인>/privkey.pem; # 도커 내장 DNS — `livekit` 업스트림을 런타임에 해석해 부팅 순서 의존을 제거한다. # (이 줄과 변수 proxy_pass 가 없으면 livekit 컨테이너가 늦게 뜰 때 nginx 가 부팅 실패한다.) resolver 127.0.0.11 valid=30s; location / { set $lk http://livekit:7880; # 변수로 받아 런타임 해석 proxy_pass $lk; # WebSocket 업그레이드 (시그널링) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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; # TLS 종단이므로 백엔드에 https 알림 # 장수명 WebSocket 유지 proxy_read_timeout 600s; proxy_send_timeout 600s; } } # ───────────────────────────────────────────────────────────────────────────── # nginx 컨테이너를 `proxy` 네트워크에 연결하는 예 (운영 nginx 의 compose 발췌): # # services: # nginx: # # ... # networks: # - proxy # base compose 의 external proxy 네트워크 # networks: # proxy: # external: true # ─────────────────────────────────────────────────────────────────────────────