Betriebsplattform für eine Agentur
Eine Management-Plattform, die eine verstreute Sammlung von SaaS-Tools und ein Altsystem ablöst: Verkäufe aus drei Checkout-Plattformen, ein CRM-Spiegel, WhatsApp, Personalwesen und ein einheitlicher Kundenstamm — mit KI-Agenten, die auf denselben Daten und Berechtigungen arbeiten.
- Kunde
- Agentur für digitales Marketing und Bildung (Name nicht genannt)
- Rolle
- Architektur, Backend (Java/Spring), Frontend (Angular), CI/CD und Deployment
- Jahr
- 2026
- Status
- Seit Oktober 2026 in Produktion
20
Spring-Modulith-Module, Modulgrenzen durch Tests abgesichert
≈420
GraphQL-Queries und -Mutations
1,330+
Backend-Tests gegen echtes PostgreSQL und Redis
45 s → 18 ms
Dashboard-Abfrage nach dem Profiling
Kontext
Die Agentur wickelte ihren Betrieb über mehrere SaaS-Plattformen ab — Checkout-Anbieter, ein CRM, WhatsApp, Quiz-Funnels — sowie über ein internes System der ersten Generation, dessen Datenbank auf 20 GB angewachsen war, größtenteils rohes JSON. Daten lagen doppelt vor, Berechtigungen waren grob, und Berichte wurden von Hand zusammengesetzt.
Das Problem
Ein System der zweiten Generation von Grund auf bauen, das alle Daten zuverlässig aufnimmt, sie zu einem einzigen Kundenstamm zusammenführt, jedem Team genau den Zugriff gibt, den es braucht, und KI auf echten Daten nutzbar macht, ohne Sicherheitslücken zu öffnen.
Mein Beitrag
- 01
Ich habe die Architektur entworfen: einen modularen Monolithen mit Spring Modulith (20 Module), einer Schichtenstruktur im DDD-Stil und einem Use Case pro Aktion.
- 02
Ich habe die GraphQL-API, die Integrationen und die KI-Schicht in Java 25 und Spring Boot 4.1 entwickelt.
- 03
Ich habe das Angular-21-Frontend (zoneless, Signals) mit typisiertem GraphQL-Client und Echtzeit-Updates über Server-Sent Events entwickelt.
- 04
Ich habe CI/CD und den Produktivbetrieb aufgesetzt: Docker, Caddy und GitHub Actions, mit per Health Check abgesicherten Deployments und automatischem Rollback.
Was es leistet
- Spiegel von drei Checkout-Plattformen — Verkäufe, Abonnements, abgebrochene Warenkörbe — mit fortsetzbaren, ratenbegrenzten historischen Importen
- CRM-Spiegel und Archiv der WhatsApp-Konversationen
- Einheitlicher Kundenstamm mit Identitätsauflösung und protokollierten, umkehrbaren Zusammenführungen
- Verkaufszyklen mit Zielvorgaben, Zuordnung zu Verkäufern, Live-Dashboards und Periodenabschluss
- Personaldaten mit Historie von Positionen und Vergütung
- Interne Workflow-Engine für geplante Berichte per E-Mail und WhatsApp
- KI-Assistent und KI-Agenten für den Kundenservice auf WhatsApp
- MCP-Server, über den externe KI-Clients das System unter OAuth 2.1 abfragen können
Technische Highlights
- 01
Grenzen, die der Build erzwingt
Module kommunizieren nur über benannte Schnittstellen und Events. Ein Modularitätstest lässt den Build bei jeder Grenzverletzung fehlschlagen, und ein Code-Standards-Test parst jede Java-Datei mit der javac Tree API, um die Architekturregeln durchzusetzen.
- 02
Autorisierung als Daten
Ein eigener Method-Security-Interceptor, @AccessRoute, deckt 649 Routen mit den Scopes alle/Team/eigene ab, und Rollen sind lebende Vorlagen, die in der Oberfläche bearbeitet werden. Sessions liegen in Redis, mit MFA per E-Mail und Google-Anmeldung; sensible Felder nutzen AES-256-GCM mit Blind Index.
- 03
Webhooks, die nie verloren gehen
Eine Inbox bestätigt den Empfang erst nach einem Group Commit. Worker übernehmen Batches mit FOR UPDATE SKIP LOCKED, halten die Reihenfolge pro Schlüssel ein, wiederholen mit Backoff und prüfen HMAC-Signaturen — manche Anbieter senden einen fehlgeschlagenen Webhook nie erneut.
- 04
KI, die Berechtigungen respektiert
Spring-AI-Agenten nutzen 122 Tools, die mit den Berechtigungen des jeweiligen Gesprächsinhabers laufen, und Schreibzugriffe erfordern eine ausdrückliche Bestätigung. RAG auf pgvector (HNSW), Chat-Gedächtnis in Redis, validierte strukturierte Ausgaben, und die Kosten jedes Modellaufrufs werden erfasst und mit der Cloud-Abrechnung abgeglichen.
- 05
GraphQL im großen Maßstab
≈200 Queries und ≈220 Mutations über 183 JPA-Entitäten, mit DataLoader-Batching, Keyset-Pagination, Tiefen- und Komplexitätslimits sowie Rate Limiting pro Konto in Redis.
- 06
Deployments ohne verlorene Arbeit
Caddy wiederholt Anfragen während Neustarts, ein Graceful Shutdown lässt laufende KI-Antworten noch abschließen, und Antworten werden per Checkpoint in PostgreSQL gesichert, damit sie ein Deployment überstehen.
Knackpunkte
- 01
Nebenläufigkeit bei der Datenaufnahme
PostgreSQL Advisory Locks, Wiederholungen bei Optimistic-Locking-Konflikten und die Regel, innerhalb von Transaktionen keine externen Aufrufe zu machen, verhindern, dass parallele Webhooks den Kundenstamm beschädigen.
- 02
Identitätsauflösung
Kunden über E-Mail, Telefonnummer und Steuernummer zusammenzuführen, kann sich zu riesigen Fehlzuordnungen verketten. Regeln zur Schlüsselstärke und ein Schwellenwert für geteilte Schlüssel stoppen ausufernde Zusammenführungen, und jede Zusammenführung lässt sich rückgängig machen.
- 03
Ratenlimits von Drittanbietern
Historische Importe werden in Tageseinheiten aufgeteilt, die mit SKIP LOCKED übernommen werden, pro Minute gedeckelt sind und sich nach einem 429 oder einer manuellen Pause fortsetzen lassen.
Ergebnisse
- Seit Oktober 2026 in Produktion und löst das System der ersten Generation ab.
- Dashboard-Abfrage „heute“: 45 s → 18 ms. Team-Startseite: 37,6 s → 47 ms.
- Export von 31 Tagen Nachrichten (1,1 Mio. Nachrichten aus einem Testdatensatz mit 8 Mio. Nachrichten) in 32–64 s Datenbankzeit.
- ≈1.330 Backend-Tests mit Testcontainers und ≈790 Frontend-Tests; CI-Deployments mit Health Checks und automatischem Rollback.
Die Zahlen stammen aus dem Repository: Tests, Messungen und dokumentierte Berichte.
Stack
- Java 25
- Spring Boot 4.1
- Spring Modulith
- Spring Security 7
- Spring AI 2.0
- GraphQL
- PostgreSQL · pgvector
- Redis
- Flyway
- Testcontainers
- Docker
- Caddy
- GitHub Actions
- Angular 21
- TypeScript
- Tailwind CSS 4
VorgehenEntwickelt mit einem KI-gestützten Workflow unter meiner Leitung: Ich habe Architektur und Schnittstellenverträge festgelegt, den Plan für jede Phase geschrieben und freigegeben und jede Änderung vor dem Merge geprüft — rund 1.800 Backend- und 590 Frontend-Commits.
Code und Kunde sind vertraulich. Details werden so weit geteilt, wie es die Arbeit zulässt.