score

Architektur

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
Bausteine von score und ihre VerbindungenArchitekturdiagramm mit 10 Komponenten und 9 Verbindungen in 2 Grenzen. Betrieb in Deutschland: score-web, score-api, score-rules, Keycloak, Datenzone. Datenzone (in Betrieb in Deutschland): PostgreSQL, Audit-Log. Hauptweg: Lehrkräfte, Eltern → Browser → score-web → score-api → PostgreSQL. Lehrkräfte, Eltern (Person): verbunden mit Browser (nutzt). Browser (Oberfläche): verbunden mit score-web (Seiten, Formulare, über HTTPS). Schulverwaltung (externes System): verbunden mit score-api (Import, über JSON, CSV). score-web (Dienst): verbunden mit score-api (/v1, /auth, über Cookie durchgereicht). score-api (Dienst): verbunden mit score-rules (bewertet, über wazero), Keycloak (meldet an, über OIDC + PKCE) und PostgreSQL (liest, schreibt, über pgx, SET LOCAL). PostgreSQL (Datenbank): verbunden mit Audit-Log (Trigger). score-rules (Dienst): keine ausgehende Verbindung. Keycloak (Sicherheit): verbunden mit Landes-IdP, Schul-IdP (brokert, über OIDC/SAML). Audit-Log (Datenbank): keine ausgehende Verbindung. Landes-IdP, Schul-IdP (externes System): keine ausgehende Verbindung.Betrieb in DeutschlandDatenzoneLehrkräfte, Eltern → Browser: nutztBrowser → score-web: Seiten, Formulare [HTTPS]score-web → score-api: /v1, /auth [Cookie durchgereicht]score-api → score-rules: bewertet [wazero]score-api → Keycloak: meldet an [OIDC + PKCE]Keycloak → Landes-IdP, Schul-IdP: brokert [OIDC/SAML]score-api → PostgreSQL: liest, schreibt [pgx, SET LOCAL]PostgreSQL → Audit-Log: TriggerSchulverwaltung → score-api: Import [JSON, CSV]nutztSeiten, Formulare[HTTPS]/v1, /auth[Cookie durchgereicht]bewertet[wazero]meldet an[OIDC + PKCE]brokert[OIDC/SAML]liest, schreibt[pgx, SET LOCAL]TriggerImport[JSON, CSV]Lehrkräfte, ElternLehrkräfte, ElternBrowser – auch ohne JavaScriptBrowserauch ohne JavaScriptscore-web – Astro SSR, Sveltescore-webAstro SSR, Sveltescore-api – Go, Modi api/worker/allscore-apiGo, Modi api/worker/allscore-rules – Rust als WASM, im Prozessscore-rulesRust als WASM, im ProzessKeycloak – OIDC-BrokerKeycloakOIDC-BrokerPostgreSQL – RLS je EinrichtungPostgreSQLRLS je EinrichtungAudit-Log – Hash-Kette je MonatAudit-LogHash-Kette je MonatLandes-IdP, Schul-IdPLandes-IdP, Schul-IdPSchulverwaltung – StammdatenSchulverwaltungStammdaten
Bausteine von score und ihre VerbindungenArchitekturdiagramm mit 10 Komponenten und 9 Verbindungen in 2 Grenzen. Betrieb in Deutschland: score-web, score-api, score-rules, Keycloak, Datenzone. Datenzone (in Betrieb in Deutschland): PostgreSQL, Audit-Log. Hauptweg: Lehrkräfte, Eltern → Browser → score-web → score-api → PostgreSQL. Lehrkräfte, Eltern (Person): verbunden mit Browser (nutzt). Browser (Oberfläche): verbunden mit score-web (Seiten, Formulare, über HTTPS). Schulverwaltung (externes System): verbunden mit score-api (Import, über JSON, CSV). score-web (Dienst): verbunden mit score-api (/v1, /auth, über Cookie durchgereicht). score-api (Dienst): verbunden mit score-rules (bewertet, über wazero), Keycloak (meldet an, über OIDC + PKCE) und PostgreSQL (liest, schreibt, über pgx, SET LOCAL). PostgreSQL (Datenbank): verbunden mit Audit-Log (Trigger). score-rules (Dienst): keine ausgehende Verbindung. Keycloak (Sicherheit): verbunden mit Landes-IdP, Schul-IdP (brokert, über OIDC/SAML). Audit-Log (Datenbank): keine ausgehende Verbindung. Landes-IdP, Schul-IdP (externes System): keine ausgehende Verbindung.Betrieb in DeutschlandDatenzoneLehrkräfte, Eltern → Browser: nutztBrowser → score-web: Seiten, Formulare [HTTPS]score-web → score-api: /v1, /auth [Cookie durchgereicht]score-api → score-rules: bewertet [wazero]score-api → Keycloak: meldet an [OIDC + PKCE]Keycloak → Landes-IdP, Schul-IdP: brokert [OIDC/SAML]score-api → PostgreSQL: liest, schreibt [pgx, SET LOCAL]PostgreSQL → Audit-Log: TriggerSchulverwaltung → score-api: Import [JSON, CSV]nutztSeiten,Formulare[HTTPS]/v1, /auth[Cookie durchgereicht]bewertet[wazero]meldet an[OIDC + PKCE]brokert[OIDC/SAML]liest, schreibt[pgx, SET LOCAL]TriggerImport[JSON, CSV]Lehrkräfte, ElternLehrkräfte,ElternBrowser – auch ohne JavaScriptBrowserauch ohneJavaScriptscore-web – Astro SSR, Sveltescore-webAstro SSR,Sveltescore-api – Go, Modi api/worker/allscore-apiGo, Modiapi/worker/allscore-rules – Rust als WASM, im Prozessscore-rulesRust als WASM,im ProzessKeycloak – OIDC-BrokerKeycloakOIDC-BrokerPostgreSQL – RLS je EinrichtungPostgreSQLRLS jeEinrichtungAudit-Log – Hash-Kette je MonatAudit-LogHash-Kette jeMonatLandes-IdP, Schul-IdPLandes-IdP,Schul-IdPSchulverwaltung – StammdatenSchulverwaltungStammdaten

Quelle: score, Stand Proof of Concept

Diagrammdaten anzeigen
Daten zu Bausteine von score und ihre Verbindungen
KomponenteArtGrenzeVerbunden mit
Lehrkräfte, ElternPersonBrowser (nutzt)
BrowserOberflächescore-web (Seiten, Formulare, über HTTPS)
Schulverwaltungexternes Systemscore-api (Import, über JSON, CSV)
score-webDienstBetrieb in Deutschlandscore-api (/v1, /auth, über Cookie durchgereicht)
score-apiDienstBetrieb in Deutschlandscore-rules (bewertet, über wazero), Keycloak (meldet an, über OIDC + PKCE), PostgreSQL (liest, schreibt, über pgx, SET LOCAL)
PostgreSQLDatenbankBetrieb in Deutschland › DatenzoneAudit-Log (Trigger)
score-rulesDienstBetrieb in Deutschland
KeycloakSicherheitBetrieb in DeutschlandLandes-IdP, Schul-IdP (brokert, über OIDC/SAML)
Audit-LogDatenbankBetrieb in Deutschland › Datenzone
Landes-IdP, Schul-IdPexternes 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
  • Lasttests mit k6, siehe Skalierbarkeit und Betrieb

Betrieb

Wie score in einem Rechenzentrum, beim Schulträger oder in einer einzelnen Schule betrieben werden kann, beschreibt Betriebsvarianten.