feat: edição de rotas de entrada, fix de 2 bugs reais no ESL, diagnóstico de NAT/áudio e softphone WebRTC (PHASE 65/66)

Três achados reportados pelo usuário numa mensagem só: (1) Rotas de Entrada
não tinha edição depois de criada — implementada no mesmo padrão de Filas;
(2) telas de Platform > Infraestrutura sempre davam "Timeout no ESL" nesta
VM — não era limitação permanente como o comentário antigo dizia, e sim
ESL_HOST=freeswitch (nome DNS que só existe dentro da rede do Docker) mais
um segundo bug independente (`show gateways as json` não é comando válido
nesta versão do FreeSWITCH); (3) ramal externo registrava mas sem áudio —
diagnosticado com contadores de pacote do iptables: a VM está atrás de um
roteador sem port-forward pra faixa de RTP, achado de infraestrutura de
rede, não bug de código.

Também integra o softphone WebRTC (handphone.js/OpenSIPS, já em produção):
código-fonte encontrado em git.falehandix.com.br/Handix/handphone-2.0,
patch mínimo pra aceitar o endereço do proxy em runtime (era build-time),
nova config global (Platform > Infraestrutura > Softphone WebRTC) e widget
na topbar do tenant que pega usuário/domínio/senha do ramal vinculado ao
agente logado.

Adiciona docs/QA_SETUP.md — runbook completo pra subir o ambiente do zero
numa máquina nova (Docker, migrations, seed, systemd), e completa o
.env.example que estava faltando a maioria das variáveis reais.

Testado ponta a ponta com Playwright: edição de rota (criar/editar/F5),
as 3 telas de Infraestrutura com dado real, e um tenant/ramal/agente de
teste criados na hora confirmando que o script do softphone recebe as
credenciais certas.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
2026-08-30 22:14:39 -03:00
parent a779a7e51f
commit 97ef8a6ba8
25 changed files with 1047 additions and 58 deletions

View File

@@ -99,12 +99,25 @@ services:
# uma chamada ativa seria latência/confiabilidade desnecessárias
# pra um prompt de poucos segundos.
- ./data/ivr-prompts:/ivr-prompts
# Event Socket (8021) NUNCA publicado — só alcançável por outros
# containers na rede interna do compose (agente.md secao 22).
# Event Socket (8021) NUNCA publicado pra REDE — só em loopback do
# próprio host (agente.md secao 22: "NÃO pública... acesso somente
# pela aplicação autorizada"). Achado real testando as telas de
# Infraestrutura (platform): o comentário original aqui dizia que
# elas SEMPRE falhariam nesta VM porque "apps/api roda fora do
# Docker" — isso estava incompleto. `apps/api` (systemd, no host)
# JÁ conseguia alcançar o IP do container na rede bridge sem nenhuma
# porta publicada (`docker inspect` + `/dev/tcp` confirmam: o HOST
# sempre alcança a rede bridge do Docker, só outras MÁQUINAS é que
# não). O bloqueio real era `ESL_HOST=freeswitch` — um nome DNS que
# só existe dentro da rede interna do Docker, nunca no resolver do
# host. `127.0.0.1:8021:8021` resolve isso sem abrir a porta pra
# ninguém além do próprio host — mesma garantia de segurança de
# antes, só que a aplicação autorizada agora alcança de verdade.
# SIP (5060) e RTP (16384-16584, range fixo no Dockerfile) publicados
# a partir da PHASE 54 — necessário pra registrar um softphone/telefone
# de fora da rede Docker (achado testando registro de verdade).
# pra rede a partir da PHASE 54 — necessário pra registrar um
# softphone/telefone de fora da rede Docker.
ports:
- "127.0.0.1:8021:8021"
- "5060:5060/udp"
- "5060:5060/tcp"
- "16384-16584:16384-16584/udp"