┌─┐ ║"│ └┬┘ ┌┼┐ ┌────────────────┐ ┌───────────────────┐ ┌──────────────┐ ┌─────────────┐ │ │Nginx │ │Node SSR │ │FastAPI │ │PostgreSQL │ ┌┴┐ │(showcase-proxy)│ │(showcase-frontend)│ │(showcase-api)│ │(showcase-db)│ Navigateur Utilisateur └────────┬───────┘ └─────────┬─────────┘ └───────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ ╔══════════════════╧══╗ │ │ ════════════════════════════════╪═══════════════════════════════╪══════════════════════╣ Flux Page Web (SSR) ╠═════════════════════════════════╪═════════════════════════╪═══════════════════════════ │ │ ╚══════════════════╤══╝ │ │ │ │ │ │ │ │ GET / │ │ │ │ │──────────────────────────────>│ │ │ │ │ │ │ │ │ │ proxy_pass http://showcase-frontend:3000 ┌┴┐ │ │ │ │──────────────────────────────────────> │ │ │ │ │ │ │ │ │ │ │ │ │ │HTTP GET http://showcase-api:8000/┌┴┐ │ │ │ │ │ ────────────────────────────────>│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │Query showcase-db:5432 ┌┴┐ │ │ │ │ │ │ ─────────────────────>│ │ │ │ │ │ │ │ └┬┘ │ │ │ │ │ │ Data result │ │ │ │ │ │ │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ │ │ └┬┘ │ │ │ │ │ JSON Response │ │ │ │ │ │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ └┬┘ │ │ │ │ HTML Rendered Page │ │ │ │ │<─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ │ │ │ │ │ │ HTTP 200 OK (Page) │ │ │ │ │<─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╔═══════════════════════╧═══════╗ │ │ ════════════════════════════════╪═══════════════════════════════╪═════════════════╣ Flux API Directe (avec Cache) ╠════════════════════════════╪═════════════════════════╪═══════════════════════════ │ │ ╚═══════════════════════╤═══════╝ │ │ │ │ │ │ │ │ GET /api/status │ │ │ │ │──────────────────────────────>│ │ │ │ │ │ │ │ │ │ │────┐ │ │ │ │ │ │ Check Cache (X-Cache-Status) │ │ │ │ │<───┘ │ │ │ │ │ │ │ │ │ │ │ │ │ ╔══════╤══════════════╪═══════════════════════════════╪═════════════════════════════════════════╪════════════════════════════════════╪═════════════════════════╪════════════════╗ ║ ALT │ Cache HIT │ │ │ │ │ ║ ╟──────┘ │ │ │ │ │ ║ ║ │ HTTP 200 OK (Cached JSON) │ │ │ │ ║ ║ │<─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ │ ║ ╠═════════════════════╪═══════════════════════════════╪═════════════════════════════════════════╪════════════════════════════════════╪═════════════════════════╪════════════════╣ ║ [Cache MISS] │ │ │ │ │ ║ ║ │ │ rewrite & proxy_pass http://showcase-api:8000/status ┌┴┐ │ ║ ║ │ │────────────────────────────────────────────────────────────────────────────>│ │ │ ║ ║ │ │ │ │ │ │ ║ ║ │ │ │ │ │Query showcase-db:5432 ┌┴┐ ║ ║ │ │ │ │ │ ─────────────────────>│ │ ║ ║ │ │ │ │ │ └┬┘ ║ ║ │ │ │ │ │ Data result │ ║ ║ │ │ │ │ │ <─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ║ ║ │ │ │ └┬┘ │ ║ ║ │ │ JSON Response │ │ ║ ║ │ │<─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─│ │ ║ ║ │ │ │ │ │ ║ ║ │ │────┐ │ │ │ ║ ║ │ │ │ Store in Cache (10s) │ │ │ ║ ║ │ │<───┘ │ │ │ ║ ║ │ │ │ │ │ ║ ║ │ HTTP 200 OK (Fresh JSON) │ │ │ │ ║ ║ │<─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ │ ║ ╚═════════════════════╪═══════════════════════════════╪═════════════════════════════════════════╪════════════════════════════════════╪═════════════════════════╪════════════════╝ │ │ │ │ │ │ ╔════════╧═════════════════════════════════════════╧════════════════════════════════════╧═════════════════════════╧════════╗ │ ║Communication interne via le réseau externe: showcase-net ░║ │ ║Seul le port 80 du Proxy est exposé à l'utilisateur ║ │ ╚════════╤═════════════════════════════════════════╤════════════════════════════════════╤═════════════════════════╤════════╝ │ │ │ │ │