Ir para o conteúdo

Issabel WebRTC / WSS (Lorentz Webphone)

Habilita softphone no navegador via SIP sobre WebSocket. O endereço público é wss://wss.orbitall.app/ws. O Caddy termina o TLS e entrega HTTP em 127.0.0.1:8086. A porta 8089 é o TLS do próprio Asterisk: se o proxy ou o navegador falam com ela, o socket fecha com código 1006.

Portas necessárias

Porta Protocolo Serviço Expor?
443 TCP Caddy, inclusive wss.orbitall.app Sim
8086 TCP HTTP interno do Asterisk (/ws) Não — só localhost
8089 TCP TLS do Asterisk Não como caminho do navegador
10000–10100 UDP RTP / mídia WebRTC Sim (já usado pelo Issabel)
5060 UDP/TCP SIP clássico (troncos/ramais legado) Sim

Não expor: 5038 (AMI), 8086 e 8088. Nesta VPS a 8088 é do Apache. O painel do PABX entra por https://pbx.orbitall.app/ (Caddy até 127.0.0.1:8445), com o Host público preservado. Sem isso o Issabel descarta o POST de grupo e tronco.

Pré-requisitos

  • Issabel rodando (issabel-prod, hostnet)
  • ISSABEL_SIP_EXTERNAL_ADDRESS = IP público da VPS no .env
  • Módulos Asterisk: res_http_websocket, res_pjsip

Deploy automatizado

cd ~/omnichannel/lorentz-vps-stack
cp .env.example .env   # ajustar ISSABEL_SIP_EXTERNAL_ADDRESS

# Config Asterisk. Na VPS os ramais WebRTC de operação são 5001–5005.
./scripts/configure-issabel-wss.sh --extension 5001

O script: 1. Gera certificado TLS em /etc/asterisk/keys/ (se ausente) 2. Aplica http_custom.conf, pjsip_transport_custom.conf, endpoint WebRTC 3. Habilita ICE/STUN em rtp_custom.conf 4. Recarrega módulos HTTP WebSocket e PJSIP

Templates

Arquivo Destino no container
config/templates/asterisk/http_custom.conf.template /etc/asterisk/http_custom.conf
config/templates/asterisk/pjsip_transport_custom.conf.template /etc/asterisk/pjsip_transport_custom.conf
config/templates/asterisk/pjsip.endpoint.webrtc.conf.template /etc/asterisk/pjsip.endpoint.webrtc.conf

Configuração Softphone 008

Arquivo JSON servido ao webphone (ver lorentz-webphone/packages/008/web/cfgLorentz008.json ou http://IP:8081/cfgLorentz008.json no container):

{
  "sipUri": "sip:1001@SEU_IP_PUBLICO",
  "sipPassword": "SenhaForte1001",
  "sipUser": "1001",
  "wsUri": "wss://wss.orbitall.app/ws",
  "lorentz": {
    "enabled": true,
    "apiBaseUrl": "https://supervisor:8080/api/v1/agent",
    "token": "JWT_DO_AGENTE"
  }
}

Validação

# HTTP interno escutando. O navegador não fala com esta porta.
ss -tln | grep 8086

# Status Asterisk: bind em 127.0.0.1:8086 e TLS em 8089
docker exec issabel-prod asterisk -rx "http show status"

# Handshake público. Precisa do protocolo sip e a resposta é HTTP 101.
curl -sI -H 'Connection: Upgrade' -H 'Upgrade: websocket' \
  -H 'Sec-WebSocket-Version: 13' -H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' \
  -H 'Sec-WebSocket-Protocol: sip' \
  https://wss.orbitall.app/ws

Certificado TLS em produção

Certificado autoassinado exige exceção no browser. Para produção:

  1. Obter Let's Encrypt para o domínio do PBX
  2. Copiar para /etc/asterisk/keys/:
  3. fullchain.pem → asterisk.pem
  4. privkey.pem → asterisk.key
  5. asterisk -rx "module reload res_http_websocket.so"

Integração com Lorentz CTI

O WSS cobre apenas a voz. Pausa, qualificação e consulta de contato usam a API Web Agent do Supervisor (ver supervisor/api/docs/WEB_AGENT_API.md e lorentz-webphone/docs/integracao-lorentz.md).

Ordem de subida (atualizada)

  1. SQL Server
  2. Issabel (+ AMI + WSS)
  3. LorentzCTI (+ API web agent — futuro)
  4. Supervisor
  5. Softphone 008 (yarn build-web → Nginx)

Troubleshooting

Sintoma Causa provável Ação
Navegador fecha o WebSocket com código 1006 O proxy apontou para o TLS 8089, ou o HTTP 8086 não está no ar Caddy em 127.0.0.1:8086 e ./scripts/configure-issabel-wss.sh
Registro SIP falha Endpoint/senha incorretos pjsip show endpoint 1001
Sem áudio RTP bloqueado ou rtpend acima de 10100 rtp show settings tem de terminar em 10100. O Issabel grava a faixa em rtp_additional.conf antes de rtp_custom.conf, e a primeira atribuição vale. bash scripts/apply-mobile-voz.sh
Celular não confia no certificado; o ajuste mostra wss://127.0.0.1:8445 O proxy entrega o Issabel nesse host e o provisionamento copiou HTTP_HOST O WebSocket do aparelho fica em wss no nome público, porta 443
Certificado inválido TLS autoassinado Cert válido ou exceção no browser
One-way audio NAT/externip errado Conferir ISSABEL_SIP_EXTERNAL_ADDRESS