Architektur

Systemarchitektur

DaZ Pilot ist ein Monorepo mit vier Komponenten: Mobile App, Web-Dashboard, Node.js-Backend und Python-ML-Sidecar. Der komplette Stack läuft containerisiert.

Überblick

Die Architektur trennt klar zwischen Client-Anwendungen, Orchestrierung und rechenintensiver ML-Arbeit. Externe Kommunikation läuft ausschließlich über TLS 1.3, der ML-Service ist nur intern erreichbar. Zugriffsrechte sind rollenbasiert (Schüler:in, Lehrkraft, Admin, Super-Admin).

Mobile App

React Native / Expo

Web-Dashboard

Next.js + KERN UX

core-backend

Node.js · Express 5 · TypeScript

PostgreSQL

Kysely · Classifier-Blobs

ml-service

FastAPI · SigLIP 2 · sklearn

Qdrant

Vektor-Datenbank

Containerisiert via Docker Compose. Externe Kommunikation ausschließlich über TLS 1.3. ML-Service ist nur intern erreichbar.

Komponenten

KomponenteBeschreibungDetails
app/Mobile App für Schüler:innenReact Native mit Expo, File-based Routing
backend/REST-API mit npm WorkspacesExpress 5, TypeScript, PostgreSQL, Kysely
ml-service/Python-Sidecar für SigLIP-2-BilderkennungFastAPI, PyTorch, scikit-learn, Qdrant-Client
dashboard/Web-Dashboard für LehrkräfteNext.js + KERN UX
infra/CI/CD-KonfigurationGitLab-CI

Projektstruktur

Das Repository ist als Monorepo organisiert. Der Root koordiniert alle Sub-Pakete über npm workspaces und Docker-Compose.

text
daz-pilot/
├── app/                    Mobile App (React Native / Expo)
├── backend/                Backend-Monorepo (Node.js / Express)
│   ├── Dockerfile          Multi-Stage-Build für API, Worker & Migrator
│   └── workspaces/
│       ├── core-backend/           Express-API-Server
│       ├── backend-api-types/      Zod-Schemas und API-Typen
│       ├── backend-utils/          Geteilte Middleware und Utilities
│       ├── database/               Kysely-Datenbankschicht
│       ├── database-migrator/      Datenbank-Migrationen
│       └── tests/                  Test-Suite
├── ml-service/             Python-Sidecar (SigLIP 2 + FastAPI)
│   └── Dockerfile          Python-Image (FastAPI / uvicorn)
├── dashboard/              Web-Dashboard (Next.js + KERN UX)
├── docs/                   Dokumentation (inkl. ARCHITECTURE.md)
├── infra/                  CI/CD-Konfiguration
│   └── gitlab-ci.yml       GitLab-CI-Pipeline
├── scripts/                Standalone-Skripte
├── docker-compose.yml      Lokaler Stack
├── .env.example            Vorlage für .env
├── package.json            Root-Package
└── LICENSE                 EUPL-1.2

Backend-Workspaces

Das Backend selbst ist als npm-Workspaces-Monorepo aufgebaut. Jedes Workspace-Paket hat eine klar definierte Verantwortung.

WorkspacePaketnameVerantwortung
core-backend@daz-pilot/core-backendExpress-Server, Router, Controller, Auth-Middleware, OCR
backend-api-types@daz-pilot/daz-pilot-backend-api-typesZod-Schemas und OpenAPI-Typen
backend-utils@daz-pilot/backend-utilsMiddleware, Logger (Pino), Fehlerbehandlung, Health-Checks
database@daz-pilot/databasePostgreSQL-Pool und Kysely-Typen
database-migrator@daz-pilot/database-migratorDatenbank-Migrationen (Kysely)
tests@daz-pilot/testsTest-Suite (Node.js Built-in Test Runner)

Tech-Stack

KomponenteTechnologieVersion
Mobile AppReact Native + ExpoExpo ~54, RN 0.81
Web-DashboardNext.js + KERN UX
BackendNode.js / ExpressNode 22, Express 5.2
ML-SidecarPython / FastAPI / PyTorchPython 3.11+
SpracheTypeScript5.9
DatenbankPostgreSQL + KyselyKysely 0.28
VektordatenbankQdrant1.14
ValidierungZod4.3
BilderkennungSigLIP 2 SO400M (HuggingFace) + LinearSVC
Video-Verarbeitungffmpeg + sharp (Laplacian-Schärfefilter)ffmpeg ≥ 6
OCRTesseract
Text-to-SpeechDevice Native TTS
API-DokumentationSwagger UI + OpenAPI
ContainerisierungDocker
CI/CDGitLab CI
LernplattformMoodle (Integration)ab 4.x

Datenmodell (Auszug)

PostgreSQL ist Source of Truth für Nutzer:innen, Fachbegriffe, Klassen, Quizze und Classifier-Blobs. Alle Tabellen teilen die Basisspalten _id, _created_at und _updated_at.

BereichTabellenBeschreibung
Schulenschools, school_invitationsSchul-Entitäten und rollenbasierte Einladungen
Benutzersuper_admins, teachers, students + SessionsDrei Nutzerrollen mit SHA-256-gehashten Session-Tokens
Fachbegriffetechnical_termsBild, deutsche Form (Genus/Singular/Plural), Qdrant-Vektor-Referenz
Objekterkennungschool_classifiers, training_jobsjoblib-Blobs (BYTEA) pro Schule + Postgres-basierte Job-Queue
Klassenclasses, class_teacher_joinsKlassen mit Fortschritts-Tracking
Arbeitsaufträgeassignments, assignment_technical_term_joinsPDF-Uploads pro Klasse mit erkannten Fachbegriffen
Quizzequizzes, quiz_technical_term_joinsQuiz-Definition und individueller Fortschritt