Kommune Aktiv – Entwicklung einer SaaS
Es gibt Software, die wirkt nicht laut. Keine hippen Logos, kein aggressives Marketing, keine Overhead-Demos mit Musik vom Synthesizer. Und trotzdem: Sie läuft, sie funktioniert, sie wird geschätzt. Besonders dann, wenn sie in einem sensiblen Bereich wie der öffentlichen Verwaltung tagtäglich ihren Dienst tut – und das seit vielen Jahren.
Unser Kunde betreibt genau so eine Softwarelösung: wirtschaftlich erfolgreich, kommunal im Einsatz, mit starker Bindung der Endanwender. Doch auch die robusteste Software alter Schule stößt irgendwann an systemische Grenzen. Hosting nur On-Premise, .NET Framework, keine Containerisierung, lange Release-Zyklen – Zeit für ein grundlegendes Upgrade. Aber wie modernisiert man, ohne den bewährten Kern zu verlieren?
Ausgangssituation
Die bestehende Anwendung hatte sich über viele Jahre organisch entwickelt. Sie war gewachsen, hatte sich an die Anforderungen der Kunden angepasst und verfügte über einen gewaltigen Funktionsumfang. Gerade im kommunalen Bereich, in dem Stabilität und Verlässlichkeit zentrale Werte sind, hatte sich die Software einen exzellenten Ruf erarbeitet.
Technologisch war die Plattform allerdings ein klassisches Kind der frühen 2010er:
.NET Framework
Monolithische Strukturen
Lokale Installationen beim Kunden
Wenig bis keine Automatisierung in den Deploymentprozessen
Kurz: Die Software war nicht schlecht – im Gegenteil. Aber sie war alt geworden. So alt, dass sich bestimmte technologische Entscheidungen einfach nicht mehr wirtschaftlich vertreten ließen. Der Wunsch nach einer „grünen Wiese“ war also keine Abrechnung mit dem Bestehenden, sondern der Versuch, Bewährtes zukunftssicher neu zu denken.
Das Ziel:
Eine moderne, containerisierte Architektur, die langfristig in der Cloud betreibbar ist, aber die alte Business-Logik erhält. Kein Neuanfang um des Neuanfangs willen – sondern ein kontrollierter Übergang ins nächste Jahrzehnt.
Durchführung
Phase 1: Technologische Grundlage neu denken
Zunächst stand die Transformation des technologischen Fundaments im Mittelpunkt:
Austausch aller relevanten .NET Framework-Komponenten gegen .NET (Core bzw. aktuell .NET 6+)
Schrittweise Umstellung auf moderne Bibliotheken und Schnittstellen
Identifikation von Legacy-Code, der migriert – oder im Ausnahmefall neu geschrieben – werden musste
Phase 2: Containerisierung & Infrastruktur
Im nächsten Schritt wurde die komplette Softwarelandschaft dockerisiert. Die Vorteile lagen auf der Hand:
Klare Isolation der Komponenten
Einheitliche Deployment-Prozesse
Vorbereitung für ein Kubernetes-Deployment
Parallel dazu wurde die Infrastruktur komplett als Code neu aufgebaut:
Verwendung von Terraform zur Definition und Provisionierung der Cloud- und Kubernetes-Ressourcen
Aufbau eines produktionsfähigen K8s-Clusters inklusive Monitoring, Ingress, Service Mesh, etc.
Implementierung zentraler Dienste wie Secrets-Management, Zertifikatsverwaltung, Observability und Logging
Phase 3: Automatisierung
Ohne automatisierte Prozesse wäre ein solches Projekt kaum beherrschbar. Deshalb wurde schon früh eine CI/CD-Pipeline aufgebaut:
Automatisierte Builds über Git
Container-Build und -Push über eigene Registry
Automatisierte Deployments in Entwicklungs- und Testumgebungen
Trennung von Konfiguration und Code zur Unterstützung mehrerer Mandanten und Zielsysteme
Phase 4: Business-Logik erhalten
Besonders herausfordernd war der Umgang mit der bestehenden Business-Logik. Sie war groß, komplex – und in vielen Fällen nicht dokumentiert. Um nicht in eine kostspielige und riskante Neuentwicklung zu rutschen, wurde ein begleitender Workshop-Prozess aufgesetzt:
Enge Zusammenarbeit mit Entwicklern, Fachexperten und Key-Usern
Rekonstruktion der Logik aus bestehendem Code und verteiltem Wissen
Abbildung der funktionalen Anforderungen in User Stories und Epics
Abgleich mit dem neuen Architekturmodell, insbesondere im Hinblick auf Zuständigkeiten zwischen Services
In einem Nebeneffekt entstand dadurch erstmals eine formalisierte, teamübergreifende Dokumentation der Prozesse – ein Gewinn, der über das Projekt hinaus Wirkung entfalten wird.
Phase 5: Organisation und Methodik
Ein solches Projekt verändert nicht nur den Code, sondern auch die Teams. Die Umstellung wurde genutzt, um Scrum bzw. ein agiles Kanban-Board einzuführen. Statt starrer Planung wurden iterative Zyklen etabliert, inklusive regelmäßiger Reviews und Retrospektiven. Die Akzeptanz war überraschend hoch – viele Kolleginnen und Kollegen begrüßten die neue Transparenz und Planbarkeit.
Ergebnis
Nach einem Jahr Arbeit steht noch kein finales Produkt – und das ist auch völlig in Ordnung. Die schiere Größe und Komplexität der Anwendung lassen sich nicht in wenigen Monaten neu erschaffen. Aber der Fortschritt ist klar erkennbar:
Die gesamte Infrastruktur wurde modernisiert und auf Terraform & Kubernetes migriert
Alle relevanten Dienste sind containerisiert und deployfähig
Erste Teilbereiche der Applikation sind bereits funktional und können getestet werden
Ein zentraler Authorization-Service als Middleware wurde eingeführt, der künftig alle Anwendungen übergreifend steuern wird
Die Entwicklung ist durch die neue CI/CD-Pipeline spürbar schneller und verlässlicher
Die Einführung eines agilen Arbeitsmodus mit Scrum-Elementen wurde sehr gut angenommen und hat die Zusammenarbeit strukturiert
Was noch fehlt, ist der vollständige Umbau der Applikation selbst – aber das Fundament steht. Und wer jemals ein altes Haus renoviert hat, weiß: Wenn das Fundament erst einmal steht, ist der Rest nur noch Fleißarbeit.
Fazit
Erfolg in der Softwareentwicklung misst sich nicht allein daran, wie schnell man etwas Neues bauen kann. Manchmal ist es ein größerer Erfolg, das Bestehende so gut zu kennen, dass man es sinnvoll transformieren kann. Der Weg von einer etablierten On-Premise-Lösung hin zu einer modernen Cloud-Plattform ist lang – aber lohnenswert.
Und während der alte Monolith langsam, aber sicher in seine modulare Zukunft überführt wird, entsteht nicht nur eine neue Architektur – sondern auch eine neue Art, Software gemeinsam zu denken, zu entwickeln und zu betreiben.