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-auth mit 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 (Rolle ADMIN fü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 App verö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 /ws werden 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.