Die Bausteine von score, wie sie zusammenhängen und warum.
score ist ein modularer Monolith mit einer klar getrennten Oberfläche und einer reinen
Regel-Engine. Zwei Container-Images genügen für jedes Betriebsprofil.
Fokus
Bausteine von score und ihre Verbindungen
Quelle: score, Stand Proof of Concept
Diagrammdaten anzeigen
Daten zu Bausteine von score und ihre Verbindungen
Komponente
Art
Grenze
Verbunden mit
Lehrkräfte, Eltern
Person
Browser (nutzt)
Browser
Oberfläche
score-web (Seiten, Formulare, über HTTPS)
Schulverwaltung
externes System
score-api (Import, über JSON, CSV)
score-web
Dienst
Betrieb in Deutschland
score-api (/v1, /auth, über Cookie durchgereicht)
score-api
Dienst
Betrieb in Deutschland
score-rules (bewertet, über wazero), Keycloak (meldet an, über OIDC + PKCE), PostgreSQL (liest, schreibt, über pgx, SET LOCAL)
PostgreSQL
Datenbank
Betrieb in Deutschland › Datenzone
Audit-Log (Trigger)
score-rules
Dienst
Betrieb in Deutschland
Keycloak
Sicherheit
Betrieb in Deutschland
Landes-IdP, Schul-IdP (brokert, über OIDC/SAML)
Audit-Log
Datenbank
Betrieb in Deutschland › Datenzone
Landes-IdP, Schul-IdP
externes System
Bausteine
Baustein
Technik
Aufgabe
score-web
Astro 7 (SSR, Node), Svelte 5
Oberfläche. Keine Datenbank, keine Fachlogik, kein eigener Zustand
score-api
Go, pgx, sqlc, goose, wazero, go-oidc
HTTP-API, Anmeldung und Sitzungen, Rechte, Mandantenkontext, Import, Audit, Hintergrundjobs
score-rules
Rust, gebaut als WebAssembly
Regel-Engine als reine Funktion: Regelpaket und Fachdaten rein, Ergebnis mit Begründung raus
PostgreSQL
ab Version 16
Fachdaten, Row-Level Security je Einrichtung, Sperren und Audit per Trigger
Keycloak
OIDC-Broker
bindet Landes- und Schul-Identitätsanbieter an; lokale Konten, wo es keinen gibt
Wege einer Anfrage
Der Browser spricht nur mit score-web. score-web reicht Anmeldepfade (/auth/*) unverändert an
score-api durch und ruft die Fach-API (/v1/*) serverseitig mit dem Sitzungs-Cookie des Browsers
auf. Tokens des Identitätsanbieters verlassen score-api nie.
score-api öffnet für jede Anfrage eine Transaktion, setzt darin Person und erlaubte Einrichtungen
als Datenbankkontext und arbeitet unter einer Datenbankrolle ohne Sonderrechte. Was eine Person
nicht sehen darf, liefert die Datenbank gar nicht erst aus – siehe
Mandanten und Sicherheit.
Eine Regel-Engine, zwei Orte
score-rules wird einmal nach WebAssembly übersetzt. score-api lädt das Modul über wazero im
eigenen Prozess, ohne Netzwerkaufruf und ohne cgo; score-web lädt dieselbe Datei im Browser
für die Live-Vorschau. Beide bekommen dasselbe Regelbündel mit SHA-256-Hash. Die Vorschau zeigt
also garantiert, was der Server rechnen wird. Details unter Regel-Engine.
Startmodi von score-api
Ein Binary, mehrere Rollen:
Modus
Zweck
api
HTTP-API
worker
Hintergrundjobs: Zeugnis-PDFs und Sammeldruck, Rückmeldungen an die Schulverwaltung, Aufräumen abgelaufener Sitzungen
all
beides in einem Prozess, für das kleine Profil
migrate
Datenbankmigrationen
import
Stammdatenimport über die Kommandozeile
audit
Protokoll prüfen, Monat abschließen, exportieren
exit
Exit-Export einer Einrichtung schreiben und prüfen
aufbewahrung
fällige Daten prüfen, dem Archiv anbieten, löschen mit Löschnachweis
Abhängigkeiten zeigen nach innen
score-rules kennt weder Datenbank noch Go-Code. Die Fachmodule kennen keine Adapter zu
Fremdsystemen. Jede Landesinfrastruktur – Identität, Stammdaten, Rückmeldung, Archiv – ist ein
Adapter mit einer einfachen Grundvariante, sodass auch eine einzelne Schule ohne
Landesanbindung auskommt.
Qualität
Go-Tests gegen ein echtes PostgreSQL, einschließlich der Mandantentrennung
Rust-Tests mit Fallbeispielen aus jedem Regelpaket
ein Test, der für jede beschreibbare Tabelle einen Audit-Trigger verlangt
Biome, gofmt und clippy; lokal gebündelt in scripts/verify.sh
gegen die laufende Instanz (scripts/qualitaet.sh): Playwright in Chromium, Firefox und WebKit
meldet sich mit jedem Testkonto an und prüft alle erreichbaren Seiten mit axe auf WCAG 2.2 AA
und auf Fehler in der Konsole; dazu ein Scan mit OWASP ZAP, anonym und angemeldet, und eine
Software-Stückliste im Format CycloneDX für Quellen und Images