Pular para conteúdo

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/login e /api/health requerem 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