Pular para conteúdo

Arquitetura e Infraestrutura

Visão Geral

Este documento consolida a visão atual da arquitetura e da infraestrutura da Page Saúde. Ele tem como objetivo fornecer entendimento técnico, contexto de decisões e referências essenciais, sem substituir as fontes operacionais detalhadas (planilhas e sistemas).

A infraestrutura da Page Saúde é composta por ambientes segregados, com foco em estabilidade operacional, previsibilidade e evolução controlada. Detalhamentos extensos de inventário, requisitos e configurações são mantidos em fontes externas dedicadas.

Topologia (Visão de Alto Nível)

A topologia atual segue o modelo:

  • Provedor de infraestrutura dedicado
  • Virtualização como base para segregação de workloads
  • Ambientes separados por finalidade
  • Serviços organizados por responsabilidade (aplicação, dados, monitoramento)

Stack de Serviços

  • Proxy Web: Traefik (Roteador de Borda, SSL, Balanceamento de Carga).
  • Banco de Dados: PostgreSQL + PgBouncer (Pooling de Conexões).
  • Observabilidade:
    • Grafana Alloy: Coletor OpenTelemetry (Métricas, Logs, Traces, Perfis). Padronização de ambiente (label environment) e coleta de logs de serviços (Apache, etc).

Para detalhes sobre arquitetura, provisionamento e operação da stack de monitoramento, consulte Monitoramento e Observabilidade. * Grafana Stack: Loki (Logs), Tempo (Traces), Prometheus (Métricas), Pyroscope (Profiling), Grafana (Interface). * Aplicações: * Projetos Externos: Aplicações PHP, Node.js e React (Frontend) provisionadas independentemente.

Diagrama de Topologia

flowchart TB
    subgraph INTERNET["Internet"]
        USER["Usuários Web"]
    end

    subgraph DNS["DNS"]
        CF["Cloudflare<br/>*.pagesaude.com.br"]
        REGISTROBR["Registro.br<br/>*.cosemsmg.org.br"]
    end

    subgraph EVEO["Servidor Dedicado EVEO"]
        FW["Firewall EVEO"]

        subgraph PROD_PAGESAUDE["Produção PageSaúde"]
            subgraph APP01["prod-pagesaude-app-01"]
                APP01_SVC["Apache, PHP, Node<br/>MySQL (local), Cache"]
            end
            subgraph APP02["prod-pagesaude-app-02"]
                APP02_SVC["Traefik<br/>Docker Apps"]
            end
            subgraph DB01["prod-pagesaude-db-01"]
                DB01_SVC["PostgreSQL 14<br/>pgBouncer"]
            end
            subgraph DB02["prod-pagesaude-db-02"]
                DB02_SVC["PostgreSQL 14<br/>Redis"]
            end
        end

        subgraph PROD_CREDENCIA["Produção PageCredencia"]
            subgraph CRED_APP01["prod-credencia-app-01"]
                CRED_APP01_SVC["Traefik<br/>Docker Apps"]
            end
            subgraph CRED_DB01["prod-credencia-db-01"]
                CRED_DB01_SVC["PostgreSQL 14<br/>pgBouncer"]
            end
        end

        subgraph STAGING["Staging"]
            subgraph STG_APP01["stg-shared-app-01"]
                STG_SVC["Traefik, Docker Apps<br/>PostgreSQL, Redis"]
            end
        end

        subgraph PROD_COSEMSMG["Produção COSEMSMG"]
            subgraph COSEMS01["prod-cosemsmg-app-01"]
                COSEMS01_SVC["Apache, Node<br/>MySQL (local)"]
            end
            subgraph COSEMS02["prod-cosemsmg-app-02"]
                COSEMS02_SVC["Windows Server<br/>NGINX, Tomcat, MySQL"]
            end
        end

        subgraph OPS["Operações"]
            subgraph MONITOR["ops-shared-monitor-01"]
                MON_SVC["Traefik, Grafana<br/>Prometheus, Loki, Tempo<br/>Portainer"]
            end
        end
    end

    %% Fluxo de Tráfego DNS
    USER --> CF & REGISTROBR
    CF --> FW
    REGISTROBR --> FW

    %% Roteamento por Domínio
    FW -->|"api/app/beta*.pagesaude.com.br"| APP01
    FW -->|"pagesaude.com.br (novo)"| APP02
    FW -->|"credencia*.pagesaude.com.br"| CRED_APP01
    FW -->|"*-stg.pagesaude.com.br"| STG_APP01
    FW -->|"grafana/portainer*.pagesaude.com.br"| MONITOR
    FW -->|"*.cosemsmg.org.br"| COSEMS01
    FW -->|"sislog.cosemsmg.org.br"| COSEMS02

    %% Conexões de Banco
    APP01 -.->|PostgreSQL| DB01
    APP02 -.->|PostgreSQL + Redis| DB02
    CRED_APP01 -.->|PostgreSQL| CRED_DB01

    %% Monitoramento (Alloy Agent → Stack)
    APP01 -.->|OTLP| MONITOR
    APP02 -.->|OTLP| MONITOR
    DB01 -.->|OTLP| MONITOR
    DB02 -.->|OTLP| MONITOR
    STG_APP01 -.->|OTLP| MONITOR
    COSEMS01 -.->|OTLP| MONITOR
    CRED_APP01 -.->|OTLP| MONITOR
    CRED_DB01 -.->|OTLP| MONITOR

Ambientes

Produção

Ambiente responsável pela operação dos sistemas em uso real.

Características gerais:

  • Alta criticidade
  • Mudanças controladas
  • Monitoramento ativo
  • Backups regulares

Staging

Ambiente destinado a validações, testes e homologações.

Características gerais:

  • Replica, quando possível, a produção
  • Menor criticidade
  • Usado para validação de mudanças

Monitoramento

Ambiente dedicado à observabilidade da infraestrutura e aplicações.

Características gerais:

  • Coleta de métricas
  • Logs
  • Alertas
  • Suporte à operação e resposta a incidentes

Inventário de Infraestrutura

A fonte oficial e detalhada do inventário da infraestrutura está mantida em uma planilha Google dedicada.

Este documento mantém apenas informações que não fazem sentido em formato tabular, como:

  • visão consolidada da infraestrutura
  • observações relevantes
  • decisões técnicas
  • exceções

Resumo Atual

  • Provedor principal: EVEO
  • Modelo: infraestrutura virtualizada
  • Ambientes segregados: Produção, Staging e Monitoramento
  • Componentes críticos identificados e acompanhados via monitoramento

Requisitos e Configurações

Os requisitos técnicos e configurações detalhadas também possuem uma planilha dedicada como fonte de verdade.

Neste documento são mantidos apenas:

  • observações fora do escopo da planilha
  • exceções técnicas
  • decisões de configuração
  • riscos associados

Observações Relevantes

  • Existem diferenças de configuração entre ambientes que não são completamente simétricas
  • Algumas configurações são resultado de restrições históricas
  • Dependências externas devem ser monitoradas com atenção

Estrutura nos Servidores

Tudo que este repositório provisiona vive sob /opt/pagesaude:

/opt/pagesaude
├── apps/       # aplicações de negócio (webapps, workers)
├── services/   # infraestrutura compartilhada (banco, cache, proxy, observabilidade)
└── secrets/    # segredos gerados pelo provisionamento (nunca versionados)

Regras de execução:

Executar via Critério Exemplos
systemd (host) Precisa existir antes ou independentemente do Docker Docker engine, sshd, agente do provedor
Container Todo o resto aplicações, PostgreSQL, Redis, Traefik, observabilidade, Portainer

Logs vão apenas para stdout/stderr (coletados pelo Alloy via socket do Docker) e dados persistentes ficam em volumes Docker nomeados — sem diretórios de logs ou data criados manualmente no host.

Detalhamento e justificativa: ADR-0003.

Decisões Técnicas

As decisões técnicas formais (ADR) são mantidas no repositório GitHub como fonte oficial e compartilhada com o cliente.

Este documento referencia apenas decisões relevantes para entendimento da arquitetura.

Riscos e Pontos de Atenção

  • Dependência de infraestrutura específica
  • Necessidade de padronização maior entre ambientes
  • Evolução da infraestrutura sem perda de rastreabilidade

Referências


Este é um documento vivo. Ele deve ser atualizado sempre que houver mudanças estruturais, decisões técnicas relevantes ou alterações significativas na infraestrutura.