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