Skip to main content

Phase 77 β€” Jitsi Meet + Coturn TURN Server

Deployed: 2026-07-26 | Version: Jitsi Meet v2.21.0 | Namespace: collab

Jitsi Meet provides self-hosted video conferencing. The platform deploys the full Jitsi stack (web, prosody, jicofo, JVB) plus a Coturn TURN server on AWS Lightsail for clients that cannot establish direct peer connections.


Architecture​

External caller
β”‚
β”œβ”€ IPv6 capable β†’ JVB direct (star-kitten:10000/udp, hostNetwork)
β”‚
└─ IPv4 only β†’ TURN relay β†’ Lightsail turn-coturn-eu (54.171.137.209:3478)
β†’ Coturn relays via Tailscale β†’ star-kitten 10.0.0.8:10000

JVB (Jitsi Video Bridge) β€” star-kitten (10.0.0.8), hostNetwork, UDP 10000
Prosody / Jicofo / Web β€” collab namespace, nginx ingress
Coturn TURN server β€” AWS Lightsail eu-west-1 (turn-coturn-eu, 54.171.137.209)
ComponentDetail
Helm chartjitsi-contrib/jitsi-meet
JVB nodestar-kitten (10.0.0.8) β€” pinned via nodeSelector
JVB portUDP 10000, hostNetwork (bypasses kube-proxy)
AuthAuthentik forward auth (provider pk 15, forward_single)
Coturnv4.5, AWS Lightsail nano_3_0, 54.171.137.209:3478, relay 49152–65535
Tailscaleturn-coturn-eu (100.77.251.92) β€” relay path to JVB via mesh
DNSturn.devandre.sbs β†’ 54.171.137.209 (unproxied, UDP)
TURN credentialsVault platform/jitsi.coturn-secret β†’ prosody extraEnvFrom
SSH key~/.ssh/lightsail-turn-coturn.pem (on Mac)
Cost$5/month AWS Lightsail, billed against AWS credit

IPv6 direct path fix (2026-07-28)​

SFR DS-Lite WAN blocks all inbound IPv4 at the AFTR carrier β€” Coturn IPv4 TURN relay cannot reach the JVB via the home network's public IPv4. Jitsi works for mobile/IPv6 callers via a direct IPv6 path:

Root cause: UFW on star-kitten had an empty ufw6-user-input chain (policy DROP) β€” packets arrived at the NIC but were dropped before reaching the JVB socket.

Fix applied:

# On star-kitten (persistent across reboots)
sudo ufw allow 10000/udp

SFR box IPv6 firewall rule added for JVB: jvb-v6 β†’ star-kitten fa75:a4ff:fef9:2fe9 UDP 10000.

Confirmed: SFR 5G phone (2a0d:e487:…) β†’ JVB IPv6 direct, DTLS 1.2 complete.


TURN server β€” AWS Lightsail (2026-08-01)​

IPv4 TURN relay is now fully operational via a dedicated Lightsail instance. SFR DS-Lite still blocks inbound IPv4 at the home network's AFTR, so Coturn runs externally with a public IPv4.

Why Lightsail over the controller: The controller's public IPv4 (37.65.57.112) is the SFR DS-Lite shared address β€” inbound IPv4 is blocked at the AFTR before it reaches the home router. No router-level fix is possible. Lightsail provides a dedicated public IPv4 outside the DS-Lite NAT.

Lightsail instance details​

ItemValue
Instanceturn-coturn-eu (eu-west-1a, nano_3_0)
OSUbuntu 22.04 LTS
Static IP54.171.137.209
Tailscale IP100.77.251.92
Relay portsUDP 49152–65535
Cost$5.00/month

Coturn config (/etc/turnserver.conf)​

listening-port=3478
listening-ip=0.0.0.0
external-ip=54.171.137.209
relay-ip=100.77.251.92
min-port=49152
max-port=65535
realm=devandre.sbs
use-auth-secret
static-auth-secret=<Vault platform/jitsi.coturn-secret>
log-file=/var/log/coturn/turnserver.log

Operations​

# SSH to TURN instance
ssh -i ~/.ssh/lightsail-turn-coturn.pem ubuntu@54.171.137.209

# Coturn status + logs
sudo systemctl status coturn
sudo tail -f /var/log/coturn/turnserver.log

# Restart
sudo systemctl restart coturn

# Tailscale status
sudo tailscale status

JVB pinned to star-kitten​

JVB uses hostNetwork: true β€” it binds directly to the node's UDP 10000. It must be pinned to the node with the correct firewall rules:

nodeSelector:
kubernetes.io/hostname: star-kitten

If star-kitten is NotReady, the JVB pod stays Pending and video calls fail.


Real-world skills demonstrated​

SkillIndustry context
hostNetwork for media trafficStandard for SFU/RTP bridges β€” avoids double NAT through kube-proxy
TURN server for NAT traversalRequired for any WebRTC deployment with non-cooperative NATs
IPv6 fallback pathCarrier-grade NAT (DS-Lite) is common in French ISPs β€” IPv6 direct is the only reliable path
Lightsail VPS for TURN relayCheap public IPv4 endpoint ($5/month) outside CGNAT β€” standard pattern for home-lab WebRTC
Tailscale mesh for relay routingTURN instance relays to JVB via Tailscale without exposing JVB directly to the internet
Authentik proxy for WebRTC appsForward auth that doesn't break WebSocket or long-polling connections