Arquitetura do Sistema¶
Visão Geral¶
O VIG-IA Dashboard é uma aplicação web que fornece monitoramento em tempo real do sistema de vigilância epidemiológica. A arquitetura segue o padrão cliente-servidor com separação clara entre frontend e backend, conectando-se a dois servidores PostgreSQL distintos.
Stack Tecnológica¶
Backend¶
- Framework: FastAPI (Python 3.11)
- Database: PostgreSQL (2 servidores) + psycopg2 com Connection Pooling
- Authentication: JWT (HS256, 8h expiry) com RBAC (admin/operador/supervisor)
- API Style: REST
- Server: Uvicorn (ASGI)
- APIs Externas: OpenAI (resumos clínicos), Open-Meteo (clima), Google Maps (geocoding)
Frontend¶
- HTML5 + CSS3 + Vanilla JavaScript (sem frameworks)
- Charts: Chart.js 4.4.0
- Maps: Google Maps JavaScript API
- Design: Dark theme com glassmorphism, CSS variables
Infraestrutura¶
- Containerização: Docker
- Orquestração: Docker Compose (4 containers)
- Deploy: Linux server
Diagrama de Arquitetura¶
graph TB
subgraph "Cliente - Browser"
UI["SPA - index.html"]
JS["21 Módulos JS"]
Charts["Chart.js"]
GMaps["Google Maps API"]
end
subgraph "Dashboard Container - FastAPI"
FastAPI["FastAPI Server + Static Files"]
subgraph "Routes - 15 módulos"
Auth["auth.py"]
Metrics["metrics.py"]
Logs["logs.py"]
Health["health.py"]
Details["details.py"]
DL["datalake.py"]
Cenarios["cenarios.py"]
Clima["clima.py"]
Agravos["agravos.py"]
AgravosConfig["agravos_config.py"]
AgravosExplorer["agravos_explorer.py"]
Usuarios["usuarios.py"]
Geo["geolocalizacao.py"]
Audit["audit.py"]
Review["review.py"]
end
DB["database.py - Connection Pools"]
Config["config.py - Settings"]
AuditMW["middleware/audit.py - LGPD"]
end
subgraph "Watchdog Container"
Watchdog["dnci_watchdog.py"]
Monitor["dnci_monitor_service.py"]
end
subgraph "Climate Job Container"
ClimaJob["clima_daily_fetch.py"]
end
subgraph "DNCI Database Server"
PG_DNCI[("PostgreSQL DNCI")]
end
subgraph "DTW Database Server"
PG_DTW[("PostgreSQL DTW")]
end
subgraph "APIs Externas"
OpenAI["OpenAI API"]
OpenMeteo["Open-Meteo API"]
GoogleGeo["Google Geocoding API"]
end
UI --> FastAPI
JS --> FastAPI
Charts --> JS
GMaps --> JS
FastAPI --> AuditMW
AuditMW --> Auth & Metrics & Logs & Health & Details
AuditMW --> DL & Cenarios & Clima & Agravos
AuditMW --> AgravosConfig & AgravosExplorer & Usuarios & Geo
AuditMW --> Audit & Review
DB --> PG_DNCI
DB --> PG_DTW
Monitor --> OpenAI
Clima --> OpenMeteo
Geo --> GoogleGeo
Watchdog --> Monitor
Monitor --> PG_DNCI
Monitor --> PG_DTW
ClimaJob --> OpenMeteo
ClimaJob --> PG_DNCI
Bancos de Dados¶
Dois Servidores Separados¶
| Pool | Servidor | Max Conexões | Acesso | Schema Padrão |
|---|---|---|---|---|
db (DNCI) |
Banco próprio VIG-IA | 5 | Leitura/Escrita | dnci |
dtw_db (DTW) |
Banco do cliente | 5 | Somente Leitura | monitora |
Atenção
O banco DTW é somente leitura. Nunca executar INSERTs, UPDATEs ou DELETEs nesse banco.
Connection Pooling¶
database.py usa psycopg2.pool.ThreadedConnectionPool com minconn=1, maxconn=5 por pool. Fallback automático para conexão direta se o pool falhar.
Fluxos de Dados¶
1. Processamento de Boletins (Watchdog)¶
sequenceDiagram
participant W as Watchdog
participant M as Monitor Service
participant DTW as PostgreSQL DTW
participant DNCI as PostgreSQL DNCI
participant AI as OpenAI API
W->>M: Dispara ciclo (a cada N minutos)
M->>DTW: Busca boletins (monitora=true)
DTW-->>M: Lista de boletins pendentes
loop Para cada boletim
M->>M: Compara CIDs/termos com evidências
alt CID encontrado
M->>DNCI: Grava CID_E_ANAMNESE ou CID_APENAS
else Termo suspeito encontrado
M->>AI: Envia para validação
AI-->>M: Aprovado ou Rejeitado
M->>DNCI: Grava SUSPEITA ou SEM_AGRAVO
else Múltiplos agravos (desambiguação)
M->>AI: Envia para desambiguação
alt Alta confiança (≥80%)
M->>DNCI: Aceita automaticamente
else Baixa confiança
M->>DNCI: Envia para fila de revisão manual
end
else Nenhuma evidência
M->>DNCI: Grava SEM_AGRAVO
end
end
M->>DNCI: Atualiza checkpoint
2. Fluxo de Autenticação¶
Usuário → Login Form → POST /api/auth/login
│
Valida credenciais (bcrypt hash do DB)
│
Gera JWT (username, perfil, usuario_id, 8h expiry)
│
Retorna token + perfil
│
Frontend armazena: dnci_auth_token, dnci_perfil, dnci_usuario_id (localStorage)
3. Filtro por Cenário¶
Cenário selecionado → cenarios.js propaga evento
│
+--------- cenario_id passado como query param ---------+
| | | | |
Técnico Saúde Clima Mapa DataLake
metrics.py health.py clima.py health.py datalake.py
| | | | |
+--- queries filtradas por cenário (estab + agravos) ----+
Classificação de Agravos¶
O sistema classifica cada boletim analisado em uma das seguintes categorias:
| Classificação | CID? | Texto? | Significado |
|---|---|---|---|
CID_E_ANAMNESE |
✅ | ✅ | Confirmado: CID de agravo + evidência na anamnese |
CID_APENAS |
✅ | ❌ | Confirmado: apenas CID, sem confirmação textual |
SUSPEITA |
❌ | ✅ | Suspeito: IA encontrou evidências textuais |
SEM_AGRAVO |
❌ | ❌ | Sem agravo detectado |
REVISAO_PENDENTE |
— | — | Múltiplos agravos com baixa confiança da IA |
Segurança¶
Autenticação e Autorização¶
- JWT (HS256) com 8h de expiração
- Perfis:
admin(acesso total),supervisor(revisão IA),operador(somente leitura) - Todas as rotas exceto
/api/auth/logine/api/healthrequerem JWT válido
Proteção de Dados¶
- Credenciais em
.env(não versionado) - Connection pools isolados (DNCI r/w, DTW read-only)
- Whitelist obrigatória para sort columns (prevenção SQL injection)
- Middleware LGPD audita todas as ações
Recursos por Container¶
| Container | CPU | Memória |
|---|---|---|
| Dashboard | 0.5 | 512MB |
| Watchdog | 1.0 | 1GB |
| Clima Job | 0.25 | 256MB |