Ir para o conteúdo

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 do lorentz-vps-stack, acessível por outros PCs da LAN em http://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

wsl --install -d Ubuntu-22.04
wsl --set-default-version 2
wsl --set-default Ubuntu-22.04
wsl -l -v

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:

[wsl2]
memory=12GB
processors=4
swap=4GB
localhostForwarding=true
networkingMode=mirrored

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.

wsl --shutdown

Abra de novo o Ubuntu e confira:

ip -4 addr
# deve listar 192.168.144.89 (ou a interface espelhada do Windows)

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:

sudo service docker start

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:

Get-NetConnectionProfile

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
# dentro do WSL
cd /mnt/c/omnichannel/lorentz-vps-stack
chmod +x scripts/*.sh

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).

cp .env.lab.example .env

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

./scripts/deploy-lab-local.sh

O script:

  1. Marca LORENTZ_LAB_MODE=1
  2. Extrai net9.0.zip se o publish ainda não existir
  3. Restaura supervisor.tar.gz se a pasta ../supervisor não existir
  4. Roda check-pre-install.sh (Issabel ausente pode falhar o checklist — aí use --skip-check somente se RAM, Docker e artefatos já estiverem ok)
  5. Roda render-config.sh
  6. 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:

./scripts/deploy-lab-local.sh --skip-check

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:

./scripts/init-sql-lab.sh --sync-mac
docker compose restart lorentz-cti supervisor

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.

./scripts/deploy-omnichannel.sh --lab
curl -sI http://192.168.144.89:8095/login | head -5

4.6 Webphone e Portainer

./scripts/deploy-lab-local.sh --with-webphone
./scripts/deploy-portainer.sh

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:

docker restart lorentz-portainer

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:

  1. http://192.168.144.89:8099/ — hub com links para Supervisor e Monitor
  2. http://192.168.144.89:8080/login.php — login com usuário do .bak
  3. http://192.168.144.89:9090/ — MonitorOPS (MONITOR_ADMIN_USER / senha do .env)
  4. 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:

docker compose logs -f --tail 100 lorentz-cti
docker compose logs -f --tail 100 supervisor

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:

ss -tlnp | grep -E ':8080|:8099|:9090|:1433'

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