System design · MVP · SRS v2.6

Topologia da Plataforma Nexus

Um servidor, seis containers e nenhuma integração com seguradora. A cotação é trabalho humano: o sistema organiza a fila, guarda o registro e impõe o sigilo entre escritórios no próprio banco.

Volume do piloto
~26 itens/dia útil
Usuários
36 · 4 escritórios
Tela
p95 ≤ 2 s
Disponibilidade
99% (meta)
Perda máxima de dados
~5 min

Os containers e quem fala com quem

Tudo roda num VPS com Docker Compose. Sem fila, sem cache, sem worker separado.

container no VPS fora do VPS canal humano, sem sistema dado sensível · fronteira jurídica
SulAmérica · MAG portal e canal comercial CANAL HUMANO · SEM INTEGRAÇÃO cota PDF Operacional · Admin navegador · MFA Funcionário · Dono navegador · escritório Titular só e-mail · sem login VPS ÚNICO · DOCKER COMPOSE caddy TLS · proxy Let's Encrypt web · Next.js 4 painéis + termo público api · NestJS monolito modular agendador in-process 6 rotinas, todas Must minio · 2 buckets sensível negócio postgres RLS forçado transações · auditoria outbox · sessão backup pgBackRest WAL contínuo Storage off-host outro provedor WAL + réplica Provedor de e-mail transacional aceite com código páginas /api REST S3 SQL WAL envia réplica outbox termo + código
A linha tracejada em ocre é o coração do produto e passa por fora do sistema: o Operacional cota no portal da seguradora e devolve o PDF pela plataforma. Nenhum container fala com seguradora (R-01), e é isso que deixa a topologia tão pequena. O titular nunca faz login: recebe o termo por e-mail e aceita numa página pública, com código de uso único.

Dentro da api: quem passa pelo RLS

O sigilo entre escritórios é a regra com mais peso jurídico do sistema. Por isso quem o impõe é o banco, e não um filtro que alguém precisa lembrar de escrever.

Requisição sessão no Postgres Monitor externo GET /api/saude API · NESTJS comum/contexto identidade → set_config(…, is_local) em cada transação auth sessão · MFA · papéis parceiros escritórios · equipe titular consentimento · LGPD cotacao formulário · fila catalogo único que sabe nomes notificacao outbox de e-mail auditoria só acrescenta financeiro vazio por decisão documentos porta única do MinIO o papel de sistema nunca é alcançável pelo HTTP agendador consulta por prazo vencido · idempotente expiração do lead pendente RF-027 encerramento por inatividade RF-071 vigiada expurgo do documento de vida RF-033 vigiada alerta de vencimento de contrato RF-003 vencimento da cotação RF-062 drenagem do outbox de e-mail RF-023 pool aplicação papel sem BYPASSRLS sofre as políticas minio sensível negócio pool sistema migrações · agendador ignora o RLS postgres carteira por escritório doc. de vida Dono não vê auditoria só acrescenta catálogo sem RLS sessão consulta SQL RLS objetos SQL sem filtro
Cada requisição roda numa transação que grava quem está logado; as políticas do Postgres leem isso e escondem as linhas de outros escritórios, e o documento de vida esconde até do Dono. O agendador precisa enxergar todos os escritórios, então usa outro papel, num pool separado. As duas rotinas marcadas como vigiadas deixam o endpoint de saúde vermelho se pararem. O MinIO fica fora do alcance do RLS; por isso só o módulo documentos fala com ele, e só depois da leitura já filtrada pelo banco.

Fora do desenho, de propósito

Cada peça abaixo foi considerada e recusada por um requisito concreto. Voltar atrás exige revisitar o motivo, não só a preferência.

Kubernetes
Seis containers num host só. Orquestração elástica resolve uma escala que o piloto não tem. RNF-05
Microsserviços
Um desenvolvedor, um deploy. O monolito modular já está decidido. R-10 · RNF-15
Broker de mensagens
Algumas dezenas de e-mails por dia. O outbox no Postgres dá a mesma garantia de entrega. RF-023 · RF-084
Redis
Cerca de 12 sessões simultâneas, e a sessão precisa ser revogável na hora. A tabela resolve. RNF-01 · RNF-08
Worker separado
Instância única e rotinas idempotentes. É a primeira peça a sair se a api escalar. §2.2
Integração com seguradora
Não existe API liberada. O canal de cotação é uma interface no código, pronta para a fase 2. R-01 · RNF-16