Arquitetura Técnica
Esta página descreve a arquitetura técnica do 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
| Tecnologia | Versão | Uso |
|---|---|---|
| React | 18.x | Framework UI |
| TypeScript | 5.x | Tipagem estática |
| TanStack Query | 5.x | Gestão de requisições API |
| Zustand | 4.x | Gerenciamento de estado |
| Tailwind CSS | 3.x | Framework CSS |
| Leaflet | 1.9 | Cartografia |
| Recharts | 2.x | Gráficos |
Backend
| Tecnologia | Versão | Uso |
|---|---|---|
| PHP | 8.3 | Linguagem servidor |
| Symfony | 6.4 | Framework PHP |
| API Platform | 3.x | API REST automática |
| Doctrine ORM | 2.x | Mapeamento objeto-relacional |
| LexikJWT | 2.x | Autenticação JWT |
Banco de dados
| Tecnologia | Versão | Uso |
|---|---|---|
| PostgreSQL | 15 | SGBD relacional |
| PostGIS | 3.4 | Extensão geoespacial |
Infraestrutura
| Tecnologia | Versão | Uso |
|---|---|---|
| Docker | 24.x | Containerização |
| Nginx | 1.25 | Servidor web / Proxy reverso |
| Redis | 7 | Cache 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
- O cliente acessa o frontend via porta 80 (ou 3000)
- As requisições
/api/*são encaminhadas para o backend (porta 8000) - O Nginx backend passa as requisições PHP para o PHP-FPM
- O PHP-FPM consulta PostgreSQL e Redis
- 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