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:
- Obter Let's Encrypt para o domínio do PBX
- Copiar para
/etc/asterisk/keys/: fullchain.pem→asterisk.pemprivkey.pem→asterisk.keyasterisk -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)¶
- SQL Server
- Issabel (+ AMI + WSS)
- LorentzCTI (+ API web agent — futuro)
- Supervisor
- 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 |