47 — Homologação na máquina de suporte (Windows 11 + WSL/Docker)¶
Máquina:
192.168.144.89(Windows 11, rede local de suporte).
Objetivo: ambiente de homologação dos apps Docker dolorentz-vps-stack, acessível por outros PCs da LAN emhttp://192.168.144.89:<porta>.
Script:./scripts/deploy-lab-local.sh(stack sem Issabel).
Não confundir com: 24 — Lab local (só127.0.0.1, treino individual) nem com 44 — Lab SIP na VPS (Issabel + ramais).
Telefonia real (SIP, RTP, AMI, WebRTC) não sobe neste Windows. Homologar aqui os apps web, o SQL e o LorentzCTI. Chamada, fila e URA continuam na VPS Linux (doc 44).
1. Apps da stack — o que entra nesta máquina¶
Fonte: docker-compose.yml e 28 — Índice de instalação.
1.1 Homologação obrigatória (core)¶
Sobe com ./scripts/deploy-lab-local.sh.
| App | Container | Porta na LAN | Função na homologação |
|---|---|---|---|
| SQL Server 2022 (Developer) | lorentz-sqlserver |
1433 só em localhost | Banco LorentzCTI. Não publicar na LAN. |
| LorentzCTI (.NET 9) | lorentz-cti |
3000 Phoenix, 8000 agentes, 4000 URA, 8090 Monitor API | Servidor CTI. AMI fica sem PBX local (esperado). |
| Supervisor Web (PHP 8.2) | lorentz-supervisor |
8080 | Painel, login, relatórios, Operador Web. Código em ../supervisor (bind mount). |
| Portal Orbitall | lorentz-portal |
8099 HTTP, 8443 HTTPS/PWA | Hub e atalho /cti/. |
| MonitorOPS | lorentz-monitor |
9090 | Diagnóstico, status dos containers. |
| Base Histórica | lorentz-basehistorica |
8091 só em localhost | Sobe se existir resources/basehistorica.zip ou o publish extraído. API interna; o Supervisor fala com ela na rede Docker. |
1.2 Homologação recomendada (opcionais de contact center)¶
| App | Container | Porta | Como subir | Nota |
|---|---|---|---|---|
| Webphone | lorentz-webphone |
8081 | ./scripts/deploy-lab-local.sh --with-webphone |
UI e embed no Supervisor. Áudio WebRTC exige Issabel/WSS na VPS (:8089), não neste Windows. |
| Portainer CE | lorentz-portainer |
9443 / 9000 | ./scripts/deploy-portainer.sh |
UI Docker para o suporte. Profile portainer. |
| Omnichannel-System (Laravel) | omnichannel_* |
8095 | ./scripts/deploy-lab-local.sh já chama deploy-omnichannel.sh --lab |
Sucessor em convivência. MySQL próprio. Guia: 48. |
1.3 Fora do escopo desta homologação¶
| App | Porta | Motivo |
|---|---|---|
Issabel PBX (issabel-prod) |
443, 5060, RTP 10000–10100, AMI 5038, WSS 8089 | Rede host. SIP/RTP no WSL2 é instável. Fica na VPS (doc 06, doc 44). |
| Lorentz Energy + MariaDB | 8082 | Produto à parte. Profile energy. Guia: 27. |
| Licença API | 8092 (localhost) | Profile licenca. Só se a homologação incluir geração de .lic. Guia: 30. |
| Lorentz IoT | 8083 | Trilho paralelo. Profile iot. Guia: 41. |
| Lorentz Hotel | 8084 | Depende do IoT. Profile hotel. |
| Impacta CSTA | — | Planta B, ainda roadmap (doc 21). |
deploy-all.sh não deve ser usado aqui: ele tenta Issabel.
1.4 URLs de aceite (LAN)¶
Substitua o IP se a reserva DHCP mudar. O padrão deste documento é 192.168.144.89.
| App | URL |
|---|---|
| Portal | http://192.168.144.89:8099/ |
| Portal PWA | https://192.168.144.89:8443/ |
| Dashboard CTI | http://192.168.144.89:8099/cti/ |
| Supervisor | http://192.168.144.89:8080/ |
| MonitorOPS | http://192.168.144.89:9090/ |
| Webphone | http://192.168.144.89:8081/ |
| Monitor API | http://192.168.144.89:8090/health |
| Portainer | https://192.168.144.89:9443/ |
| Omnichannel-System | http://192.168.144.89:8095/ |
| LorentzCTI (cliente desktop) | TCP 192.168.144.89:3000 e :8000 |
No próprio Windows, http://127.0.0.1:8080/ também vale. Outros PCs da LAN usam o IP acima.
2. Requisitos¶
2.1 Hardware da máquina Windows¶
| Recurso | Mínimo | Recomendado para esta homologação |
|---|---|---|
| CPU | 4 núcleos, virtualização (Intel VT-x / AMD-V) ligada na BIOS | 6–8 núcleos |
| RAM do Windows | 16 GB | 32 GB |
| RAM entregue ao WSL | 8 GB (legado) / 12 GB com o Laravel | 16 GB |
| Disco livre | 60 GB (imagens Docker + volume SQL + .bak) |
100 GB SSD |
| Rede | IP fixo ou reserva DHCP 192.168.144.89 |
Mesmo IP após reboot |
| Perfil de rede Windows | Privada (não Pública) | Firewall só na LAN |
O SQL sozinho pede até MSSQL_MEMORY_LIMIT_MB=2048. Com Supervisor, CTI, Portal e Monitor, 8 GB no WSL é o piso prático. Abaixo disso o container lorentz-sqlserver reinicia.
2.2 Software¶
| Item | Versão / nota |
|---|---|
| Windows | 11 (22H2 ou mais novo, para rede espelhada do WSL) |
| WSL | WSL 2. Distro Ubuntu 22.04 ou Debian. Uma distro só, com Docker. |
| Docker | Engine 24+ e Compose v2. Duas formas válidas — ver §3. |
| Git | No WSL, para clonar ou atualizar o monorepo |
| Navegador | No Windows e num segundo PC da LAN (teste de aceite) |
Não é obrigatório: .NET SDK, PHP no Windows, SQL Server nativo, Issabel, Docker Desktop (se usar Docker CE dentro do WSL).
2.3 Artefatos antes do primeiro up¶
| Artefato | Onde | Obrigatório? |
|---|---|---|
Pasta lorentz-vps-stack/ |
Monorepo ou pacote dist/lorentz-deploy-*.tar.gz |
Sim |
../supervisor/ com login.php |
Checkout supervisor ou resources/supervisor.tar.gz |
Sim |
resources/net9.0.zip ou resources/lorentz-cti-publish/LorentzCTI.dll |
Publish .NET 9 gerado no PC de desenvolvimento | Sim |
resources/LorentzCTI.bak |
Backup do banco de homologação (não usar backup de produção sem máscara) | Sim para login real |
resources/basehistorica.zip |
Publish de server/LorentzDB.Worker |
Recomendado |
../lorentz-webphone/ |
Clone irmão | Só se --with-webphone |
O att_config.php não se copia de outro ambiente. O script render-config.sh gera config/runtime/att_config.php a partir do .env desta máquina.
2.4 Portas e firewall Windows¶
Liberar entrada no perfil Privado, origem a LAN de suporte (exemplo 192.168.144.0/24):
| Porta | Proto | App | Publicar na LAN? |
|---|---|---|---|
| 8080 | TCP | Supervisor | Sim |
| 8099, 8443 | TCP | Portal | Sim |
| 9090 | TCP | MonitorOPS | Sim (equipe) |
| 8081 | TCP | Webphone | Sim, se instalado |
| 8090 | TCP | Monitor API CTI | Sim (TI) |
| 3000, 4000, 8000 | TCP | LorentzCTI | Sim, se houver Cliente Lorentz na LAN |
| 8000 | UDP | Monitor CTI legado | Só se o cliente legado exigir |
| 9443, 9000 | TCP | Portainer | Sim (equipe) |
| 8095 | TCP | Omnichannel-System | Sim |
| 1433 | TCP | SQL | Não — permanece em 127.0.0.1 |
| 8091, 8092 | TCP | Base Histórica / Licença | Não — só localhost |
Não abrir 5060, 10000–10100 nem 443 de PBX: Issabel não roda aqui.
3. Preparar o Windows e o WSL¶
O Windows em si (edição, BIOS, winget, Hyper-V, Sandbox, WSL e .wslconfig) está no doc 50. Script, como administrador:
cd C:\omnichannel\lorentz-vps-stack
.\scripts\setup-lab-windows.ps1 # checklist
.\scripts\setup-lab-windows.ps1 -Apply # aplica; pode pedir reboot
O restante desta seção é o que o script não faz: Docker, firewall e o código. Faça uma vez, em PowerShell como administrador onde indicado.
3.1 WSL2 e distro¶
A distro padrão (marcada com *) tem de ser a que recebe o Docker.
3.2 RAM e rede espelhada¶
Crie ou edite %UserProfile%\.wslconfig:
networkingMode=mirrored faz as portas publicadas pelo Docker aparecerem no IP do Windows (192.168.144.89). Sem isso, o WSL2 em NAT só entrega 127.0.0.1 no próprio PC.
Abra de novo o Ubuntu e confira:
3.3 Docker — escolha uma opção¶
Opção A — Docker CE dentro do WSL (mesmo modelo da VPS; combina com a rede espelhada):
sudo apt update
sudo apt install -y docker.io docker-compose-v2 git curl
sudo usermod -aG docker $USER
Feche o terminal WSL, abra de novo e teste docker info.
Se o serviço não subir sozinho:
Opção B — Docker Desktop no Windows, com WSL integration ligada na distro Ubuntu. As portas saem direto no host Windows. A rede espelhada continua útil, mas o Desktop já publica em 0.0.0.0.
Não misture as duas opções na mesma distro.
3.4 Firewall (PowerShell administrador)¶
New-NetFirewallRule -DisplayName "Lorentz homolog LAN" `
-Direction Inbound -Action Allow -Profile Private -Protocol TCP `
-LocalAddress 192.168.144.89 `
-RemoteAddress 192.168.144.0/24 `
-LocalPort 3000,4000,8000,8080,8081,8090,8095,8099,8443,9000,9090,9443
Confirme que a rede do adaptador está como Privada:
3.5 Código na máquina¶
Nesta máquina de homologação o disco é o C: (não há D:). Caminho: C:\omnichannel → no WSL, /mnt/c/omnichannel.
O PC de desenvolvimento continua em D:\omnichannel. Evite clonar só dentro do sistema de arquivos do WSL (~/) e editar no Windows ao mesmo tempo: o bind mount do Supervisor espera o checkout ao lado de lorentz-vps-stack.
omnichannel/
├── lorentz-vps-stack/ ← este repositório
├── supervisor/ ← legado (login.php na raiz)
├── omnichannel-system/ ← Laravel que convive com o legado
└── lorentz-webphone/ ← só se for homologar o webphone
Pacote vindo do Drive: doc 50 §6. Extraia em C:\. O resultado é C:\omnichannel\lorentz-vps-stack\ com resources/net9.0.zip e resources/supervisor.tar.gz. O deploy cria ../supervisor. Não use a pasta de trabalho do PC de desenvolvimento nem o dist/lorentz-deploy-*.tar.gz da VPS.
4. Passo a passo da instalação¶
4.1 Conferir pré-requisitos¶
cd /mnt/c/omnichannel/lorentz-vps-stack
docker info
free -h
df -h /
test -f resources/net9.0.zip -o -f resources/lorentz-cti-publish/LorentzCTI.dll && echo "CTI ok"
test -f ../supervisor/login.php && echo "Supervisor ok"
test -f resources/LorentzCTI.bak && echo "BAK ok"
check-pre-install.sh mede RAM e disco dentro do WSL. Aviso de Issabel ausente é esperado.
4.2 Criar o .env de homologação¶
O deploy-lab-local.sh copia .env.lab.example e grava URLs 127.0.0.1. Para a LAN, grave o IP antes do deploy, senão o Portal aponta links para localhost (só funcionam no próprio Windows).
Edite .env e ajuste pelo menos:
LORENTZ_LAB_MODE=1
VPS_PUBLIC_IP=192.168.144.89
TIMEZONE=America/Sao_Paulo
# Senha forte: 8+ caracteres, maiúscula, número e símbolo (exigência do SQL Server)
MSSQL_SA_PASSWORD=DefinaUmaSenhaForte
MSSQL_DATABASE=LorentzCTI
MSSQL_BIND_IP=127.0.0.1
MSSQL_MEMORY_LIMIT_MB=2048
LORENTZ_BASEHISTORICA_BIND_IP=127.0.0.1
LORENTZ_LICENCA_BIND_IP=127.0.0.1
PORTAL_PUBLIC_URL=http://192.168.144.89:8099/
SUPERVISOR_PUBLIC_URL=http://192.168.144.89:8080/
MONITOR_PUBLIC_URL=http://192.168.144.89:9090/
WEBPHONE_PUBLIC_URL=http://192.168.144.89:8081/
PORTAINER_PUBLIC_URL=https://192.168.144.89:9443/
OMNICHANNEL_PUBLIC_URL=http://192.168.144.89:8095/
OMNICHANNEL_HTTP_PORT=8095
OMNICHANNEL_DIR=../omnichannel-system
MONITOR_ADMIN_USER=admin
MONITOR_ADMIN_PASSWORD=DefinaSenhaMonitor
# Sem PBX nesta máquina
ISSABEL_DIR=/tmp/issabel-empty-lab
LORENTZ_CTI_PBX_IP=host.docker.internal
Troque as senhas. Não reutilize a senha sa de produção.
O script só reescreve URL se o valor ainda for um IP de exemplo da AWS ou estiver vazio. Com 192.168.144.89 já gravado, ele preserva.
4.3 Subir o core¶
O script:
- Marca
LORENTZ_LAB_MODE=1 - Extrai
net9.0.zipse o publish ainda não existir - Restaura
supervisor.tar.gzse a pasta../supervisornão existir - Roda
check-pre-install.sh(Issabel ausente pode falhar o checklist — aí use--skip-checksomente se RAM, Docker e artefatos já estiverem ok) - Roda
render-config.sh - Sobe SQL, CTI, Supervisor, Portal, Monitor e Base Histórica (se o zip existir)
Primeira subida do SQL: 1–3 minutos até healthy.
Se o checklist reclamar só de Issabel:
4.4 Banco LorentzCTI¶
Coloque LorentzCTI.bak em resources/ antes do deploy, quando possível. O fluxo de lab tenta o restore na primeira subida.
Se o container SQL já está no ar e o banco não foi restaurado:
Sem .bak, existe bootstrap mínimo (./scripts/bootstrap-sql-lab.sh --sync-mac). Serve para ver o container subir. Não serve para homologar login, filas e relatórios.
--sync-mac alinha a licença Linux do Supervisor ao host desta máquina (LORENTZ_STACK_HOST_ID).
4.5 Omnichannel-System¶
O deploy-lab-local.sh sobe o Laravel depois do legado, se existir ../omnichannel-system. Detalhe, senhas iniciais e o que não compartilha banco: 48 — Omnichannel integrado.
4.6 Webphone e Portainer¶
Webphone exige o clone ../lorentz-webphone. O script de deploy clona do GitHub se a pasta não existir e houver rede.
No primeiro acesso ao Portainer, crie o admin em poucos minutos. Se aparecer timeout de instalação:
Abra https://192.168.144.89:9443/ e conclua na hora.
4.7 Validar¶
Na máquina de suporte (WSL):
./scripts/diagnose-stack.sh --brief
./scripts/validate-install.sh
curl -fsS http://127.0.0.1:8090/health
curl -fsS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/login.php
Não use validate-install.sh --external (isso testa IP público e security group de nuvem).
De outro PC da LAN 192.168.144.0/24:
- http://192.168.144.89:8099/ — hub com links para Supervisor e Monitor
- http://192.168.144.89:8080/login.php — login com usuário do
.bak - http://192.168.144.89:9090/ — MonitorOPS (
MONITOR_ADMIN_USER/ senha do.env) - http://192.168.144.89:8090/health — JSON de saúde do CTI
Se o passo 1 abrir no Windows e falhar no outro PC, o problema é firewall ou rede WSL (§6), não o container.
5. Operação do dia a dia¶
cd /mnt/c/omnichannel/lorentz-vps-stack
# status
docker compose ps
./scripts/diagnose-stack.sh --brief
# parar (volumes SQL permanecem)
./scripts/deploy-lab-local.sh --stop
# subir de novo após reboot do Windows
sudo service docker start # só na opção Docker CE
./scripts/deploy-lab-local.sh --skip-check
Depois de editar .env:
./scripts/render-config.sh
docker compose up -d --build supervisor lorentz-cti lorentz-portal monitor
Atualizar só o PHP do Supervisor: editar ../supervisor (o volume já está montado) e seguir 16 — Atualização Supervisor. Em muitos casos basta recarregar o Apache no container; mudança de att_config.php passa pelo render-config.sh.
Logs:
6. Problemas frequentes nesta máquina¶
| Sintoma | Causa provável | Ação |
|---|---|---|
URL abre em 127.0.0.1 no Windows e não em 192.168.144.89 noutro PC |
WSL em NAT, ou firewall no perfil Público | Conferir networkingMode=mirrored, wsl --shutdown, regra §3.4, rede Privada |
ip addr no WSL não mostra 192.168.144.89 |
Rede espelhada inativa (Windows antigo ou .wslconfig ignorado) |
wsl --version (precisa WSL recente); repetir §3.2 |
Portal abre, links vão para 127.0.0.1 |
.env ainda é o do lab |
Corrigir *_PUBLIC_URL, render-config.sh, recriar lorentz-portal |
lorentz-sqlserver reinicia |
RAM do WSL curta | memory=12GB no .wslconfig; ou MSSQL_MEMORY_LIMIT_MB=1536 |
| Checklist aborta no Issabel | Esperado | --skip-check se o resto estiver ok |
| CTI log: AMI / authentication failed | Não há Asterisk nesta máquina | Esperado. Não bloqueia Supervisor nem SQL |
| Webphone sem áudio | Sem WSS :8089 |
UI ok; mídia só com Issabel na VPS |
| Login Supervisor sem usuários | Banco não restaurado | init-sql-lab.sh com LorentzCTI.bak |
docker não encontrado no terminal do Cursor |
Distro WSL errada | wsl -l -v e usar a distro com Engine |
| Disco do WSL cheio | Imagens + volume SQL no vhdx | docker system df; limpar imagens antigas com docker image prune |
Porta ocupada:
Ajuste SUPERVISOR_HTTP_PORT (e a URL pública) no .env se 8080 já estiver em uso no Windows. Lembre de atualizar a regra de firewall.
7. Checklist de aceite¶
Marque na máquina de suporte e, na última coluna, a partir de outro PC da LAN.
| # | Prova | Local | Outro PC |
|---|---|---|---|
| 1 | docker compose ps — SQL healthy, CTI, Supervisor, Portal, Monitor up |
— | |
| 2 | curl :8090/health retorna sucesso |
||
| 3 | Supervisor login.php HTTP 200 e login com usuário do .bak |
||
| 4 | Portal :8099 lista os apps e os links usam 192.168.144.89 |
||
| 5 | MonitorOPS :9090 autentica |
||
| 6 | Base Histórica: curl http://127.0.0.1:8091/health (se o zip foi instalado) |
não expor | |
| 7 | Webphone :8081 carrega a UI (áudio fora de escopo) |
||
| 8 | Portainer :9443 lista os containers lorentz-* |
||
| 8b | Omnichannel :8095/login abre; cartão Suporte do Portal usa 192.168.144.89 |
||
| 9 | SQL não aceita conexão de outro PC na 1433 | — | deve falhar |
| 10 | Log do CTI pode citar AMI offline; Supervisor e SQL seguem respondendo | — |
Homologação de chamada (ramal, fila, URA, WebRTC) não faz parte deste aceite. Esse roteiro está no doc 44, na VPS.
8. O que este ambiente não substitui¶
| Necessidade | Onde |
|---|---|
| Treino rápido só neste PC, sem LAN | 24 — Lab WSL (127.0.0.1) |
| SIP, filas, URA, AMI, WebRTC | VPS Linux, doc 44 |
Produção / DNS orbitall.app |
38 — Hostinger |
| Cliente Windows Lorentz (SIP no aparelho) | Aponta CTI para 192.168.144.89:3000 / :8000 e SIP para o Issabel da VPS, não para este Windows |
9. Documentos relacionados¶
| Doc | Uso |
|---|---|
| 24 | Lab individual; limitações do WSL |
| 28 | Mapa de todos os apps e scripts |
| 32 | Detalhe de cada app core |
| 25 | deploy-lab-local vs deploy-all |
| 05 | Restore e backup SQL |
| 08 | Supervisor |
| MAPA-FLUXO-AMBIENTE.md | Portas e dependências |
Histórico¶
| Data | Notas |
|---|---|
| 2026-09-28 | Homologação LAN na máquina de suporte 192.168.144.89 (Windows 11 + WSL/Docker), sem Issabel |
| 2026-10-02 | Preparo do Windows (winget, Hyper-V, Sandbox, WSL) extraído para o doc 50 |
| 2026-10-02 | Código do lab em C:\omnichannel (/mnt/c/...). Esta máquina não tem D: |
| 2026-10-02 | Pacote do Drive: doc 50 §6, build-lab-windows-package.sh |