Pular para o conteúdo principal

Arquitetura Técnica

Esta página descreve a arquitetura técnica do PCH-SIG.

Arquitetura Técnica PCH-SIG

Visão geral

O PCH-SIG segue uma arquitetura 3 camadas clássica:

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ Apresentação │ │ Negócio │ │ Dados │
│ │ │ │ │ │
│ React + Nginx │────▶│ Symfony API │────▶│ PostgreSQL │
│ │ │ │ │ + PostGIS │
└─────────────────┘ └─────────────────┘ └─────────────────┘


┌─────────────┐
│ Redis │
│ (Cache) │
└─────────────┘

Stack Técnica

Frontend

TecnologiaVersãoUso
React18.xFramework UI
TypeScript5.xTipagem estática
TanStack Query5.xGestão de requisições API
Zustand4.xGerenciamento de estado
Tailwind CSS3.xFramework CSS
Leaflet1.9Cartografia
Recharts2.xGráficos

Backend

TecnologiaVersãoUso
PHP8.3Linguagem servidor
Symfony6.4Framework PHP
API Platform3.xAPI REST automática
Doctrine ORM2.xMapeamento objeto-relacional
LexikJWT2.xAutenticação JWT

Banco de dados

TecnologiaVersãoUso
PostgreSQL15SGBD relacional
PostGIS3.4Extensão geoespacial

Infraestrutura

TecnologiaVersãoUso
Docker24.xContainerização
Nginx1.25Servidor web / Proxy reverso
Redis7Cache e sessões

Arquitetura dos Contêineres

┌─────────────────────────────────────────────────────────────┐
│ Rede Docker │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ pch_frontend│ │pch_nginx_ │ │ pch_backend │ │
│ │ (Nginx) │───▶│ backend │───▶│ (PHP-FPM) │ │
│ │ :80 │ │ :8000 │ │ :9000 │ │
│ └─────────────┘ └─────────────┘ └──────┬──────┘ │
│ │ │
│ ┌─────────────────────────┼─────────┐ │
│ │ │ │ │
│ ┌─────▼─────┐ ┌───────▼───────┐ │ │
│ │pch_postgres│ │ pch_redis │ │ │
│ │ :5432 │ │ :6379 │ │ │
│ └───────────┘ └───────────────┘ │ │
│ │ │
└─────────────────────────────────────────────────────────────┘

Fluxo de requisições

  1. O cliente acessa o frontend via porta 80 (ou 3000)
  2. As requisições /api/* são encaminhadas para o backend (porta 8000)
  3. O Nginx backend passa as requisições PHP para o PHP-FPM
  4. O PHP-FPM consulta PostgreSQL e Redis
  5. A resposta retorna ao cliente

Arquitetura do Backend

Estrutura de pastas

backend/
├── bin/ # Scripts de console
├── config/ # Configuração Symfony
│ ├── packages/ # Config dos bundles
│ └── routes/ # Rotas
├── migrations/ # Migrações Doctrine
├── public/ # Ponto de entrada web
├── src/
│ ├── Controller/ # Controladores API
│ ├── Entity/ # Entidades Doctrine
│ ├── Repository/ # Repositórios
│ ├── Service/ # Serviços de negócio
│ ├── Security/ # Voters, Authenticators
│ └── EventListener/ # Listeners
└── var/ # Cache e logs

Entidades principais

┌───────────────┐     ┌───────────────┐     ┌───────────────┐
│ Menage │────▶│ ChefMenage │ │ Logement │
│ │ │ │ │ │
│ - codeMenage │ │ - nomComplet │ │ - typeLogement│
│ - tailleMenage│ │ - telephone │ │ - nbPieces │
│ - scorePmt │ │ - age │ │ - sourceEau │
└───────┬───────┘ └───────────────┘ └───────────────┘

│ 1:N

┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ MembreMenage │ │ Beneficiaire │────▶│ Paiement │
│ │ │ │ │ │
│ - nomComplet │ │ - actif │ │ - montant │
│ - lienParente │ │ - modePaiement│ │ - statut │
└───────────────┘ └───────┬───────┘ └───────────────┘

│ N:1

┌───────────────┐
│ Cycle │
│ │
│ - nom │
│ - statut │
│ - montantTotal│
└───────────────┘

Arquitetura do Frontend

Estrutura de pastas

frontend/
├── public/ # Assets estáticos
├── src/
│ ├── components/ # Componentes reutilizáveis
│ ├── layouts/ # Layouts (MainLayout)
│ ├── pages/ # Páginas por módulo
│ │ ├── menages/
│ │ ├── beneficiaires/
│ │ ├── paiements/
│ │ └── ...
│ ├── services/ # Cliente API (axios)
│ ├── stores/ # Zustand stores
│ ├── utils/ # Utilitários
│ └── App.tsx # Ponto de entrada
└── package.json

Fluxo de dados

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ Páginas │───▶│ Stores │───▶│ Serviços │
│ │ │ (Zustand) │ │ (API) │
└─────────────┘ └─────────────┘ └──────┬──────┘
│ │
│ ▼
│ ┌─────────────┐
└──────────────────────────────▶│ Backend │
TanStack Query │ API │
└─────────────┘

Segurança

Autenticação

  • JWT (JSON Web Tokens) via LexikJWTAuthenticationBundle
  • Token de acesso (1 hora) + Refresh token (7 dias)
  • Armazenamento do token em localStorage

Autorização

  • Permissões granulares formato módulo.ação
  • Voters Symfony para lógica de autorização
  • Verificação no frontend e backend

Proteção de dados

  • Criptografia HTTPS em produção
  • Senhas com hash bcrypt
  • Proteção CSRF em formulários
  • Validação de entradas

Escalabilidade

Horizontal

  • Frontend: CDN ou múltiplas instâncias Nginx
  • Backend: Load balancer + múltiplos PHP-FPM
  • Banco de dados: Réplicas de leitura PostgreSQL

Vertical

  • Aumento de recursos CPU/RAM
  • Otimização de consultas SQL
  • Cache Redis

Próximos passos