Pular para o conteúdo principal

Arquitetura Técnica

Arquitetura funcional​

Arquitetura funcional do Bemba

MóduloFunção
Registo social (RSU)Agregados, membros, habitação; importação por recolha (Kobo, Survey Solutions, ficheiros) e pré-recolha
Focalização e elegibilidadePontuação PMT por projeto, regras de elegibilidade por programa
BeneficiáriosInscrição, documentos de identidade, ciclo de vida
Programas e transferênciasCiclos 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çãoAtividades PTBA, indicadores, riscos, missões, relatórios
Agentes comunitáriosRegisto, atividades, pagamentos das cuidadoras
MapaVisualização geográfica
Assistente BembaAssistente conversacional (Claude) com ferramentas tipadas e base documental
Site públicoPáginas públicas, notícias, números, reclamação em linha

Arquitetura técnica​

Arquitetura técnica

Percurso de um pedido​

  1. O navegador chama https://bemba.ucp-pch.org. O Traefik termina o TLS (certificado Let's Encrypt).
  2. Os caminhos /api e /photos são encaminhados para pch_backend (porta 8000), todo o resto para pch_frontend (build React). mariacare.ucp-pch.org e sig.ucp-pch.org são redirecionados para bemba.ucp-pch.org.
  3. Em pch_backend, o Nginx passa ao PHP-FPM; o Symfony consulta o PostgreSQL (e o Redis para a cache).
  4. 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​

TecnologiaVersãoUso
React18Interface
TypeScript5Tipagem
TanStack Query5Pedidos e cache do lado do cliente
Zustand4Estado global
Tailwind CSS3Estilos
React Router6 (HashRouter, URL em /#/…)Navegação
i18next23Francês, português, inglês
Leaflet, Recharts1.9, 2Mapas, gráficos
Sentry10Notificação de erros
Service worker—Cache dos recursos e modo offline (reclamações)

Backend​

TecnologiaVersãoUso
PHP8.3 (FPM, Alpine)Linguagem
Symfony7Framework, Messenger, Scheduler, Mailer
API Platform3Parte dos recursos REST
Doctrine ORM3Persistência, migrações
LexikJWT + Gesdinet2 / 1.5Token de acesso (1 h) e token de renovação
Sentry5Erros do servidor

Os identificadores das entidades são UUID Ramsey (Ramsey\Uuid\UuidInterface).

Dados e infraestrutura​

TecnologiaVersãoUso
PostgreSQL + PostGIS15 + 3.4Base pch_sig
Redis7Cache
Traefik2.10Proxy inverso, HTTPS
Docker + Compose v2—Contentores (sempre -f)
Loki + Promtail2.9Registos, 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.action verificadas 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