Arquitetura Técnica
Arquitetura funcional
| Módulo | Função |
|---|---|
| Registo social (RSU) | Agregados, membros, habitação; importação por recolha (Kobo, Survey Solutions, ficheiros) e pré-recolha |
| Focalização e elegibilidade | Pontuação PMT por projeto, regras de elegibilidade por programa |
| Beneficiários | Inscrição, documentos de identidade, ciclo de vida |
| Programas e transferências | Ciclos de transferência, pagamentos, reconciliação com os operadores (ficheiros ST/CT) |
| Reclamações (MGR) | Fluxo configurável, escalonamento, reclamações sensíveis EAS/AS, modo offline |
| Monitorização e avaliação | Atividades PTBA, indicadores, riscos, missões, relatórios |
| Agentes comunitários | Registo, atividades, pagamentos das cuidadoras |
| Mapa | Visualização geográfica |
| Assistente Bemba | Assistente conversacional (Claude) com ferramentas tipadas e base documental |
| Site público | Páginas públicas, notícias, números, reclamação em linha |
Arquitetura técnica
Percurso de um pedido
- O navegador chama
https://bemba.ucp-pch.org. O Traefik termina o TLS (certificado Let's Encrypt). - Os caminhos
/apie/photossão encaminhados parapch_backend(porta 8000), todo o resto parapch_frontend(build React).mariacare.ucp-pch.orgesig.ucp-pch.orgsão redirecionados parabemba.ucp-pch.org. - Em
pch_backend, o Nginx passa ao PHP-FPM; o Symfony consulta o PostgreSQL (e o Redis para a cache). - Os e-mails e os tratamentos longos são colocados em fila (Symfony Messenger, transporte Doctrine) e consumidos pelos workers lançados pelo supervisord no mesmo contentor. Nenhum e-mail é enviado durante um pedido.
Processos do contentor backend
O supervisord lança: Nginx, PHP-FPM, messenger:consume async (e-mails, tarefas) e messenger:consume scheduler_plaintes scheduler_transferts (tarefas planeadas: reclamações, e recorrência das transferências todos os dias às 6 h). No arranque, o entrypoint verifica as chaves JWT, espera pela base, executa as migrações pendentes, prepara a cache e devolve os direitos de var/ a www-data.
Stack
Frontend
| Tecnologia | Versão | Uso |
|---|---|---|
| React | 18 | Interface |
| TypeScript | 5 | Tipagem |
| TanStack Query | 5 | Pedidos e cache do lado do cliente |
| Zustand | 4 | Estado global |
| Tailwind CSS | 3 | Estilos |
| React Router | 6 (HashRouter, URL em /#/…) | Navegação |
| i18next | 23 | Francês, português, inglês |
| Leaflet, Recharts | 1.9, 2 | Mapas, gráficos |
| Sentry | 10 | Notificação de erros |
| Service worker | — | Cache dos recursos e modo offline (reclamações) |
Backend
| Tecnologia | Versão | Uso |
|---|---|---|
| PHP | 8.3 (FPM, Alpine) | Linguagem |
| Symfony | 7 | Framework, Messenger, Scheduler, Mailer |
| API Platform | 3 | Parte dos recursos REST |
| Doctrine ORM | 3 | Persistência, migrações |
| LexikJWT + Gesdinet | 2 / 1.5 | Token de acesso (1 h) e token de renovação |
| Sentry | 5 | Erros do servidor |
Os identificadores das entidades são UUID Ramsey (Ramsey\Uuid\UuidInterface).
Dados e infraestrutura
| Tecnologia | Versão | Uso |
|---|---|---|
| PostgreSQL + PostGIS | 15 + 3.4 | Base pch_sig |
| Redis | 7 | Cache |
| Traefik | 2.10 | Proxy inverso, HTTPS |
| Docker + Compose v2 | — | Contentores (sempre -f) |
| Loki + Promtail | 2.9 | Registos, retenção de um ano |
Segurança em resumo
- Autenticação: JWT assinado (RS256), transmitido por cookie HttpOnly ou cabeçalho
Authorization; renovação automática. Ver autenticação JWT. - Autorização: permissões
module.actionverificadas por um voter Symfony, e compartimentação dos dados por instituição e por projeto (CloisonnementService), verificada também objeto a objeto. - Respostas: 401 sem sessão, 403 com sessão mas sem direito, 404 para um identificador mal formado.
- Navegador: política de segurança de conteúdo (CSP) aplicada pelo Nginx do frontend; as fotos só são servidas por ligação assinada válida 12 h.
- Limitação de pedidos no início de sessão (bloqueio da conta), no assistente e no site público. Ver limitação de pedidos.
Estrutura do repositório
pch-sig/
├── backend/ # Symfony (src/, config/, migrations/, docker/, Dockerfile.prod)
├── frontend/ # React (src/pages, src/components, src/services, src/i18n)
├── documentation/ # Este site (Docusaurus), esquemas (diagrams/), vídeos (videos/)
├── nginx/ # Configuração Nginx do frontend (CSP)
├── monitoring/ # Grafana / Prometheus para o posto de administração
├── docs/ # Documentos internos (HANDOVER, implantação, segredos, QA…)
├── docker-compose.prod.yml
└── docker-compose.preprod.yml