SMARTKRIS Architektur & Übersicht
Das SMARTKRIS-Krisenkommunikations-Cockpit ist ein verteiltes System zur Erstellung, Verwaltung und Verteilung von Krisenmeldungen an verschiedene städtische Kanäle (Apps, Webseiten, Stelen).
Die Anwendung folgt einer serviceorientierten Architektur und besteht aus drei Hauptkomponenten: dem zentralen Backend (Spring Boot), dem API-Gateway & Cockpit (Next.js) und einem dedizierten Service für Echtzeit-Kommunikation und Push-Benachrichtigungen (Node.js).
Systemkomponenten
1. API-Gateway & Cockpit (Next.js)
Das Next.js-Projekt erfüllt zwei essenzielle Aufgaben: Es ist das Frontend für städtische Mitarbeiter (Dashboard) und fungiert als API-Gateway (Backend-for-Frontend) für sämtliche API-Anfragen.
-
Technologie: Next.js (App Router), React, Tailwind CSS, TypeScript
-
BFF & Proxy-Pattern: Das Next.js-Backend (
/api/…) nimmt alle Anfragen des Dashboards entgegen. Es sichert diese ab, fügt den notwendigen Auth-Token hinzu und leitet sie als Proxy (backendFetcher) an das isolierte Spring Boot Backend weiter. -
Authentifizierung: Nutzt
next-authmit Keycloak. Der Access Token wird sicher im Next.js-Backend verwaltet (inkl. automatischem Refresh) und niemals an den Browser-Client gesendet. -
API Key Auth: Für systeminterne Aufrufe (z.B. durch den WebSocket-Service) akzeptiert die Next.js-API eine Authentifizierung via
x-api-key.
2. Core Backend (Spring Boot Kotlin)
Das Backend enthält die eigentliche Geschäftslogik (z.B. Autorisierungs-PINs, Kaskadierung von Statusänderungen, Geocoding) und ist der zentrale Datenhub. Es ist vollständig vom öffentlichen Internet isoliert.
-
Technologie: Kotlin, Spring Boot 3, Hibernate/JPA
-
Datenbank: PostgreSQL (Migration über Flyway)
-
Security: Stateless API. Zugriff ist nur über den
ApiKeyAuthenticationFilter(für System-Aufrufe) oder mit gültigem Keycloak JWT (RolleADMINfür sensible Endpunkte) gestattet. -
Messaging: Bei relevanten Statusänderungen publiziert das Backend Events an einen RabbitMQ Fanout-Exchange (
crisis-updates-exchange).
3. WebSocket & Push Service (Node.js)
Dieser eigenständige Microservice (smartkris-ws-service) ist das Bindeglied zu den externen Clients (z.B. der Bürger-App oder digitalen Stadt-Stelen) und sorgt für die asynchrone Echtzeit-Verteilung der Meldungen.
-
RabbitMQ Consumer: Der Service lauscht auf die Events des Backends.
-
WebSocket Server: Eingehende Meldungen werden transformiert und an alle via WebSocket verbundenen externen Clients gebroadcastet. Den initialen Status holt sich der Service über die Next.js-API mittels Admin-Key.
-
Parse Push Notifications: Sobald eine Meldung für den Kanal
Appveröffentlicht wird, triggert der Service direkt einen externen Parse-Server, um native Push-Benachrichtigungen an iOS- und Android-Geräte zu senden.
Infrastruktur & Routing
Die Infrastruktur wird per GitLab CI/CD und Ansible automatisiert auf den Zielservern (Pre-Staging, Staging, Produktion) ausgerollt.
Ein zentraler Traefik Reverse Proxy regelt den externen Zugriff, verwaltet SSL-Zertifikate (Let’s Encrypt) und routet den Traffic an die jeweiligen Container:
-
Anfragen auf den Hostnamen (
/) werden an den Next.js-Container (Port 3000) geleitet. -
Anfragen auf den Pfad
/wswerden explizit an den WebSocket Service (Port 3001) weitergeleitet.
Alle Systemkomponenten sowie die Datenbank und RabbitMQ kommunizieren intern über ein isoliertes Docker-Netzwerk (shared-network). Das Spring Boot Backend gibt keine Ports nach außen (an Traefik) frei.