- problema
- O gerenciador se conecta direto ao banco dos outros sistemas. Um acesso indevido aqui vale mais que um acesso indevido em qualquer um deles.
- escolha
- Autenticador obrigatório, sessão guardada no banco em vez de JWT, cookie preso a /admin, e nenhuma das chaves de cifragem dos sistemas administrados.
- porquê
- Um JWT continua valendo depois do “sair”; a sessão no banco termina quando termina. E sem as chaves, quem invadir lê texto cifrado que não abre.
Gerenciador e deploy
No arO painel que administra todos os sistemas desta página e o deploy de um comando que publica cada um deles na VPS.
Da autenticação ao servidor.
- Senha e autenticador obrigatórios
- Auditoria que não se apaga
- Chamadas assinadas com HMAC
- Deploy de um comando
Cinco sistemas no ar pedem um lugar de onde cuidar deles. O gerenciador, em /admin, lista cada sistema e o estado dele, cria e suspende clínicas do CliniHub e guarda o registro de tudo o que foi feito.
O deploy é um comando só na VPS: /opt/deploy.sh e o nome do sistema. Ele atualiza o código, constrói a imagem, migra o banco, sobe e confere de fora se o sistema respondeu. Cada sistema tem a sua receita, e todas passam pelo mesmo caminho.
Decisões
O problema que apareceu, a escolha feita e a consequência que a justifica.
- problema
- Um registro de auditoria que a própria aplicação consegue reescrever não prova nada sobre o que ela fez.
- escolha
- A tabela de auditoria só aceita inserção: um gatilho no Postgres recusa UPDATE e DELETE, e leitura não vira registro, só escrita.
- porquê
- A garantia fica no banco, e não num if que alguém pode contornar. E uma auditoria cheia de “listou clínicas” enterra o que ela existe para mostrar.
- problema
- O token que fala com a API do CliniHub vai inteiro em toda chamada, e token vaza em log de proxy, rastro de erro e captura de tráfego.
- escolha
- Cada chamada é assinada com HMAC-SHA256 sobre método, caminho, corpo, instante e nonce. O segredo nunca viaja, só a assinatura.
- porquê
- Quem lê o token num log passa a ter metade da credencial, e a assinatura não serve para outra chamada nem para a mesma repetida depois.
- problema
- Todos os sistemas dividem o mesmo Nginx de borda na VPS. Um deploy que só confere o próprio sistema pode terminar verde com o vizinho fora do ar.
- escolha
- As receitas que mexem na borda terminam conferindo, de fora, o próprio endereço e o dos sistemas vizinhos.
- porquê
- É assim que esse tipo de queda passa despercebida: ninguém olha o sistema que não foi publicado. A conferência olha por quem não está olhando.
Ficha técnica
FastAPI · PostgreSQL · SQLAlchemy · Alembic · Vue 3 · TypeScript · Tailwind CSS · Docker · Nginx · Shell