39 — Aprendizado Hostinger (Orbitall): lab → produção
Consolidação operacional da VPS Hostinger srv1869007 (2.25.92.168) — jul/2026.
O lab WSL/Docker valida compose e fluxos; produção Hostinger exige cutover DNS/TLS, paths Linux, SQL real e módulos web completos.
Campo
Valor
Host
srv1869007
IP público
2.25.92.168
IP AWS (arquivo)
3.93.232.33 — nunca em *_PUBLIC_URL
Stack
/root/omnichannel/lorentz-vps-stack
Symlink atalho
/root/lorentz → stack (cuidado: ../supervisor relativo ao symlink)
Supervisor código
/root/omnichannel/supervisor (+ symlink /root/supervisor)
Issabel
issabel-prod, ISSABEL_DIR=/root/issabel4-docker
Edge
Caddy :80/:443 · Issabel HTTPS interno :8445
SSH
root + id_ed25519artesdosul
Guia fases: 38-vps-hostinger-passo-a-passo.md · Migração: 37-migracao-vps-aws-hostinger.md .
0. Lab vs Hostinger — o que o lab não cobre
Área
Lab (típico)
Produção Hostinger (o que pegou)
TLS
HTTP local / self-signed aceito
HSTS + LE obrigatório; Issabel na 443 bloqueia tudo
URLs
127.0.0.1:portas
*.orbitall.app; .env com duplicata AWS vence no source
Paths Compose
../supervisor resolve certo
Via /root/lorentz symlink → monta /root/supervisor vazio
PHP / SQL
Windows ou driver já ajustado
ADOdb≠adodb5; mssql legado → mssqlnative+TrustServerCertificate
SQL data
.bak no lab
Esquecer restore = Supervisor/CTI quebrados
Módulo cliente
Branch completa
cliente/cliente/ aninhado sem index.php → 403/502
Edge admin
Aberto
EDGE_ADMIN_CIDRS + Portainer CSRF (TRUSTED_ORIGINS)
Opcionais
Às vezes skip
Energy sobe sem import-energy-db.sh → tabelas ausentes
Lição: depois do deploy-stack / deploy-all, rodar o checklist cutover §1 abaixo antes de liberar usuários.
1. Checklist cutover (ordem obrigatória)
Execute na VPS após DNS A → IP Hostinger:
cd /root/omnichannel/lorentz-vps-stack # use path real, não só o symlink
#
Passo
Comando / check
1
DNS
dig +short orbitall.app A → 2.25.92.168
2
.env URLs únicas
Só um bloco *_PUBLIC_URL=https://…orbitall.app/; zero 3.93.232.33
3
Supervisor bind
test -f ../supervisor/login.php e readlink -f ../supervisor sob o path do compose
4
Symlink seguro
ln -sfn /root/omnichannel/supervisor /root/supervisor
5
Fase C Issabel
./scripts/apply-phase-c-issabel-https.sh → :8445 OK, :443 livre
6
Fase D Caddy
./scripts/apply-phase-d-caddy.sh → LE em orbitall.app
7
Render + restart
./scripts/render-config.sh + docker compose up -d core
8
SQL
./scripts/init-sql-lab.sh --sync-mac --force-restore (com resources/LorentzCTI.bak)
9
Supervisor PHP
adodb5→ADOdb; getParmWkr antes de att_phoenix; ew_Connect = mssqlnative
10
Cliente
test -f ../supervisor/cliente/index.php (plano, não cliente/cliente/)
11
Tema PBX
./scripts/deploy-issabel-theme.sh
12
Opcionais
webphone / energy(+import DB) / licenca / portainer
13
Allowlist TI
EDGE_ADMIN_CIDRS + ./scripts/render-edge-config.sh + reload Caddy
14
Portainer CSRF
PORTAINER_TRUSTED_ORIGINS=portainer.orbitall.app (hostname, CE 2.39.x)
15
Validar
./scripts/diagnose-stack.sh --brief --ports · ./scripts/validate-install.sh
2. Incidentes resolvidos (catálogo)
2.1 TLS — ERR_CERT_AUTHORITY_INVALID + HSTS
Sintoma
Brave bloqueia https://orbitall.app/ / subdomínios; HSTS impede “continuar”
Causa
Issabel httpd na :443 (cert CN=buildkitsandbox); Caddy inativo
Fix
Fase C (ISSABEL_HTTPS_PORT=8445) → Fase D (apply-phase-d-caddy.sh)
Nota
Só mudar .env não move o Apache. Reload: httpd -k graceful (não apachectl)
2.2 Apps ainda no IP AWS 3.93.232.33
Sintoma
Portal/att_config/cfgLorentz008 abrem http://3.93.…
Causa
*_PUBLIC_URL duplicada no .env (bloco final vence no source)
Fix
Uma definição HTTPS no topo; render-config.sh; restart portal/supervisor
Check
grep -r '3\.93\.232\.33' .env config/runtime/ \|\| echo OK
2.3 Supervisor — login.php 404
Causa
Compose via /root/lorentz montou /root/supervisor vazio
Fix
ln -sfn /root/omnichannel/supervisor /root/supervisor + docker compose up -d --force-recreate supervisor a partir de /root/omnichannel/lorentz-vps-stack
2.4 Supervisor — Fatal getParmWkr / adodb5
Causa
Linux case-sensitive (ADOdb vs adodb5); getParmWkr ausente + include circular userfn9↔att_phoenix
Fix
Symlink adodb5→ADOdb (entrypoint); definir getParmWkr antes de include att_phoenix.php; $_GET['x'] ?? '' no top-level phoenix
2.5 Supervisor — Missing extension / mssql / raiseErrorFn on null
Causa
ADONewConnection("mssql") (extensão removida no PHP 8); imagem tem sqlsrv
Fix
mssqlnative + TrustServerCertificate (igual branch oncoguia-vps / commit ce4aea0)
2.6 Supervisor — schema / login sem dados
Fix
./scripts/init-sql-lab.sh --sync-mac --force-restore com resources/LorentzCTI.bak
Nota
Apelido admin do .env pode não existir no .bak (usar usuários do restore)
2.7 /cliente/ — 403 / 502
Causa
Árvore aninhada cliente/cliente/index.php sem cliente/index.php
Fix
Estrutura plana (ref. oncoguia-vps); portal aponta para /cliente/
OK
Sem sessão → 302 login.php?cmd=webfone
2.8 Energy — tabelas ausentes
Causa
Profile up sem dump
Fix
./scripts/deploy-lorentz-energy.sh + ./scripts/import-energy-db.sh --force
2.9 Portainer — HTTP 403 (Caddy) vs Forbidden - origin invalid
Sintoma
Causa
Fix
403 no browser
IP fora de EDGE_ADMIN_CIDRS
Incluir IP/32 (SSH/rodapé portal) + reload Caddy
origin invalid
CSRF atrás do proxy
PORTAINER_TRUSTED_ORIGINS=portainer.orbitall.app (sem https:// na CE 2.39.x ) + recreate
Environment
—
Docker → Socket (docker.sock já montado)
2.10 Issabel tema
./scripts/deploy-issabel-theme.sh # lorentzpbx
3. Correção TLS (detalhe)
Pré-requisito DNS
dig +short orbitall.app A
# esperado: 2.25.92.168
hPanel / UFW: TCP 80 (ACME) e 443 .
Fase C
./scripts/apply-phase-c-issabel-https.sh
# se D-Bus: docker exec issabel-prod httpd -k graceful
ss -tlnp | grep -E ':443|:8445'
curl -skI https://127.0.0.1:8445/ | head -3
Fase D
./scripts/apply-phase-d-caddy.sh
systemctl is-active caddy
echo | openssl s_client -connect orbitall.app:443 -servername orbitall.app 2 >/dev/null \
| openssl x509 -noout -issuer -subject
# issuer Let's Encrypt
HSTS no Brave
brave://net-internals/#hsts → Delete orbitall.app (após LE válido).
4. URLs canônicas
App
URL
Portal
https://orbitall.app/
Supervisor
https://supervisor.orbitall.app/
Operador Web
https://supervisor.orbitall.app/cliente/
PBX
https://pbx.orbitall.app/
MonitorOPS
https://monitorops.orbitall.app/
Webphone
https://phone.orbitall.app/
Energy
https://energy.orbitall.app/
Portainer
https://portainer.orbitall.app/
WSS
wss://wss.orbitall.app/ws
ISSABEL_SIP_EXTERNAL_ADDRESS=orbitall.app
5. Estado pós-cutover (2026-07-31)
Core / edge
Item
Status
Caddy + LE
OK
Issabel :8445 + tema lorentzpbx
OK
SQL LorentzCTI restore .bak
OK
Portal / Monitor / CTI / Base Histórica
OK (containers)
Supervisor login + /cliente/ 302
OK
.env / runtime sem IP AWS
OK
EDGE_ADMIN_CIDRS
177.67.207.138/32 + 131.221.88.31/32
Opcionais
App
Status
Webphone
deployado
Energy + MariaDB import
OK
Licença API
OK
Portainer + TRUSTED_ORIGINS
OK (allowlist)
Ainda validar em operação
Item
Ação
AMI CTI ↔ Asterisk
docker logs lorentz-cti sem Authentication failed; manager_custom.conf
Login Supervisor (usuário do .bak)
Testar agente real + licença se necessário
MONITOR_ADMIN_PASSWORD
Trocar default
validate-install.sh --external
Após AMI OK
Autostart
sudo ./scripts/install-systemd-stack.sh
6. Armadilhas de path (Compose + symlink)
/root/lorentz → /root/omnichannel/lorentz-vps-stack
docker compose com project dir = /root/lorentz
../supervisor → /root/supervisor ❌ se pasta vazia
→ deve ser symlink para /root/omnichannel/supervisor
Regra: sempre cd /root/omnichannel/lorentz-vps-stack para compose; manter ln -sfn /root/omnichannel/supervisor /root/supervisor.
Entrypoint Supervisor já cria adodb5 → ADOdb se faltar.
7. Comandos rápidos
cd /root/omnichannel/lorentz-vps-stack
./scripts/diagnose-stack.sh --brief --ports
grep -rE '3\.93\.232\.33' .env config/runtime/ || echo 'OK sem IP AWS'
test -f /root/omnichannel/supervisor/login.php && test -f /root/omnichannel/supervisor/cliente/index.php && echo 'supervisor+cliente OK'
systemctl is-active caddy
curl -sI https://orbitall.app/ | head -3
curl -sI https://supervisor.orbitall.app/login.php | head -3
curl -sI https://supervisor.orbitall.app/cliente/ | head -5 # 302 esperado
docker ps --format 'table {{.Names}}\t{{.Status}}'
Túnel MonitorOPS:
ssh -i "C:\Users\aragu\.ssh\id_ed25519artesdosul" -L 9090 : 127 . 0 . 0 . 1 : 9090 root @2 . 25 . 92 . 168
8. Scripts tocados / padrões a preservar
Script / arquivo
Aprendizado
apply-phase-c-issabel-https.sh
httpd -k graceful no container
apply-phase-d-caddy.sh
LE + proxy
render-config.sh / .env
Sem *_PUBLIC_URL duplicada
render-edge-config.sh
EDGE_ADMIN_CIDRS
docker-compose.yml portainer
TRUSTED_ORIGINS / --trusted-origins
docker/supervisor/docker-entrypoint.sh
Symlink adodb5
supervisor/phpfn9.php
mssqlnative + TrustServerCertificate
supervisor/userfn9.php
getParmWkr antes de att_phoenix
init-sql-lab.sh
Restore .bak obrigatório em VPS nova
import-energy-db.sh
Após deploy Energy
deploy-issabel-theme.sh
Tema lorentzpbx
Referências