Files
scoreodonto.com/documentação/STATUS-SEGURANCA-E-PRODUCAO.md
T
VPS 4 Builder 8a27f3bc7c
build-and-promote / build (push) Failing after 29s
build-and-promote / promote (push) Has been skipped
docs+infra: corrige status (JWT sem commit/contagem) + versão em DEV
- STATUS-SEGURANCA-E-PRODUCAO.md: a rotação do JWT_SECRET deixa de ser
  atribuída ao commit fcf2fb1 (que só remove .env/adiciona .dockerignore) —
  passa a constar como ação operacional na VPS, sem commit (segredo não
  versionado). Ajusta a contagem: 13 commits da sessão (inclui este doc),
  repo ahead 14 de origin/main (o 14º, docs/LEIA, é anterior à sessão).
- dev-build.sh: builda o ambiente de DEV injetando APP_VERSION/GIT_COMMIT/
  BUILD_TIME a partir do git (git describe), espelhando o deploy-prod.sh.
  /api/version em DEV deixa de mostrar apenas "dev".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:21:59 +02:00

7.1 KiB

Status — Segurança & Produção (ScoreOdonto)

Resumo do que foi feito e do que falta. Atualizado em 19/jun/2026. Produção no ar: v1.0.18 (fc00622). Todos os commits de código estão LOCAIS (sem git push) — exceto a rotação do JWT_SECRET, que já foi aplicada e verificada em produção.


O QUE JÁ FOI FEITO

1. Segredos

  • JWT_SECRET rotacionado em DEV e PRODUÇÃO (recriado o backend na VPS1 na mesma tag, sem rebuild; /api/health e /api/version validados). → vetor de tomada de conta FECHADO (o segredo vazado não forja mais tokens). Ação operacional na VPS1 — sem commit (o segredo não é versionado).
  • backend/.env fora do tracking do git + backend/.dockerignore (o Dockerfile fazia COPY . . sem .dockerignore → segredos iam para dentro da imagem) + .env.example. Commits fcf2fb1.
  • Senhas hardcoded removidas do docker-compose.yml: banco via SCOREO_DB_PASS (com :? fail-fast); DRAGONFLY_URL (com senha) movido para env_file. Commit 3aa6a44. Validado em DEV (pgdev/cache ok).

2. Frontend

  • /update (migração de banco) restrito a superadmin (era acessível a qualquer um, até deslogado).
  • Deep-links corrigidos (/comissoes, /glosas faltavam no ROUTE_MAP → caíam em dashboard).
  • Commit 1559387. (Build compila; validação visual de RBAC precisa de navegador.)

3. RBAC intra-clínica no backend (99 rotas) — NÚCLEO FECHADO

Antes: qualquer membro autenticado (até paciente) podia chamar ações privilegiadas direto na API (a UI escondia, o backend não barrava). Agora há autorização por cargo, espelhando o isViewAllowed do frontend, via 3 helpers: requireCapability, requireCapabilityRow, requireCapabilityFromOrders.

Grupo Commit
Financeiro (comissões/repasses/financeiro/glosas) f4e7fe3
Gestão de equipe/clínica (membros/setores/funções/reset-senha/cor) 9ad65c3
Cadastros administrativos (dentistas/especialidades/procedimentos/planos + reorder) 116200c + 0667456
Operação clínica (pacientes/agenda/leads) 5b58a8a
Orçamentos/Contratos 16c13ad
Sub-pass clínico (presença/pendências/horários/detalhes de paciente) 0fc69bb
  • Marketplace (salas/sala-reservas/propostas): auditado — já protegido por POSSE nos handlers (owner_usuario_id, profissional destinatário, dono/solicitante). Sem gap; sem mudança. Commit 0667456.
  • Validado em DEV com tokens forjados: dono passa, dentista/paciente 403, isolamento cross-tenant intacto.

4. Documentação & Skills

  • documentação/MAPA-FUNCIONAL-COMPLETO.md (inventário rotas/telas/botões/fluxos/módulos).
  • documentação/AUDITORIA-ESTRATEGICA-MODELAGEM.md (Pessoa→Vínculo→Workspace, débitos, riscos).
  • ScoreOdonto_Skills_Enterprise/: 62/62 skills preenchidas com conteúdo real. Commits 5b99292, e83af04, f22e30e.

5. Pré-requisito de produção

  • SCOREO_DB_PASS provisionado na VPS1 (/home/deploy/stack/scoreodonto.com/.env, 0600), valores extraídos do container em execução, .gitignore da VPS1 ajustado, conexão validada (SELECT 1 = ok). Produção não foi tocada.

O QUE FALTA

A) Levar o trabalho a produção (fila)

  1. Imagem limpa v1.0.19 (remove segredos embutidos na imagem): git push → CI builda :<sha> com .dockerignoregit tag v1.0.19deploy-prod.sh v1.0.19 → validar /api/version + /api/health. Rollback trivial: deploy-prod.sh v1.0.18.
    • Leva junto: RBAC (99 rotas), correções de frontend, etc.
  2. Compose novo na VPS1 (opcional, passo 2b): deploy-prod.sh não faz git pull → o docker-compose.yml da VPS1 segue o antigo. Para tirar a senha hardcoded do compose local, copiar o novo docker-compose.yml (scp) + recreate. O root .env já provisionado cobre isso.

B) Rotação dos demais segredos (ainda vivos no histórico/artefatos antigos)

  1. Senha do banco (scoreodonto_user) — contida ao scoreodonto; exige refactor já feito no compose + ALTER USER + atualizar .env/backend/.env + recreate. Risco de outage → com cuidado/janela.
  2. Senha do Dragonfly (cache)⚠️ compartilhada entre apps (rx, newwhats, subdominio, mercado); trocar derruba os outros → exige janela coordenada.
  3. OPENAI_API_KEY / GEMINI_API_KEYsó você rotaciona (painéis OpenAI/Google); depois colo os novos valores no .env e recrio.
  4. Histórico do gitbackend/.env (e um backend/.env.bak) estão no histórico. Após rotacionar tudo, o scrub de histórico (force-push, destrutivo) vira cosmético — não recomendado às pressas.

C) Residual de qualidade (não-bloqueante; do MAPA / AUDITORIA)

  • RECEITA de procedimento é opcional (gerarLancamento/valor>0) → decidir se vira padrão (risco de caixa).
  • Estado de plugins divergente cliente/servidor (localStorage vs usuario_plugins).
  • Órfã OrthoReports.tsx; SyncView desativada; server.js.bak/scripts legados → limpeza.
  • Marketplace: gateway de pagamento (salas têm valor, sem captura) e assinaturas SaaS (manual).

D) Débitos de modelagem (estratégico; exige aprovação + janela)

  • dentistas como projeção da pessoa (hoje duplica a pessoa por clínica).
  • pacientes com identidade de pessoa (hoje preso à clínica, não-portável) — antes, decisão LGPD/jurídica.
  • Unificar workspace (clinicas + salas); entidade "rede/grupo" acima da clínica.

Recomendação estratégica única: assumir a Pessoa como âncora e parar de manter o legado clínica-cêntrico em paralelo. Detalhe em AUDITORIA-ESTRATEGICA-MODELAGEM.md.


Commits locais da sessão (nenhum push, exceto JWT já aplicado em prod)

13 commits desta sessão (incluindo este documento) ainda locais. O repositório está ahead 14 de origin/main — o 14º (7c5b199 docs(LEIA)) é anterior a esta sessão. A rotação do JWT_SECRET não está nesta lista (foi ação operacional na VPS, sem commit).

6adf353 docs: status geral de segurança & produção (este documento)
f22e30e docs(skills): completa as 62 skills
e83af04 docs(skills): biblioteca operacional
5b99292 docs: auditoria funcional + estratégica
0667456 security(rbac): reorder + auditoria do marketplace
0fc69bb security(rbac): sub-pass clínico
16c13ad security(rbac): orçamentos e contratos
5b58a8a security(rbac): operação clínica
116200c security(rbac): cadastros administrativos
9ad65c3 security(rbac): gestão de equipe/clínica
f4e7fe3 security(rbac): rotas financeiras
1559387 security/fix(front): /update + deep-links
3aa6a44 security(infra): senhas fora do compose
fcf2fb1 security(infra): .env fora do git + .dockerignore

Como retomar

  • Para publicar: seguir a fila A (push → v1.0.19 → deploy → validar health/version).
  • Antes de abrir a usuários reais: concluir B (rotações) — sobretudo as API keys (você) e a senha do banco.
  • Tudo de código testado em DEV (dev.scoreodonto.com, banco pgdev); produção segue v1.0.18 intacta.