Architecture
Trois couches : un host frontend, un core en Rust, et PostgreSQL. Les modules se branchent dessus comme des processus autonomes.
Vue d'ensemble #
Frontend host (React 19) ── import map ──► modules chargés au runtime (/modules/<id>/entry.js)
│
Core (Rust / Axum) ── reverse-proxy + events + auth + storage ──► modules (processus séparés)
│
PostgreSQL 16 (schéma par module · LISTEN/NOTIFY · jobs SKIP LOCKED)Le core #
Le core (crate kubuno-core) gère l'authentification (JWT + refresh tokens), le stockage (trait StorageBackend : local ou S3), les événements temps réel, le WebSocket par utilisateur et le reverse-proxy vers les modules. Il expose des registries partagés que les modules alimentent côté frontend.
Les ports #
Le core écoute sur 8080. Chaque module a un port fixe sur 127.0.0.1 :
| Module | Port | Module | Port |
|---|---|---|---|
| drive | 3101 | contacts | 3110 |
| calendar | 3102 | 3111 | |
| photos | 3103 | code | 3112 |
| notes | 3104 | media | 3113 |
| office | 3105 | keestore | 3114 |
| paintsharp | 3106 | maps | 3115 |
| jarvis | 3107 | tasks | 3116 |
| forms | 3108 | forum | 3117 |
| chat | 3109 | flow | 3118 |
PostgreSQL, triple emploi #
- Base de données — un schéma dédié par module, aucune table en dehors.
- Bus d'événements — via
LISTEN/NOTIFY. - File de jobs — via
SELECT … FOR UPDATE SKIP LOCKED.
Astuce
Pas de Redis, pas de broker externe : PostgreSQL suffit. C'est un choix d'architecture délibéré.