Arquitetura de referência cloud¶
Origem: diagrama 11-10-arquitetura_v2.jpg, fornecido pelo arquiteto. Tipo: referência arquitetural.
Abrir imagem original preservada

Ambiente: referência cloud sem associação comprovada a DEV, STAGING ou PROD. Não reconstrói a infraestrutura do TOTVS Apps. A comparação abaixo contrapõe código e ambiente local à referência; diferenças não indicam falhas do corporativo.
Retângulos representam serviços ou grupos nomeados; cilindros, armazenamento; caixas com bordas duplas, mensageria; formas arredondadas, sistemas externos. As setas indicam chamadas ou transporte de dados, conforme o rótulo.
Síntese versionável da referência¶
Quais relações a referência propõe para entrada, dados e conectividade? As setas tracejadas pertencem à referência arquitetural.
%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
dns(["DNS externo"]):::external
subgraph gcp["Referência GCP · GKE"]
cp["Control Plane<br/><small>BFF e administração</small>"]:::entry
dp["Data Plane<br/><small>Execução e suporte</small>"]:::domain
end
atlas[("MongoDB Atlas")]:::store
mq[["CloudAMQP"]]:::async
onprem(["Serviços on-premises"]):::external
dns -.->|Entrada proposta| cp
dns -.->|Entrada proposta| dp
cp -.->|Peering| atlas
cp -.->|Eventos| mq
dp -.->|Túnel proposto| onprem
classDef entry stroke-width:1.5px;
classDef domain stroke-width:1.5px;
classDef store stroke-width:1.5px;
classDef async stroke-width:1.5px;
classDef external stroke-width:1.5px;
Recursos complementares da referência¶
| Localização indicada | Recurso / responsabilidade |
|---|---|
| Projeto GCP | gateway-project, região southamerica-east1 |
| GKE | Namespaces control-plane, data-plane, keycloak e telemetry |
| Namespace keycloak | Imagem customizada e bootstrap; conexão com PostgreSQL |
| Namespace telemetry | OTel Collector |
| GCP Services | PostgreSQL e Redis |
| Projeto GCP | Elasticsearch e Gateway Storage |
| Fora do projeto | MongoDB Atlas e CloudAMQP |
A tabela mantém os recursos da imagem original sem acrescentar relações de consumo ausentes.
Todas as setas deste desenho pertencem à referência arquitetural. Redis, Elasticsearch e Storage aparecem sem associação completa de consumidores na imagem; o resumo não inventa essas conexões. Os containers lógicos e contratos reais estão nas páginas Lógica e Dependências.
Correspondências com código e diferenças do ambiente local¶
| Elemento da referência | Evidência de código ou declaração local | Classificação |
|---|---|---|
| BFF, Core, políticas, Templates, Registry, Broker, Builder, Router, Discovery e Checker | Contratos implementados | Correspondência funcional |
| Outbox Dispatcher no Core | Sidecar no Deployment do Core | Correspondência declarativa local |
| Cache Monitor separado | CronJob; fonte no repo Invalidator | Mesmo componente, unidade Git diferente |
| Web Pages | Java/Quarkus; GCS para HTML e OpenAPI Doc para JSON | Implementado; fora do agregador local |
tunnel-server no dataplane |
Serviço Tunnel administra Cloudflare e pacotes de cliente | Papel divergente; servidor próprio não confirmado |
| Namespaces control/data plane | Default local usa totvs-gateway |
Diferença entre referência e ambiente local |
| Atlas, CloudAMQP, VPC/peering, GKE regional | Helmfiles locais usam Kind e serviços no cluster | Implementação cloud não comprovada neste workspace |
/oauth2/token externo |
BFF declara /auth/token |
Contrato externo a reconciliar |
| Grupo Persistence Services | JSON Handler, Monitoring e Auth Provider têm funções distintas de persistência | Agrupamento não deve definir ownership de dados |
| Scheduler em Runtime Services | Agenda quotas e chamadas HTTP, inclusive limpeza de instâncias | Não integra toda chamada de API |
| Accounts/Authenticator e Cloudflare | Clients explícitos nos serviços backend | Dependências que precisam complementar o contexto |
Fontes: agregador, Core Deployment, namespace default, Web Pages, TunnelService, OAuth público, Scheduler.
Evidência corporativa necessária para confirmar deployment¶
Manifestos e valores do ambiente cloud, contexto/namespace, imagem e digest por workload, configuração de ingress, identidade de serviços, rede/peering e inventário de dependências gerenciadas. Segredos não devem ser copiados para a documentação. Até obter essas evidências, HA, mTLS, backups, SLO, RPO/RTO e isolamento cloud permanecem não confirmados.