Feature Specification: Orquestração de Serviços — Cliente & Catálogo (018)
Criado: 2026-06-16
Solicitado por: Roger
Status: Fase 1 concluída (Desk VM122)
Wizard cliente: inalterado na VM112 — só e-mail (vm112-mail)
Prioridade: P1
Sistema: Desk VM122 (+ proxies VM112, futuro multi-wizard)
Módulo Desk: overview-home (nav Serviços)
Depende de: Spec 015 (módulos), Spec 017 (purge domínio VM112)
Resumo
A página Serviços substitui a visão estreita «Contas / lista de domínios» por um painel operacional estilo cPanel/WHM: o técnico sénior selecciona um cliente e vê tiles de serviços contratados ou disponíveis (e-mail tenant, servidor dedicado, firewall, cloud, Wazuh, site).
Fase 1 (esta entrega): UI e modelo conceptual no frontend; clientes derivados dos domínios VM112; apenas E-mail Tenant activo com purge Spec 017 intacto.
Fase 2: API Desk clients + service_instances em SQLite.
Fase 3: Registry de wizards por service_catalog.code e purge por instância.
Problema
| Hoje |
Necessidade |
| Lista plana de domínios |
Vista por cliente |
| Nome «Contas» ambíguo |
Serviços — escala para novos produtos |
| Purge acoplado à lista |
Purge no tile E-mail Tenant (Spec 017) |
| Um wizard (mail) |
Vários wizards futuros (firewall, cloud, Wazuh) |
Nomenclatura
| Camada |
Valor |
| ID módulo / view |
overview-home (sem breaking change) |
| Menu lateral |
Serviços |
| Título página |
Orquestração de Serviços |
| Subtítulo |
Clientes Ligbox — serviços activos, estado OPS e acções |
| JS global |
DeskServices (alias DeskAccounts para compat.) |
Fase 1 (esta entrega): UI e modelo conceptual no frontend; clientes derivados dos domínios VM112; apenas E-mail Tenant activo com purge Spec 017 intacto.
Fase 2: API Desk clients + service_instances em SQLite.
Fase 3: Registry de wizards por service_catalog.code e purge por instância.
Fase 4: Catálogo comercial completo — níveis «Pizza as a Service» + Managed Open Source.
Posicionamento Ligbox (MSP):
«Pegamos soluções open source e entregamos como serviço gerenciado — em cloud privada Ligbox, VPS dedicado ou infraestrutura local do cliente.»
Visão de oferta — «Pizza as a Service» (Roger, 2026)
A analogia Pizza as a Service descreve quem gere o quê entre cliente e provedor. Quanto mais camadas a Ligbox opera, mais «as a service» o produto é — e mais valor (e SLA) o cliente compra.
Legenda de responsabilidade (camadas da «pizza»)
| Camada (de baixo para cima) |
Equivalente técnico Ligbox |
| Eletricidade / Gás |
Datacenter, energia, link, Hetzner/host |
| Fogão |
Hypervisor — Proxmox VE, VMs, CTs |
| Fogo |
SO, rede, firewall base, hardening |
| Pizza (massa/base) |
Runtime — Docker, Nginx, Traefik, DB engine |
| Toppings |
Aplicação open source — Carbonio, Nextcloud, ERPNext |
| Bebidas |
Integrações — DNS, SSL, backup, monitoramento |
| Conversas |
Uso pelo cliente — utilizadores finais, dados de negócio |
Azul (cliente gere) · Laranja (Ligbox gere)
Nível 1 — Tradicional → Consultoria / Suporte sob demanda
Equivalente: «Feito em casa» — cliente gere tudo; Ligbox ajuda quando chamada.
| Gerido pelo cliente |
Oferecido pela Ligbox |
| Servidores físicos / on-prem |
Consultoria Linux |
| Rede |
Troubleshooting |
| Sistema operacional |
Instalação inicial |
| Banco de dados |
Treinamento técnico |
| Backup |
Auditoria de segurança |
| Aplicação |
Documentação |
| Segurança operacional |
— |
| Campo catálogo |
Valor |
delivery_model |
traditional |
code (ex.) |
consulting_hour, audit_security, linux_training |
| Stack típica |
Ubuntu Server, Debian, Proxmox VE (no lado do cliente) |
| Modelo comercial |
Hora técnica · pacote suporte mensal básico |
| Wizard Desk |
Não — ticket + assist takeover (Spec 010) |
| Tile UI |
«Suporte» — sem instância provisionada |
Nível 2 — IaaS → Infraestrutura gerenciada
Equivalente: «Leve e Asse» — Ligbox entrega infra pronta; cliente cuida da aplicação.
| Gerido pela Ligbox |
Gerido pelo cliente |
| VPS / Cloud |
Aplicação |
| Virtualização (Proxmox) |
Dados |
| Firewall (pfSense) |
Utilizadores da app |
| Backup do servidor |
— |
| Monitoramento 24/7 |
— |
| SO + hardening |
— |
| Campo catálogo |
Valor |
delivery_model |
iaas |
code (ex.) |
managed_vps, managed_backup, vpn_corporate, firewall, monitoring_host |
| Stack Ligbox |
Proxmox VE, Docker, Nginx, pfSense, Grafana, Prometheus |
| Modelo comercial |
Mensal fixo — ex. «Servidor Linux totalmente gerenciado» |
| Wizard Desk |
wizard-iaas-vps (futuro) — VM, IP, backup job |
| Tile UI |
Firewall, Cloud/VPS, Monitoring host — badge IaaS |
Ligbox hoje (parcial): regras Proxmox, pfSense WAN, VM112 como nó — encaixa neste nível para a camada «fogão+fogo».
Nível 3 — PaaS → Plataforma gerenciada
Equivalente: «Delivery» — ambiente pronto para deploy; cliente traz código/dados.
| Gerido pela Ligbox |
Gerido pelo cliente |
| Infraestrutura (IaaS) |
Código da aplicação |
| Banco de dados gerido |
Dados de negócio |
| Deploy / CI/CD |
— |
| Backup + SSL |
— |
| Escalabilidade |
— |
| Campo catálogo |
Valor |
delivery_model |
paas |
code (ex.) |
k8s_managed, postgres_managed, cicd_pipeline, api_hosting |
| Stack Ligbox |
Kubernetes, PostgreSQL, Redis, GitLab, Traefik |
| Modelo comercial |
Mensal por ambiente / por pipeline |
| Wizard Desk |
wizard-paas-k8s, wizard-paas-db (futuro) |
| Tile UI |
DevOps / CI/CD — badge PaaS |
Nível 4 — SaaS → Solução completa gerenciada
Equivalente: «Restaurante» — cliente só utiliza.
| Gerido pela Ligbox |
Gerido pelo cliente |
| Tudo (infra → app → users ops) |
Apenas uso — login, conteúdo, processos de negócio |
| Actualizações, segurança, backup |
— |
| Monitoramento, suporte SLA |
— |
| Campo catálogo |
Valor |
delivery_model |
saas |
code (ex.) |
email_tenant, erpnext, suitecrm, nextcloud, wiki_js, bitwarden, zammad |
| Modelo comercial |
Por utilizador/mês · mensal por domínio · tier SLA |
| Wizard Desk |
vm112-mail (e-mail) · wizards por produto (futuro) |
| Tile UI |
E-mail Tenant (activo Fase 1) — badge SaaS |
Ligbox hoje: E-mail Tenant (Carbonio + portal + DNS + Traefik) = SaaS / Managed Open Source — produto flagship.
Nível 5 — Managed Open Source Services (MOSP) — modelo ideal MSP
Camada comercial que a Ligbox deve priorizar: software open source operado pela Ligbox; cliente só consome.
| Serviço |
Tecnologia |
catalog.code |
Cobrança sugerida |
delivery_model |
| E-mail corporativo (tenant) |
Carbonio |
email_tenant |
mensal / domínio |
saas |
| E-mail dedicado |
Mailcow / VM dedicada |
mail_dedicated |
mensal / servidor |
saas |
| Cloud Storage |
Nextcloud |
nextcloud |
por utilizador |
saas |
| ERP |
ERPNext |
erpnext |
por utilizador |
saas |
| CRM |
SuiteCRM |
suitecrm |
por utilizador |
saas |
| Wiki corporativa |
Wiki.js |
wiki_js |
mensal |
saas |
| Password Manager |
Bitwarden |
bitwarden |
por utilizador |
saas |
| Helpdesk |
Zammad |
zammad |
mensal |
saas |
| Chat corporativo |
Mattermost |
mattermost |
mensal |
saas |
| Git privado |
Gitea |
gitea |
por utilizador |
saas |
| VPN empresarial |
WireGuard |
vpn_corporate |
por empresa |
iaas |
| Monitoramento |
Zabbix / Wazuh |
wazuh_domain, monitoring_host |
mensal |
iaas / saas |
| Backup |
Restic + MinIO |
backup_baas |
por GB |
iaas |
| Firewall |
pfSense |
firewall |
mensal |
iaas |
| Site / CMS |
ligbox-sites |
site_cms |
mensal |
saas |
Regra de produto: cada linha do catálogo tem delivery_model, managed_layers[] (quais camadas da pizza a Ligbox opera) e wizard_id quando provisionável.
Portfólio Ligbox — mapa completo (futuro)
Infraestrutura
| Produto |
Nível |
code |
Estado Desk |
| Linux Managed Server |
IaaS |
managed_vps |
Planeado |
| VPS Management |
IaaS |
cloud |
Tile «Em breve» |
| Backup as a Service |
IaaS |
backup_baas |
Planeado |
| Monitoring as a Service |
IaaS/SaaS |
monitoring_host |
Parcial (Grafana/Infra) |
Segurança
| Produto |
Nível |
code |
Estado Desk |
| Firewall as a Service |
IaaS |
firewall |
Tile «Em breve» |
| VPN as a Service |
IaaS |
vpn_corporate |
Planeado |
| Vulnerability Scanning |
Tradicional |
vuln_scan |
Planeado |
| Wazuh SOC por domínio |
SaaS |
wazuh_domain |
Tile «Em breve» + Infra 2 |
Aplicações open source (MOSP)
| Produto |
Nível |
code |
Estado Desk |
| E-mail Tenant |
SaaS |
email_tenant |
Activo (Spec 017 purge) |
| E-mail dedicado |
SaaS |
mail_dedicated |
Tile «Em breve» |
| Nextcloud |
SaaS |
nextcloud |
Planeado |
| ERP (ERPNext) |
SaaS |
erpnext |
Planeado |
| CRM (SuiteCRM) |
SaaS |
suitecrm |
Planeado |
| Site / CMS |
SaaS |
site_cms |
Derivado VM112 |
| Wiki.js |
SaaS |
wiki_js |
Planeado |
| Bitwarden |
SaaS |
bitwarden |
Planeado |
| Zammad |
SaaS |
zammad |
Planeado |
| Mattermost |
SaaS |
mattermost |
Planeado |
| Gitea |
SaaS |
gitea |
Planeado |
DevOps
| Produto |
Nível |
code |
Estado Desk |
| Docker Hosting |
PaaS |
docker_hosting |
Planeado |
| Kubernetes Hosting |
PaaS |
k8s_managed |
Planeado |
| CI/CD Pipeline |
PaaS |
cicd_pipeline |
Planeado |
Suporte transversal
| Produto |
Nível |
code |
Canal Desk |
| SLA empresarial |
Overlay |
sla_enterprise |
Tickets + SLA fields |
| Monitoramento 24/7 |
Overlay |
noc_24x7 |
Infra + alertas |
| Administração remota |
Tradicional |
remote_admin |
Assist takeover |
| Consultoria Linux |
Tradicional |
consulting_hour |
Tickets |
Modelo conceptual (actualizado)
Cliente (org)
└── Instância de serviço (service_instance)
├── service_catalog.code (email_tenant, firewall, nextcloud, …)
├── service_catalog.delivery_model (traditional | iaas | paas | saas)
├── managed_layers[] (datacenter, hypervisor, os, runtime, app, ops)
├── status (planned | provisioning | active | degraded | suspended)
├── commercial_plan (hourly | monthly_fixed | per_user | per_gb)
├── wizard_id (vm112-mail, wizard-iaas-vps, …)
├── sla_tier (basic | business | enterprise)
└── bindings[] (domain, vm_id, zone_id, agent_id, k8s_ns)
Matriz de responsabilidade por delivery_model
| Camada |
traditional |
iaas |
paas |
saas |
| Datacenter / link |
C |
L |
L |
L |
| Hypervisor / VM |
C |
L |
L |
L |
| SO / rede / firewall |
C |
L |
L |
L |
| Runtime (Docker, proxy) |
C |
C |
L |
L |
| BD / deploy / SSL |
C |
C |
L |
L |
| Aplicação open source |
C |
C |
C |
L |
| Backup / monitoramento |
C |
L |
L |
L |
| Utilizadores finais / dados negócio |
C |
C |
C |
C |
C = Cliente · L = Ligbox
Catálogo de serviços — MVP + roadmap MOSP
| code |
Label UI |
delivery_model |
Wizard |
Fase Desk |
email_tenant |
E-mail Tenant |
saas |
vm112-mail |
Activo |
site_cms |
Site / CMS |
saas |
vm112-mail |
Derivado VM112 |
mail_dedicated |
Servidor E-mail Dedicado |
saas |
TBD |
Em breve |
firewall |
Firewall (pfSense) |
iaas |
wizard-iaas-fw |
Em breve |
cloud |
Cloud / VPS gerenciado |
iaas |
wizard-iaas-vps |
Em breve |
wazuh_domain |
Wazuh / SOC por domínio |
saas |
wizard-soc-wazuh |
Em breve |
vpn_corporate |
VPN empresarial |
iaas |
TBD |
Planeado |
backup_baas |
Backup as a Service |
iaas |
TBD |
Planeado |
nextcloud |
Nextcloud |
saas |
TBD |
Planeado |
erpnext |
ERP (ERPNext) |
saas |
TBD |
Planeado |
monitoring_host |
Monitoramento 24/7 |
iaas |
TBD |
Planeado |
consulting_hour |
Consultoria / suporte |
traditional |
— (ticket) |
Planeado |
Derivação Fase 1 — Cliente a partir do domínio VM112
Enquanto não existir tabela clients:
| Campo cliente |
Origem |
client_id |
domain (chave estável) |
display_name |
domain |
subtitle |
portal_admin_email ou «sem admin portal» |
health |
ok se carbonio_exists, senão warn |
Cada domínio VM112 = 1 cliente com pelo menos uma instância email_tenant.
Separação VM122 vs VM112 (Roger — clarificação)
| Onde |
Papel |
Desk VM122 (/opt/ligbox-ops-platform) |
Orquestração MOSP — clientes, tenants de oferta, purge OPS, estado |
Portal VM112 (/opt/ligbox-wizard) |
Apenas wizard e-mail/domínio — Hero e /onboard não recebem catálogo multi-produto |
| Futuro |
Cada oferta MOSP → wizard próprio (pode provisionar Proxmox, servidor físico, etc.) |
A página Serviços no Desk é o painel do técnico; os wizards são um por produto, nunca um megamenu na Hero da 112.
Reteste E2E — wizard e-mail/domínio (após purge)
Pré-requisitos
- Domínio de teste ausente em VM112 (lista Serviços vazia para esse domínio)
- Desk: menu Serviços → purge Spec 017 se ainda existir lixo
- Utilizador Desk:
super_admin ou ops_lead
Passos
| # |
Acção |
Verificação |
| 1 |
Desk → Serviços → seleccionar domínio teste |
Tile E-mail Tenant activo ou cliente ausente |
| 2 |
Se existir: tile E-mail → Purge (senha Root + confirmar domínio) |
Domínio desaparece da lista |
| 3 |
Portal onboard.ligbox.com.br ou onboard.ibytera.com |
Self-Service → registo → /onboard |
| 4 |
Wizard: domínio → DNS → conta → infra |
Webhooks no Desk (Tickets/Eventos) |
| 5 |
Desk → Serviços → Actualizar |
Cliente reaparece; tenant E-mail Activo |
| 6 |
Modal: infra steps verdes, contas Carbonio |
Purge disponível para próximo ciclo |
Domínios protegidos (sem purge)
ligbox.com.br, itecnologys.com
UI — Layout 3 colunas
┌─────────────────────────────────────────────────────────────────┐
│ Orquestração de Serviços [Actualizar] │
│ stats: clientes | e-mail activo | sites | logins portal │
├──────────────┬────────────────────────────┬─────────────────────┤
│ CLIENTES │ SERVIÇOS DO CLIENTE │ ESCOPO OPS │
│ [pesquisa] │ (tiles cPanel) │ (contexto serviço) │
│ • domain A │ [E-mail Tenant] activo │ Carbonio, CF, … │
│ • domain B │ [Site/CMS] activo │ nota purge │
│ │ [Firewall] em breve │ │
│ │ [Cloud] em breve │ │
│ │ [Wazuh] em breve │ │
└──────────────┴────────────────────────────┴─────────────────────┘
Coluna Clientes
- Lista scrollável de todos os clientes (domínios VM112)
- Pesquisa: domínio, e-mail admin, login portal
- Badge saúde (verde/laranja)
- Clique selecciona cliente e actualiza tiles + escopo
Coluna Serviços (centro)
- Grid de tiles por entrada do
SERVICE_CATALOG
- Estados visuais:
active, inactive, planned
- Fase 2+: badge
delivery_model (IaaS / PaaS / SaaS / Suporte) e cor por nível
- Fase 2+: agrupamento por categoria — Infra · Segurança · Apps · DevOps · Suporte
- Tile E-mail Tenant activo → clique abre modal Spec 017 (detalhe + purge)
- Tile Site/CMS → informativo (sem purge separado na Fase 1)
- Tiles
planned → não clicáveis, label «Em breve» + tooltip com stack e modelo comercial
Coluna Escopo OPS
- Lista dos escopos purge / operação quando serviço seleccionado
- E-mail Tenant: 6 escopos Spec 017 (Carbonio → Desk)
- Futuro: escopo dinâmico por
service_catalog.purge_scopes_json
- Indicador visual quem gere cada camada (matriz pizza — cliente vs Ligbox)
- Nota: purge requer senha Root no modal (serviços SaaS provisionados)
- Sem cliente seleccionado: texto de ajuda + link para portfólio (doc interna)
Purge (sem regressão — Spec 017)
| Item |
Mantido |
| API |
POST /api/v1/vm112/domains/{domain}/purge |
| Body |
confirm_domain, root_password |
| RBAC |
super_admin, ops_lead |
| Blocklist |
ligbox.com.br, itecnologys.com |
| Escopos VM112 |
Carbonio, site, portal, CF, Traefik, Desk |
| Modal |
#vm112-domain-modal (index.html) |
O purge continua por domínio na Fase 1; na Fase 3 passa a POST /api/v1/service-instances/{id}/purge com escopo do catálogo.
RBAC
Igual Spec 017 — can_manage_vm112_domains() → super_admin, ops_lead.
API — Fase 1 (sem alteração)
Reutiliza endpoints Spec 017:
| Método |
Path |
| GET |
/api/v1/vm112/domains |
| GET |
/api/v1/vm112/domains/{domain} |
| POST |
/api/v1/vm112/domains/{domain}/purge |
API — Fase 2 (planeada)
| Método |
Path |
Descrição |
| GET |
/api/v1/services/catalog |
Catálogo fixo + delivery_model, stack, wizard, preço ref |
| GET |
/api/v1/services/catalog/{code} |
Detalhe produto + matriz responsabilidade |
| GET |
/api/v1/clients?q= |
Lista clientes |
| GET |
/api/v1/clients/{id} |
Cliente + instâncias + bindings + SLA |
| POST |
/api/v1/service-instances |
Provisionar (trigger wizard por produto) |
| PATCH |
/api/v1/service-instances/{id} |
Suspender, reactivar, alterar plano |
| POST |
/api/v1/service-instances/{id}/purge |
Purge por instância (escopo do catálogo) |
SQLite (Fase 2)
clients (
id, name, tax_id, primary_email,
hosting_mode, -- ligbox_cloud | dedicated_vps | customer_onprem
sla_tier, created_at
)
service_catalog (
code, label, category, -- infra | security | apps | devops | support
delivery_model, -- traditional | iaas | paas | saas
managed_layers_json, -- ["hypervisor","os","app",…]
technology_stack_json, -- ["Carbonio","Traefik",…]
wizard_id,
commercial_model, -- hourly | monthly_fixed | per_user | per_gb
purge_scopes_json,
default_enabled
)
service_instances (
id, client_id, catalog_code, status,
external_ref, meta_json,
commercial_plan, monthly_value_cents,
provisioned_at, expires_at
)
service_bindings (
instance_id, resource_type, resource_id
-- resource_type: domain | vm_id | zone_id | agent_id | k8s_namespace | ticket_id
)
hosting_mode do cliente
| Valor |
Significado |
Pizza |
ligbox_cloud |
Hospedado na infra Ligbox (Proxmox/Hetzner) |
Ligbox gere datacenter+fogão |
dedicated_vps |
VPS dedicado gerido pela Ligbox |
IaaS+ |
customer_onprem |
Infra no cliente; Ligbox suporta/audita |
Tradicional+ |
Um mesmo cliente pode misturar modos por instância de serviço (ex.: e-mail SaaS Ligbox + ERP on-prem com suporte tradicional).
Ficheiros — Fase 1
| Ficheiro |
Alteração |
frontend/assets/accounts.js |
Refactor → DeskServices, layout 3 colunas |
frontend/assets/styles.css |
Classes .servicos-* |
frontend/index.html |
Nav «Serviços», cache bust |
frontend/assets/app.js |
Títulos view |
api/app/modules/registry.py |
Label módulo «Serviços» |
Critérios de aceite — Fase 1
Critérios de aceite — Fase 2 (catálogo comercial)
Critérios de aceite — Fase 3 (multi-wizard)
Critérios de aceite — Fase 4 (MSP comercial)
Evolução multi-wizard (Fase 3)
service_catalog.wizard_id aponta para endpoint VM112 ou outro nó
- Tile activo com acção «Abrir wizard» / «Retomar onboarding»
- Wazuh: binding
agent_id + link para Infra 2 SOC
- Firewall: binding
vm_id + link pfSense API
- Produtos MOSP (Nextcloud, ERPNext): wizard dedicado ou Helm + PaaS base
- Produtos traditional: sem wizard — cria ticket + sessão assist (Spec 010)
Prioridade sugerida de wizards (Roger)
| Ordem |
Produto |
Nível |
Justificativa |
| 1 |
E-mail Tenant |
SaaS |
Em produção — VM112 |
| 2 |
Firewall pfSense |
IaaS |
Já existe stack Proxmox + API |
| 3 |
Wazuh por domínio |
SaaS |
Infra 2 SOC parcial |
| 4 |
VPS gerenciado |
IaaS |
Base para outros produtos |
| 5 |
Nextcloud |
SaaS |
Alto valor MOSP |
| 6 |
ERPNext |
SaaS |
Upsell empresarial |
| 7 |
K8s / CI/CD |
PaaS |
Clientes dev |
Valor para o Técnico de Suporte Sénior
| Necessidade OPS |
Como a página Serviços responde |
| «O que este cliente comprou?» |
Tiles por delivery_model + estado |
| «O que nós gerimos vs cliente?» |
Matriz pizza / managed_layers |
| «Onde está provisionado?» |
Bindings (domínio, VM, zona, agente) |
| «Posso apagar para teste?» |
Purge Spec 017 (e-mail) → generalizado Fase 3 |
| «Qual wizard retomar?» |
wizard_id + estado provisioning |
| «Isto é incidente ou gap comercial?» |
Tile «Não contratado» vs degraded |
Referências
- Spec 017 — purge domínio VM112
- Spec 015 — registry módulos
overview-home
- Spec 010 — assist takeover (suporte tradicional)
- VM112 API —
/api/admin/domains
- Analogia comercial — Pizza as a Service (On-Prem → IaaS → PaaS → SaaS)
- Posicionamento MSP — Managed Open Source Services (MOSP)