Architecture technique RaciFlow
Stack technique
| Couche | Technologie | Version |
|---|---|---|
| Runtime | Node.js | 22 (Alpine) |
| Langage | TypeScript | 5.9 |
| Frontend | React | 19 |
| Bundler frontend | Vite | 7 |
| Bundler backend | esbuild | 0.25 |
| Serveur HTTP | Express | 4 |
| API | tRPC | 11 |
| ORM | Drizzle ORM | 0.44 |
| Base de donnees | PostgreSQL | 16 (Alpine) |
| Cache | Redis | 7 (Alpine) |
| Reverse proxy | Caddy | 2 (Alpine) |
| Gestionnaire de paquets | pnpm | 10.4.1 |
| Monitoring | Sentry | SDK 10 |
| UI | Radix UI, Tailwind CSS 4, shadcn/ui | |
| Validation | Zod | 4 |
| Authentification | JWT (jose) + bcryptjs |
Containers Docker
L’application est decomposee en 4 containers :
raci-flow-app
- Image : Construite via Dockerfile multi-stage (Node 22 Alpine)
- Port interne : 3000
- Role : Serveur Express qui sert le frontend React (build Vite statique) et expose l’API tRPC
- Healthcheck :
wget --spider -q http://localhost:3000toutes les 30s - Reseaux :
proxy+internal
raci-flow-postgres
- Image :
postgres:16-alpine - Role : Base de donnees relationnelle principale
- Volume :
postgres_datamonte sur/var/lib/postgresql/data - Healthcheck :
pg_isreadytoutes les 10s - Reseau :
internaluniquement
raci-flow-redis
- Image :
redis:7-alpine - Role : Cache et sessions (usage futur)
- Commande :
redis-server --appendonly yes(persistance AOF) - Volume :
redis_datamonte sur/data - Healthcheck :
redis-cli pingtoutes les 10s - Reseau :
internaluniquement
caddy-proxy
- Image :
caddy:2-alpine - Role : Reverse proxy HTTPS avec TLS automatique (Let’s Encrypt)
- Ports exposes : 80, 443 (TCP + UDP pour HTTP/3 QUIC)
- Healthcheck :
curl -sf http://localhost:2019/config/toutes les 30s - Reseau :
proxy
Reseaux Docker
| Reseau | Type | Role |
|---|---|---|
proxy |
externe (partage) | Communication entre Caddy et l’application |
internal |
bridge (isole) | Communication entre l’application, PostgreSQL et Redis |
Le reseau proxy est declare comme external: true et partage entre le compose de Caddy et celui de l’application. Le reseau internal est isole et n’est pas accessible depuis l’exterieur.
Domaine et TLS
- Domaine :
app.raciflow.com - TLS : Automatique via Caddy (Let’s Encrypt / ZeroSSL)
- Reverse proxy :
app.raciflow.com->raci-flow-app:3000 - IP directe : Retourne 404 (protection contre l’acces par IP
72.62.185.121)
Schema d’architecture
Internet
|
v
[Caddy :443] ── reseau proxy ── [raci-flow-app :3000]
|
reseau internal
/ \
[PostgreSQL :5432] [Redis :6379]
Structure du code source
/opt/raci-flow/
├── client/ # Frontend React (Vite)
│ ├── src/ # Code source React
│ └── public/ # Assets statiques
├── server/ # Backend Express + tRPC
│ ├── _core/ # Entrypoint, config, middleware
│ ├── routers/ # Routes tRPC
│ └── lib/ # Utilitaires serveur
├── shared/ # Code partage client/serveur
├── drizzle/ # Schema DB + migrations
├── scripts/ # Scripts utilitaires
├── dist/ # Build de production
└── docs/ # Documentation