No results
2
Architecture
Claude edited this page 2026-05-16 12:31:26 +02:00
Architecture
Vue d'ensemble
Navigateur
├── HTTPS → Nginx → React SPA (Vite, TypeScript)
├── /api/* → FastAPI backend (REST)
├── /ws → WebSocket backend
└── /files/* → FastAPI backend (fichiers uploadés)
Backend FastAPI
├── PostgreSQL (SQLAlchemy async + Alembic migrations)
├── Redis (sessions IRC, membres channels, pub/sub WS)
├── pydle (client IRC async)
└── Plugins (RestrictedPython sandbox)
Stack technique
Backend
| Composant | Rôle |
|---|---|
| Python 3.12 | Langage |
| FastAPI | Framework API REST + WebSocket |
| SQLAlchemy 2.x async | ORM |
| Alembic | Migrations de base de données |
| pydle | Client IRC async |
| aioredis | Cache et pub/sub |
| httpx | Requêtes HTTP async (proxy image, plugins) |
| aiofiles | I/O fichiers async |
| RestrictedPython | Sandbox plugins |
| pydantic-settings | Configuration via .env |
Frontend
| Composant | Rôle |
|---|---|
| React 18 | UI |
| Vite 5 | Build tool |
| TypeScript 5 | Typage |
| TailwindCSS 3 | Styles |
| Zustand 5 | State management |
| react-router-dom 7 | Routing |
| vite-plugin-pwa | Service Worker + push notifications |
Modèles de données
| Modèle | Description |
|---|---|
User |
Compte utilisateur, is_admin, ui_preferences (JSONB) |
Network |
Réseau IRC (host, port, nick, TLS) |
Channel |
Channel IRC rejoint |
Message |
Message IRC persisté |
FileRecord |
Métadonnées fichier uploadé (UUID, provider, URL) |
Plugin |
Plugin installé (manifest, enabled) |
UserScript |
Script NoxScript utilisateur |
AppSetting |
Paramètres système clé/valeur |
PushSubscription |
Subscription Web Push par navigateur |
Theme |
Thème visuel (tokens CSS) |
PluginAuditLog |
Journal d'audit des plugins |
Flux d'un message IRC reçu
1. pydle reçoit le TCP depuis le serveur IRC
2. on_message() dans irc/client.py
├── Détection mention (highlight)
├── Sauvegarde en PostgreSQL
├── Publish Redis pub/sub {"type": "MESSAGE", ...}
3. irc/bridge.py consomme le pub/sub
4. Pousse l'événement WS à tous les clients connectés
5. Frontend useWebSocket reçoit l'événement
6. Zustand store mis à jour → React re-render
Authentification
- Access token : JWT, expire après 60 min (configurable)
- Refresh token : JWT longue durée (7j), stocké côté client
- Blacklist : refresh tokens révoqués stockés dans Redis avec TTL
- WebSocket : token JWT passé en query param
?token=
Gestion des sessions IRC
- Une instance
NoxIRCClient(pydle) par connexion réseau/utilisateur - Membres des channels cachés dans Redis :
irc:members:{network_id}:{channel} - Le pub/sub Redis connecte les clients IRC aux WebSockets des utilisateurs
Service Worker (PWA)
Le frontend est une PWA avec un Service Worker (sw.ts) qui gère :
- Les notifications push (via Web Push API / VAPID)
- Le precaching des assets statiques
- Le focus de fenêtre au clic sur une notification