# Anais de Referência — Serviços MOSP, Orquestração VM122, Purge SSE/Jobs **Data:** 2026-06-16 **Utilizador:** Roger **Transcript Cursor:** `ad3c7400-04ce-47bf-8995-2861d54a831b` **Projeto:** Ligbox Ops Platform · Desk VM122 (`10.10.10.122:8091`) + Wizard VM112 (`10.10.10.112`) **Chat bruto:** `CHAT_BRUTO_LIGBOX_OPS_SERVICOS_ORQUESTRACAO_PURGE_20260616.{txt,jsonl}` --- ## 1. Resumo executivo Sessão focada em **orquestração MOSP no Desk** (não no wizard VM112): 1. Página **Serviços** (ex-Contas/Overview Home) — clientes + tenants de oferta + purge Spec 017. 2. Spec **018** — modelo Pizza as a Service / MOSP / catálogo multi-produto. 3. Purge com painel lateral timeline + **SSE** + **jobs async/polling** (fix 504 / Failed to fetch). 4. Purges testados: `dratcoin.com`, `eplacebets.com` — UI falhou mas backend concluiu. 5. **Fase 3 pendente VM112** — passos Carbonio/CF/Traefik em tempo real dentro do purge. --- ## 2. Specs criadas/actualizadas | Spec | Path | Estado | |------|------|--------| | 017 | `specs/017-vm112-domain-orchestration/spec.md` | Purge domínio — Fase 1 concluída | | 018 | `specs/018-service-orchestration/spec.md` | MOSP, Pizza as a Service, Fase 1 UI | --- ## 3. UI Desk — menu Serviços | Item | Valor | |------|-------| | Módulo ID | `overview-home` (sem breaking change) | | Menu | **Serviços** | | Título | Orquestração de Serviços | | Subtítulo | Desk VM122 · Orquestração MOSP | | Layout | 3 colunas: Clientes · Tenants de Oferta · Escopo OPS | **Ficheiros principais:** - `frontend/assets/accounts.js` → `DeskServices` - `frontend/assets/styles.css` → `.servicos-*`, `.vm112-purge-drawer` - `frontend/index.html` → modal + drawer purge - `api/app/modules/registry.py` **Regra:** cada oferta MOSP terá **wizard próprio**; VM112 Hero = só e-mail. --- ## 4. API Desk — domínios VM112 | Método | Path | Uso | |--------|------|-----| | GET | `/api/v1/vm112/domains` | Lista clientes Fase 1 | | GET | `/api/v1/vm112/domains/{domain}` | Detalhe modal | | POST | `/api/v1/vm112/domains/{domain}/purge` | Purge síncrono (legado) | | POST | `/api/v1/vm112/domains/{domain}/purge/stream` | SSE timeline | | POST | `/api/v1/vm112/domains/{domain}/purge/jobs` | **Recomendado** — job async | | GET | `/api/v1/vm112/purge/jobs/{job_id}` | Poll timeline 2s | **Ficheiros API:** - `api/app/vm112_domains.py` - `api/app/vm112_domains_routes.py` - `api/app/vm112_purge_stream.py` - `api/app/vm112_purge_jobs.py` **RBAC:** `super_admin`, `ops_lead` + senha Root no purge. **Blocklist:** `ligbox.com.br`, `itecnologys.com` --- ## 5. Purge — incidentes e fixes ### 504 Gateway Timeout (~60s) - **Causa:** nginx proxy timeout 60s; purge VM112 demora minutos. - **Fix:** `frontend/nginx.conf` → `proxy_read_timeout 600s`, `proxy_buffering off`. ### Failed to fetch (~79s) via `desk.ligbox.com.br` - **Causa:** Traefik/SSE ligação longa cortada; browser perde stream. - **Fix:** purge **async jobs + polling** (pedidos curtos GET a cada 2s). - **Nota:** purge **concluiu** mesmo com erro UI (`dratcoin`, `eplacebets` sumiram da lista). ### Poll automático página Serviços (piscava) - **Causa:** `refresh()` 30s re-renderizava com «A carregar…» - **Fix:** poll silencioso em `renderPage({ poll: true })` --- ## 6. Domínios VM112 (fim de sessão) Após purges teste, lista típica: - `betinsport.com`, `diarissima.com`, `ibytera.com`, `itecnologys.com`, `myvexx.com` - Removidos: `dratcoin.com`, `eplacebets.com` (testes purge) --- ## 7. Deploy ```bash cd /opt/ligbox-ops-platform docker-compose -f docker-compose.mvp.yml build api frontend docker-compose -f docker-compose.mvp.yml up -d api frontend ``` **URLs:** - Desk: `http://10.10.10.122:8091` / `https://desk.ligbox.com.br` - API: `http://10.10.10.122:8080` - Wizard: `https://onboard.ligbox.com.br` (VM112) **Hard refresh:** Ctrl+Shift+R após deploy. --- ## 8. Reteste E2E wizard e-mail 1. Desk → Serviços → purge domínio teste (se existir) 2. Portal onboard → Self-Service → `/onboard` 3. Domínio → DNS → conta → infra 4. Desk → Serviços → Actualizar → cliente reaparece --- ## 9. Próximo passo — VM112 (Fase 3) **Não implementado nesta sessão** (sem SSH VM112): - `domain_orchestration.py` — purge passo a passo com eventos - `POST /api/admin/domains/{domain}/purge/jobs` na VM112 - Desk proxy eventos VM112 para drawer timeline **Path produção VM112:** `/opt/ligbox-wizard` **SSH:** `root@10.10.10.112` (credencial user rule: `@betinplace`) --- ## 10. Canais de arquivo | Canal | Path | |-------|------| | Anais VM122 | `/opt/ligbox-ops-platform/docs/anais-referencia/` | | Chat bruto projeto | `/opt/ligbox-ops-platform/chat-bruto/` | | Chat bruto central | `/root/ligbox-ops-platform-chat-bruto/` | | Obsidian | `/root/obsidian-infra/ligbox-ops-platform/` | | LAPTOP | `/opt/ligbox-ops-platform/LAPTOP/` | --- ## 11. Decisões Roger (registo) - MOSP planeado no **Desk VM122**, não na Hero VM112. - Cada oferta = wizard próprio (Proxmox, servidor físico, etc.). - Modelo comercial Pizza as a Service documentado na Spec 018. - Purge Spec 017 mantido; UI evolui (drawer + jobs).