# coturn — STUN+TURN relay for clients whose network can't reach JVB # directly. Hosted on the same node as JVB; hostNetwork: true so the # TURN listening ports bind on the public NIC. The TLS cert is the # same one cert-manager already issues for the jitsi-web Ingress — # we mount the jitsi-tls Secret as a volume. Watch out: when the cert # renews, this pod must be restarted to pick up the new file (the # weekly CronJob below handles that). # # Auth model: HMAC time-limited credentials. coturn validates with # `use-auth-secret` + `static-auth-secret=`; # Prosody hands out matching credentials per session via # mod_external_services. Both read the secret from the same k8s # Secret entry so they stay in lockstep. # # Port plan (mirrors required FritzBox forwards): # UDP 3479 STUN + TURN (cleartext) — 3478 is taken by an # OpenDesk-bundled Nextcloud-Talk TURN on this host, # same shift trick we used on JVB (10000 → 10001). # TCP 3479 TURN over TCP — first cleartext fallback # UDP 5349 TURN over DTLS # TCP 5349 TURN over TLS — works through most firewalls # UDP 50000-50100 relay range — actual media flows on these apiVersion: apps/v1 kind: Deployment metadata: name: coturn namespace: jitsi spec: replicas: 1 strategy: type: Recreate selector: matchLabels: { app: coturn } template: metadata: labels: { app: coturn } spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - name: coturn image: coturn/coturn:4.7-alpine # Inline-template the config so we can interpolate the env-var # secret without an extra ConfigMap-then-envsubst dance. command: ["/bin/sh", "-c"] args: - | set -eu cat > /tmp/turnserver.conf <