Ir para o conteúdo

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

/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