WEBRTC_TURN_SETUP
Este guia configura um servidor TURN com coturn para chamadas de áudio/vídeo do chat privado. O tráfego de mídia pode ser retransmitido pelo TURN quando a conexão direta (STUN) não funciona — por exemplo, usuários em redes/ISPs diferentes ou CGNAT.
Os frontends (Vue e Next) obtêm a lista de servidores ICE em GET /chat-privado/webrtc/ice-servers, que lê as variáveis abaixo do backend.
Variáveis no .env do backend
Adicione (ou edite) estas chaves no arquivo .env do backend (não no frontend):
WEBRTC_TURN_URLS
Não*
Uma ou mais URLs TURN, separadas por vírgula. Ex.: turn:turn.seudominio.com:3478 ou turn:203.0.113.10:3478
WEBRTC_TURN_USERNAME
Não*
Usuário configurado no coturn (user=... antes dos dois pontos)
WEBRTC_TURN_CREDENTIAL
Não*
Senha configurada no coturn (depois dos dois pontos em user=usuario:senha)
* As três devem existir juntas para o TURN ser incluído na resposta da API. Se alguma faltar, o backend continua respondendo só com STUN públicos (sem relay).
Opcional:
WEBRTC_ICE_SERVERS_JSON
JSON com array extra de objetos no formato RTCIceServer (mesclado após os STUN padrão). Use só se souber o que está fazendo.
Exemplos de .env (backend)
Só TURN em UDP/TCP 3478 (sem TLS):
WEBRTC_TURN_URLS=turn:turn.exemplo.com.br:3478
WEBRTC_TURN_USERNAME=zpro_turn
WEBRTC_TURN_CREDENTIAL=uma_senha_longa_e_aleatoriaTURN + TURNS (TLS na 5349), se o coturn estiver com certificado:
Importante: use o mesmo usuário e senha no coturn (user=zpro_turn:uma_senha_longa_e_aleatoria) e reinicie o processo Node (PM2/systemd) após alterar o .env.
1. Instalar coturn no Ubuntu
Ativar o serviço:
2. Configurar /etc/turnserver.conf
Edite o arquivo (ex.: sudo nano /etc/turnserver.conf) e ajuste ao seu ambiente.
Exemplo mínimo (credenciais estáticas — alinhado ao .env acima)
Substitua:
SEU_IP_PUBLICO— IP público da VPS (ou parIP_PUBLICO/IP_INTERNOse a VM estiver atrás de 1:1 NAT).exemplo.com.br— domínio ou nome lógico (camporealm).zpro_turneuma_senha_longa_e_aleatoria— iguais aWEBRTC_TURN_USERNAMEeWEBRTC_TURN_CREDENTIAL.
Se a VPS não tiver IP público direto na interface (NAT do provedor):
TLS (turns: na porta 5349)
Reinicie o coturn:
3. Firewall (UFW na VPS)
No painel da nuvem (security group / firewall), abra as mesmas portas.
4. DNS (recomendado)
Aponte um registro A (ou AAAA) para o subdomínio usado no TURN, ex.:
turn.exemplo.com.br→ IP público da VPS
Use esse nome em WEBRTC_TURN_URLS em vez do IP, se possível (facilita certificado TLS e mudanças de IP).
5. Verificação rápida
Página Trickle ICE: adicione um servidor TURN com o mesmo host, porta, usuário e senha do coturn e confira se aparecem candidatos relay.
Nos logs do coturn (
journalctl -u coturn -f) devem aparecer alocações quando houver chamada usando relay.
6. Reiniciar o backend
Após editar o .env do backend:
Referência no código
Montagem da lista ICE:
backend/src/utils/webrtcIceServersZPRO.tsRota HTTP:
GET /chat-privado/webrtc/ice-servers(autenticada)Frontends consomem essa rota e montam o
RTCPeerConnection
Segurança
Use senha forte e exclusiva para o usuário TURN.
Em produção, prefira TLS (
turns:) quando possível.Credenciais ficam somente no servidor (backend
.env); não coloque senha TURN em variáveisNEXT_PUBLIC_*no frontend.
Para credenciais temporárias por usuário (shared secret / REST do coturn), seria necessário estender o backend — este guia cobre o modo usuário/senha estático, que já é suportado pelas variáveis WEBRTC_TURN_*.
Isto foi útil?

