# Configure seus próprios servidores STUN e TURN para o Discourse Voice

**URL:** <https://meta.discourse.org/t/configure-your-own-stun-and-turn-servers-for-discourse-voice/414625>\
**Category:** Integrations\
**Tags:** voice\
**Created:** [Outubro 13, 2026, 10:44pm UTC](https://meta.discourse.org/t/configure-your-own-stun-and-turn-servers-for-discourse-voice/414625 "2026-10-13T22:44:52Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)\
**Post date:** [Outubro 13, 2026, 10:44pm UTC](https://meta.discourse.org/t/configure-your-own-stun-and-turn-servers-for-discourse-voice/414625/1 "2026-10-13T22:44:52Z")

</div>

> ⚠ Se você é hospedado por nós, isso já está pré-configurado no seu site. Este guia é para administradores que hospedam o Discourse por conta própria.

O Discourse Voice usa WebRTC para chamadas de voz e vídeo. Ele vem com servidores STUN públicos para ajudar os participantes a se conectarem diretamente. Os administradores podem substituir esses servidores e adicionar TURN para suportar redes em que as conexões diretas falham.

**Para um servidor dedicado à sua comunidade, recomendamos o uso de TURN com autenticação por segredo compartilhado e uma configuração STUN vazia.** Isso fornece descoberta de endereço público e um fallback de retransmissão sem distribuir uma senha TURN permanente.

Este guia se aplica às chamadas ponto a ponto do Voice. Salas que usam o LiveKit utilizam a própria configuração ICE/TURN do LiveKit. [Saiba mais sobre a configuração do LiveKit no Voice](https://github.com/discourse/discourse/blob/main/plugins/voice/docs/livekit.md).

## O que STUN e TURN fazem?

- **STUN** ajuda um navegador a descobrir seu endereço IP e porta públicos para que ele possa tentar uma conexão direta.
- **TURN** retransmite a mídia quando uma conexão direta não pode ser estabelecida.

Uma alocação TURN autenticada também retorna o endereço público do navegador. O WebRTC pode usar isso como um **candidato reflexivo do servidor** , fornecendo o benefício de descoberta de endereço do STUN sem um servidor STUN separado. [Especificação do TURN](https://www.rfc-editor.org/rfc/rfc8656.html#section-7.2).

Com o TURN por segredo compartilhado configurado, o Voice permite tanto conexões diretas quanto retransmitidas, mesmo quando sua configuração STUN está vazia. **Configurar apenas servidores TURN não força todas as chamadas a passarem pela retransmissão.** [Configuração ICE do Voice](https://github.com/discourse/discourse/blob/main/plugins/voice/lib/voice/ice_config.rb).

## 1. Prepare um servidor TURN

Você pode usar um serviço de TURN gerenciado que suporte **autenticação de segredo compartilhado da API REST do TURN** ou executar o [coturn](https://github.com/coturn/coturn) por conta própria.

Para uma configuração auto-hospedada, prepare:

- Um servidor com um endereço IP público e largura de banda suficiente para chamadas retransmitidas.
- Um nome de host, como `turn.example.com`, apontando diretamente para esse servidor.
- Acesso de firewall para o listener TURN e a faixa de portas UDP de retransmissão.
- Um certificado válido, se você oferecer TURN via TLS.

Os navegadores dos participantes se conectam diretamente ao TURN. Um proxy reverso HTTP comum ou um proxy de CDN não pode transportar tráfego TURN.

### Exemplo de configuração do coturn

Gere um segredo aleatório:

```bash
openssl rand -hex 32

```

Mantenha o resultado em sigilo. Você inserirá o mesmo valor no coturn e no Discourse.

Em um servidor com um IP público diretamente atribuído, use o seguinte como ponto de partida em `/etc/turnserver.conf`:

```ini
listening-port=3478

fingerprint
realm=turn.example.com

use-auth-secret
static-auth-secret=SUBSTITUA_PELO_SEU_SEGREDO_ALEATORIO

# Desativa solicitações STUN independentes.
# Alocações TURN autenticadas ainda retornam o endereço público do cliente.
no-stun

min-port=49152
max-port=65535

no-multicast-peers

# Este exemplo inicia sem TLS.
no-tls
no-dtls

```

Substitua o nome de host e o segredo, proteja o arquivo de configuração e reinicie o coturn. Remova qualquer configuração conflitante de `no-auth` ou `user=` estática. O modo de segredo compartilhado do Coturn ativa o mecanismo de autenticação de que ele precisa internamente. [Referência de configuração do Coturn](https://github.com/coturn/coturn/blob/master/examples/etc/turnserver.conf).

Permita o tráfego de entrada para:

| Porta | Protocolo | Finalidade |
| --- | --- | --- |
| `3478` | UDP e TCP | Conexões do navegador ao TURN |
| `49152–65535` | UDP | Mídia retransmitida |

Permita também o tráfego de saída correspondente. A faixa de retransmissão deve corresponder a `min-port` e `max-port`.

Se o servidor estiver atrás de NAT, configure o mapeamento `external-ip=IP_PUBLICO/IP_PRIVADO` do coturn e encaminhe as portas do listener e de retransmissão. As portas de retransmissão devem manter seus números através do NAT. [Opções de implantação do Coturn](https://github.com/coturn/coturn/wiki/turnserver).

### Adicione TLS para redes restritivas

TURN via TLS fornece outra opção de conexão para participantes cujas redes bloqueiam UDP.

Remova `no-tls` e configure:

```ini
tls-listening-port=5349
cert=/caminho/para/fullchain.pem
pkey=/caminho/para/privkey.pem

```

Abra a porta `5349/TCP`, garanta que o coturn possa ler o certificado e a chave, e reinicie-o após as renovações de certificado.

Você pode usar `443/TCP` em vez disso, se essa porta estiver disponível no servidor TURN. Isso pode ajudar em redes restritivas, embora algumas redes também inspecionem e bloqueiem tráfego não-HTTP na porta 443. A faixa de retransmissão UDP ainda é necessária quando os navegadores acessam o TURN via TCP ou TLS. [Documentação do servidor Coturn](https://github.com/coturn/coturn/wiki/turnserver).

## 2. Configure o Discourse

Em **Administração → Configurações** , pesquise por estas configurações de Voice:

| Configuração | Valor |
| --- | --- |
| `voice_stun_servers` | Vazio — remova as entradas padrão |
| `voice_turn_secret` | O valor usado para `static-auth-secret` do coturn |
| `voice_turn_secret_servers` | Seus URIs TURN, separados por `|` |
| `voice_turn_servers` | Vazio |
| `voice_turn_username` | Vazio |
| `voice_turn_credential` | Vazio |

Para a configuração acima, insira o seguinte em `voice_turn_secret_servers`:

```plaintext
turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp

```

Se você ativou o TLS, adicione seu endpoint:

```plaintext
turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp|turns:turn.example.com:5349?transport=tcp

```

Use URIs `turn:` e `turns:`, sem `//`. Liste apenas endpoints que seu servidor realmente suporta.

A lista `voice_turn_secret_servers` usa credenciais geradas a partir do segredo compartilhado. A lista separada `voice_turn_servers` usa um nome de usuário e senha fixos. [Definições de configuração do Voice](https://github.com/discourse/discourse/blob/main/plugins/voice/config/locales/server.en.yml).

Salve as configurações e, em seguida, peça aos participantes para saírem e entrarem novamente nas chamadas para obter a nova configuração.

## 3. Verifique a configuração

Teste com dois participantes em redes diferentes, como banda larga residencial e dados móveis. Confirme que o áudio funciona em ambas as direções e, em seguida, teste vídeo e compartilhamento de tela.

Em navegadores Chromium, abra `chrome://webrtc-internals` antes de entrar:

- Um candidato `srflx` representa um endereço público descoberto.
- Um candidato `relay` representa um retransmissor TURN disponível.
- O par de candidatos selecionado mostra a conexão que está efetivamente transportando a mídia.

**Uma chamada direta bem-sucedida não prova que a retransmissão funciona.** Teste também de uma rede que exija TURN ou use um cliente de teste WebRTC com `iceTransportPolicy: "relay"` e credenciais temporárias.

Verifique os logs do coturn para alocações autenticadas bem-sucedidas. Solicitações sem credenciais válidas não devem obter uma alocação de retransmissão. Um desafio de autenticação `401` inicial é normal; falhas repetidas de autenticação precisam de investigação.

## Mantenha o servidor dedicado à sua comunidade

O segredo compartilhado permanece no Discourse e no servidor TURN. Os participantes recebem credenciais temporárias em vez disso. O Voice atualmente gera credenciais válidas para criar alocações por 12 horas; uma alocação estabelecida pode continuar enquanto for renovada. [Geração de credenciais do Voice](https://github.com/discourse/discourse/blob/main/plugins/voice/lib/voice/ice_config.rb).

Isso impede um retransmissor aberto anônimo, mas as credenciais TURN não estão vinculadas a uma origem de navegador: um participante pode copiar e reutilizar suas credenciais temporárias. Para limitar o abuso:

- Restrinja o acesso ao Voice aos grupos pretendidos.
- Monitore a largura de banda de retransmissão e as contagens de alocação.
- Defina cotas de alocação e limites de largura de banda do coturn apropriados para a sua comunidade.
- Bloqueie o acesso de retransmissão a destinos privados, link-local e outros destinos internos acessíveis a partir do host TURN.
- Mantenha o coturn atualizado e rotacione o segredo compartilhado se ele for exposto.

Use um segredo dedicado para esta implantação do Discourse. Com `no-stun` ativado, o servidor também para de oferecer o serviço STUN independente anônimo. [Autenticação e controles de acesso do Coturn](https://github.com/coturn/coturn/blob/master/README.turnserver).

## Alternativas

### Substituir apenas os servidores STUN públicos

Defina `voice_stun_servers` para seus próprios URIs STUN, separados por `|`:

```plaintext
stun:stun.example.com:3478

```

Deixe as configurações TURN vazias se você não precisar de retransmissão. O STUN sozinho não pode fazer com que as chamadas funcionem em todas as redes. Um servidor coturn configurado com `no-stun` não pode atender a este endpoint.

### Usar TURN com nome de usuário e senha fixos

Se seu provedor não suportar autenticação por segredo compartilhado, configure `voice_turn_servers`, `voice_turn_username` e `voice_turn_credential`. Deixe as configurações de segredo compartilhado vazias.

Os participantes recebem essas credenciais fixas, o que as torna mais fáceis de reutilizar fora do seu site. Além disso, o Voice atualmente força conexões de retransmissão quando servidores TURN estáticos são configurados e a lista STUN está vazia. Prefira a autenticação por segredo compartilhado quando seu provedor a suportar. [Configuração ICE do Voice](https://github.com/discourse/discourse/blob/main/plugins/voice/lib/voice/ice_config.rb).
