Zum Inhalt springen

Architektur-Übersicht

Rebase ist eine Full-Stack-Plattform mit vier Schichten:

┌─────────────────────────────────────────────────────────────────┐
│ Frontend-Schicht │
│ React Admin UI • Custom Views • Plugins • Ihre App │
│ @rebasepro/core • @rebasepro/ui • @rebasepro/studio │
└───────────────────────────┬─────────────────────────────────────┘
│ HTTP + WebSocket
┌─────────────────────────────────────────────────────────────────┐
│ Backend-Schicht │
│ Hono HTTP Server • REST API • Auth • Speicher • WS │
│ @rebasepro/server-core │
└───────────────────────────┬─────────────────────────────────────┘
│ Drizzle ORM
┌─────────────────────────────────────────────────────────────────┐
│ Datenbank-Schicht │
│ PostgreSQL • Tabellen • RLS-Richtlinien • Echtzeitsync │
└─────────────────────────────────────────────────────────────────┘

Das Backend wird über ein einheitliches Datenbank-Adapter-Muster initialisiert. Die datenbankspezifische Logik ist in ihr eigenes Paket entkoppelt, und der Adapter kümmert sich automatisch um Connection Pooling, Schemaauflösung und Event-Routing in Echtzeit.

import { createPostgresAdapter } from "@rebasepro/server-postgresql";
database: createPostgresAdapter({
connectionString: process.env.DATABASE_URL!
})

Sammlungen werden automatisch über die interne Dependency-Injection-Registrierung mit dem konfigurierten Adapter aufgelöst.

Das BackendCollectionRegistry ist der Laufzeitindex aller Sammlungen, ihrer PostgreSQL-Tabellen, Enums und Drizzle-Relationen. Es wird beim Start aus Ihren Sammlungsdefinitionen befüllt.

Die Echtzeitsynchronisierung nutzt den nativen LISTEN/NOTIFY-Mechanismus von PostgreSQL:

  1. Eine Datenmutation findet statt (Einfügen, Aktualisieren, Löschen)
  2. Das Backend sendet ein NOTIFY auf einem Kanal
  3. Der RealtimeService empfängt die Benachrichtigung
  4. Er überträgt die Änderung an alle verbundenen WebSocket-Clients
  5. React-Komponenten rendern neu mit den neuen Daten

Für Multi-Instance-Deployments (z.B. Cloud Run mit mehreren Replikaten) geben Sie eine connectionString in Ihrem PostgresBootstrapper an, damit alle Replikate dieselbe LISTEN-Verbindung teilen.

Wie Treiber werden auch Speicher-Backends in einer Registrierung erfasst. Sie können mehrere Speicheranbieter (lokal, S3) haben und verschiedene Dateifelder über storageId an verschiedene Backends leiten.

PaketRolleVerwendet von
@rebasepro/typesTypeScript-Schnittstellen für Sammlungen, Eigenschaften, Entitäten, PluginsAlles
@rebasepro/backendBackend-Serverinitialisierung, REST-API, Auth, Speicher, WebSocketBackend
@rebasepro/clientClient-SDK — HTTP-Transport, WebSocket, AuthFrontend
@rebasepro/coreReact-Framework — Scaffold, Controller, Formulare, Routen, HooksFrontend
@rebasepro/uiEigenständige UI-Komponentenbibliothek (Tailwind v4 + Radix)Frontend
@rebasepro/authLogin-Ansichten, Auth-Controller-Hooks, BenutzerverwaltungFrontend
@rebasepro/studioSammlungseditor, SQL-Konsole, JS-Konsole, RLS-Editor, SpeicherbrowserFrontend
@rebasepro/cliCLI für Schema-Generierung, DB-Migrationen, SDK-GenerierungEntwicklertools
@rebasepro/formexLeichtes React-FormularstatusmanagementFrontend
@rebasepro/data_enhancementKI-gestütztes Plugin zur automatischen FeldvervollständigungFrontend
@rebasepro/data_import_exportCSV/JSON/Excel-Import und -ExportFrontend
@rebasepro/schema_inferenceAutomatische Schemaerkennung aus vorhandenen DatenbankdatenBackend/CLI
  1. Der Benutzer öffnet eine Sammlung in der Admin-UI
  2. Das Client-SDK sendet GET /api/data/:slug + öffnet ein WebSocket-Abonnement
  3. Das Backend fragt PostgreSQL über Drizzle ORM ab
  4. Der Datentransformator deserialisiert die Datenbankeinträge in das Entitätsformat
  5. Die Antwort wird an das Frontend gesendet, Komponenten rendern
  6. WebSocket hält die Ansicht in Echtzeit synchronisiert
  1. Der Benutzer bearbeitet eine Entität im Formular
  2. beforeSave-Callbacks werden ausgeführt (Validierung, Transformation)
  3. Das Client-SDK sendet PUT /api/data/:slug/:id
  4. Das Backend serialisiert die Werte, führt Drizzle UPDATE aus
  5. afterSave-Callbacks werden ausgeführt (Nebeneffekte)
  6. Der NOTIFY-Broadcast löst ein WebSocket-Update an alle Clients aus
  7. Wenn der Verlauf aktiviert ist, wird ein Snapshot aufgezeichnet