Architecture #
Overview #
Navigateur
↓
Nginx :8080
├── SPA React / TypeScript / Vite / Material UI
└── API Symfony / PHP-FPM
├── PostgreSQL
├── Redis → Symfony Messenger
├── stockage documentaire privé
└── SMTP / Gmail API / Microsoft GraphNginx is the single entry point to the compose. PostgreSQL is the source of truth. Redis uses AOF and transports messages asynchronously.
Secure feed #
Symfony checks JWT signature, session, account activity and role. The controller resolves each relationship in the current organization; repositories filter reads by tenant. The audit log records sensitive mutations.
Roles and documents #
SUPER_ADMIN → ADMIN → RISK_MANAGER → VIEWER. AUDITOR and ACTION_OWNER inherit reading. The documents add ACLs READ, EDIT, and MANAGE.
Evolution rules #
Any resource must filter by organization, revalidate relationships, authorize API side, log mutations, migrate schema, and provide tenant/RBAC testing.
Asynchronous flows #
The backend publishes emails to Redis; the Messenger worker consumes them and selects SMTP, Gmail or Microsoft Graph depending on the tenant. The scheduler executes acceptance expirations and review reminders. A worker failure does not necessarily prevent business change: watch the queue.
Network #
Nginx exposes 8080. PostgreSQL, Redis, PHP-FPM and Vite remain private to the Docker network. In production, an external reverse proxy terminates TLS. Never directly expose base, Redis or PHP-FPM.
Scalability and recovery #
Application services can be reconstructed from images; data resides in PostgreSQL, Redis, documents and JWT keys. Any scaling must preserve sessions, asynchronous transport, and access to shared storage.
Architectural controls #
Check service health, migrations, tenant isolation, API permissions, persistent volumes, Messenger processing, scheduler and HTTPS termination after each delivery.