Architecture - its-abdou/slack-clone GitHub Wiki
- Frontend (React) : Interface utilisateur réactive avec communication HTTPS REST vers le backend
- Backend (Express.js) : API REST qui orchestre les services externes et la base de données
-
Services Externes :
- Clerk pour l'authentification
- Stream pour le chat et la vidéo en temps réel
- Inngest pour les tâches asynchrones
- Sentry pour le monitoring
- Data Layer (MongoDB) : Stockage persistant des données utilisateurs et configurations
- Deployment : CI/CD via GitHub Actions, conteneurisation Docker, hébergement sur Google Cloud Run
slack-clone/
├── backend/
│ ├── src/
│ │ ├── config/ # Configuration (DB, Stream, Inngest)
│ │ ├── controllers/ # Logique métier
│ │ ├── middleware/ # Auth middleware
│ │ ├── models/ # Schémas MongoDB
│ │ ├── routes/ # Routes API
│ │ └── server.js # Point d'entrée
│ ├── tests/ # Tests Jest
│ └── Dockerfile
│
├── frontend/
│ ├── src/
│ │ ├── components/ # Composants React
│ │ ├── pages/ # Pages (Auth, Home, Call)
│ │ ├── providers/ # Context providers
│ │ ├── hooks/ # Custom hooks
│ │ └── lib/ # Utilitaires
│ └── Dockerfile
│
├── .github/workflows/ # CI/CD
└── docker-compose.yml
sequenceDiagram
actor User
participant Browser
participant Clerk
participant Backend
participant Stream
User->>Browser: Access Application
Browser->>Clerk: Display Sign-In Widget
User->>Clerk: Enter Credentials
Clerk->>Clerk: POST /api/auth/sign-in
Clerk->>Browser: JWT Token Generated
Browser->>Browser: Store Token (Cookies/LocalStorage)
Browser->>Backend: Request with userId & session
Backend->>Backend: GET /api/chat/token
Backend->>Stream: Request Stream Token
Stream->>Backend: Stream Token (JWT)
Backend->>Browser: Return Stream Token
Browser->>Browser: Initialize Stream Chat Client
Points clés :
- Clerk gère toute la logique d'authentification (OAuth, MFA, etc.)
- Le backend génère des tokens Stream spécifiques pour chaque utilisateur
- Les tokens sont stockés de manière sécurisée côté client
sequenceDiagram
participant UserA as User A
participant SDK as Stream SDK
participant Backend
participant StreamAPI as Stream API
participant UserB as User B
UserA->>SDK: Send Message
SDK->>StreamAPI: Publish Message
StreamAPI->>StreamAPI: Store in Stream DB
StreamAPI->>Backend: Webhook Event (message.new)
Backend->>Backend: Process Event
StreamAPI-->>UserA: WebSocket Broadcast
StreamAPI-->>UserB: WebSocket Broadcast
UserB->>UserB: UI Updates (React State)
UserB->>UserB: Display Notification
Caractéristiques :
- Communication bidirectionnelle via WebSocket
- Persistence automatique dans Stream Cloud
- Webhooks pour intégrations backend (analytics, modération, etc.)
- Synchronisation temps réel entre tous les clients connectés
sequenceDiagram
participant UserA as User A (Initiator)
participant FrontendA as Frontend A
participant Backend
participant StreamVideo as Stream Video API
participant FrontendB as Frontend B
participant UserB as User B (Receiver)
UserA->>FrontendA: Click "Start Call"
FrontendA->>FrontendA: Navigate to /call/:callId
FrontendA->>Backend: GET /api/chat/token
Backend->>StreamVideo: Request Video Token
StreamVideo->>Backend: Video Token
Backend->>FrontendA: Return Token
FrontendA->>StreamVideo: Initialize StreamVideoClient
FrontendA->>StreamVideo: Create/Join Call
StreamVideo->>StreamVideo: Allocate SFU Resources
StreamVideo->>FrontendB: Send Call Notification
UserB->>FrontendB: Accept Call
FrontendB->>FrontendB: Navigate to /call/:callId
FrontendB->>StreamVideo: Join Call
StreamVideo->>FrontendA: WebRTC Connection
StreamVideo->>FrontendB: WebRTC Connection
Note over FrontendA,FrontendB: P2P Audio/Video Streams<br/>Screen Sharing<br/>Real-time Reactions<br/>Call Recording
Technologies utilisées :
- WebRTC pour les flux média peer-to-peer
- SFU (Selective Forwarding Unit) géré par Stream pour optimiser la bande passante
- Support de multiples participants avec scalabilité automatique
sequenceDiagram
participant Clerk
participant Backend
participant Inngest as Inngest Server
participant Handler as Function Handler
participant Stream
Clerk->>Backend: Webhook: User Created
Backend->>Inngest: Trigger Event (user.created)
Inngest->>Inngest: Queue Job
Inngest->>Handler: Execute Function
Handler->>Stream: Upsert User in Stream
Stream->>Handler: User Created
Handler->>Stream: Add User to Public Channels
Stream->>Handler: Success
Handler->>Inngest: Job Complete
Inngest->>Backend: Event Processed
Backend->>Backend: User Ready
Cas d'usage des jobs :
- Onboarding utilisateur : Création dans Stream, ajout aux canaux par défaut
- Notifications asynchrones : Envoi d'emails, push notifications
- Nettoyage : Suppression de messages anciens, archivage
- Analytics : Agrégation de métriques, rapports quotidiens
Avantages d'Inngest :
- Retry automatique en cas d'échec
- Scheduling (jobs planifiés)
- Monitoring et debugging intégré
- Pas besoin de gérer une queue Redis/RabbitMQ
-
Authentification
- Clerk JWT tokens avec rotation automatique
- Middleware
protectRoutesur toutes les routes sensibles - Validation côté serveur avec vérification des claims
-
CORS
- Whitelist des origines autorisées (production uniquement)
-
credentials: truepour cookies sécurisés - Headers strictement contrôlés
-
Variables d'environnement
- Secrets stockés dans GitHub Secrets et Google Secret Manager
- Pas de hardcoding de credentials
- Validation via
env.jsau démarrage
-
Error Monitoring
- Sentry pour tracking d'erreurs production
- PII (Personally Identifiable Information) excluded des logs
- Alertes temps réel pour erreurs critiques
-
Rate Limiting
- Stream API rate limits configurés
- Cloud Run auto-scaling avec limites de concurrence
- Protection DDoS via Cloud Armor (optionnel)
| Aspect | Solution | Bénéfice |
|---|---|---|
| Horizontal Scaling | Cloud Run auto-scale | Adaptation automatique au trafic |
| CDN | Assets statiques via Nginx | Latence réduite pour utilisateurs globaux |
| Lazy Loading | Code splitting avec Vite | Temps de chargement initial optimisé |
| WebSocket | Connexions persistantes | Temps réel sans polling |
| Database Indexing | MongoDB indexes sur userId, channelId | Requêtes 10x plus rapides |
| Caching | React Query cache côté client | Réduction de 80% des appels API |
- Frontend : Core Web Vitals (LCP, FID, CLS) via Sentry
- Backend : Temps de réponse API, taux d'erreur, utilisation CPU/RAM
- Database : Slow queries, taille de collection, index hit ratio
- Stream : Messages/seconde, durée moyenne des appels, qualité vidéo
- Taux d'erreur > 5% sur 5 minutes
- Temps de réponse > 2s sur endpoints critiques
- CPU > 80% pendant 10 minutes
- Échec de déploiement CI/CD
Retour à Home | Précédent : Présentation | Suivant : Veille Technologique