- 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>
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 (semgit push) — exceto a rotação doJWT_SECRET, que já foi aplicada e verificada em produção.
✅ O QUE JÁ FOI FEITO
1. Segredos
JWT_SECRETrotacionado em DEV e PRODUÇÃO (recriado o backend na VPS1 na mesma tag, sem rebuild;/api/healthe/api/versionvalidados). → 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/.envfora do tracking do git +backend/.dockerignore(o Dockerfile faziaCOPY . .sem.dockerignore→ segredos iam para dentro da imagem) +.env.example. Commitsfcf2fb1.- Senhas hardcoded removidas do
docker-compose.yml: banco viaSCOREO_DB_PASS(com:?fail-fast);DRAGONFLY_URL(com senha) movido paraenv_file. Commit3aa6a44. 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,/glosasfaltavam noROUTE_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. Commit0667456. - 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. Commits5b99292,e83af04,f22e30e.
5. Pré-requisito de produção
SCOREO_DB_PASSprovisionado na VPS1 (/home/deploy/stack/scoreodonto.com/.env, 0600), valores extraídos do container em execução,.gitignoreda 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)
- Imagem limpa
v1.0.19(remove segredos embutidos na imagem):git push→ CI builda:<sha>com.dockerignore→git tag v1.0.19→deploy-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.
- Compose novo na VPS1 (opcional, passo 2b):
deploy-prod.shnão fazgit pull→ odocker-compose.ymlda VPS1 segue o antigo. Para tirar a senha hardcoded do compose local, copiar o novodocker-compose.yml(scp) + recreate. O root.envjá provisionado cobre isso.
B) Rotação dos demais segredos (ainda vivos no histórico/artefatos antigos)
- 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. - Senha do Dragonfly (cache) — ⚠️ compartilhada entre apps (rx, newwhats, subdominio, mercado); trocar derruba os outros → exige janela coordenada.
OPENAI_API_KEY/GEMINI_API_KEY— só você rotaciona (painéis OpenAI/Google); depois colo os novos valores no.enve recrio.- Histórico do git —
backend/.env(e umbackend/.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 (
localStoragevsusuario_plugins). - Órfã
OrthoReports.tsx;SyncViewdesativada;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)
dentistascomo projeção da pessoa (hoje duplica a pessoa por clínica).pacientescom 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 14deorigin/main— o 14º (7c5b199 docs(LEIA)) é anterior a esta sessão. A rotação doJWT_SECRETnã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, bancopgdev); produção segue v1.0.18 intacta.