Von nächtlichen Server-Abstürzen zu automatisierten Deployments, von chaotischen API-Controllern zu sauberer Clean Architecture. Hier erzähle ich ehrlich, wie ich mir Server-Administration und Backend-Entwicklung beigebracht habe - mit allen Umwegen, Fehlern und Aha-Momenten.
"Warum fällt der Server schon wieder aus?" war der Moment, in dem mir klar wurde: Ich brauche eine richtige Infrastructure. Was folgte, war eine intensive Lernreise durch Linux-Administration, Container-Security und Monitoring-Stacks.
Nach dem dritten Mal, dass ich einen Server komplett neu aufsetzen musste, war mir klar: Das muss automatisiert werden! Was als einfaches Backup-Script begann, wurde zu einem 800-Zeilen Ansible Playbook, das heute komplette Production-Umgebungen mit Security-Hardening, SIEM-Stack und allen Services in unter 20 Minuten deployed.
Der Durchbruch kam, als ich verstanden habe, dass Infrastructure wirklich wie Code behandelt werden kann. Variablen, Schleifen, Bedingungen - plötzlich konnte ich Server genauso programmieren wie APIs. Heute starte ich mit einem frischen Ubuntu-Server und einem einzigen Befehl, und eine Stunde später läuft eine vollständige Produktionsumgebung mit Monitoring, Security und automatischen Backups.
Container sind praktisch, aber per Default alles andere als sicher. Meine erste Docker-Installation war ein Sicherheits-Albtraum: Root-Container, privilegierte Mounts, keine Isolation. Das musste besser werden!
Wochen später, nach dem Studium von Security-Best-Practices, war mein Set-up komplett anders: Jeder Service läuft mit eigenem User, User-Namespaces isolieren Container vom Host, AppArmor schränkt Syscalls ein, und keine Container haben mehr Capabilities als nötig. Ein Schritt näher zur eigenen Serverinfrastruktur.
Meinem Ziel, die Backends für die Apps nicht nur nach höchsten DSGVO Standards umzusetzen, sondern auch möglichst sicher zu gestalten, kam ich die Tage ein ganzes Stück näher. Wazuh – einem Open-Source-SIEM-System, das eigentlich für große Unternehmen gedacht ist, ist ein Puzzlestück in dieser Lösung.
Das Set-up war kein Spaziergang: OpenSearch als Backend, Wazuh Manager für die Regel-Engine, Dashboard für die Visualisierung, und überall Custom-Konfigurationen. All das Gefrickel und wofür? Ich sehe alles: Failed Logins, File-Changes, verdächtige Prozesse, Container-Events. Es ist wie ein Röntgenblick auf die Sicherheit meiner Infrastruktur. Wunderschön, anders kann man es nicht sagen.
Monitoring begann für mich mit dem panischen SSH-Einloggen: "Läuft noch alles?" Das wurde schnell alt. Prometheus + Grafana sollten mir diese nächtlichen Sorgen nehmen. Und es funktioniert fantastisch!
Was mich am meisten überrascht hat: Monitoring ist nicht nur Troubleshooting, sondern erzählt richtige Geschichten. Wann sind die User online? Welche APIs werden am meisten genutzt? Wie entwickelt sich die Performance über Zeit? Diese Daten sind Gold wert für Optimierungen.
Server-Administration ist viel mehr als "apt update && apt upgrade". Es ist ein Mindset: Alles sollte automatisiert, reproduzierbar und sicher sein. Diese Lektionen habe ich oft schmerzhaft gelernt.
"Pets vs. Cattle" - ein Server sollte kein Haustier sein, das man liebevoll pflegt, sondern Vieh, das man bei Bedarf austauscht. Ansible hat mir diese Philosophie beigebracht.
Eine Sicherheitsmaßnahme ist keine Sicherheit. Zehn Sicherheitsmaßnahmen sind ein Anfang. Jede Schicht sollte unabhängig funktionieren.
Monitoring sagt dir, dass etwas kaputt ist. Observability sagt dir warum und hilft dir, es zu verstehen, bevor es kaputt geht.
"Wenn du es zweimal machst, automatisiere es beim dritten Mal." Diese Regel hat mir unzählige Stunden gespart und Fehler verhindert.
"Funktioniert bei mir" war lange meine Definition von guter Software. Bis ich gelernt habe, dass echte Backend-Entwicklung bedeutet: saubere Architektur, testbarer Code und APIs, die auch andere verstehen können.
"Wieso muss ich Ausbildungsberichte noch mit Papier und Stift schreiben?" Diese Frage führte zu meiner ersten ernsthaften Backend-API. Was als simpler CRUD-Service begann, wurde zu einem kompletten Lehrbericht-Management-System mit Multi-User-Support, Rollen-Management und PDF-Export.
Das Projekt war mein Deep-Dive in Spring Boot und Kotlin. Von chaotischen Controller-Klassen mit allem drin bis zur sauberen Clean Architecture mit Repository Pattern, Use Cases und ordentlicher Fehlerbehandlung. Jeder Refactoring-Schritt hat mich mehr über Backend-Design gelehrt als jedes Tutorial.
Normale Lernkarten sind langweilig. Aber was, wenn das System lernt, welche Karten du schwierig findest, und diese öfter zeigt? Spaced Repetition heißt das Zauberwort, und ich wollte es selbst implementieren.
Diese API war mein Experiment mit komplexeren Algorithmen im Backend. Wie trackst du Lernfortschritt? Wie berechnest du optimale Wiederholungsintervalle? Wie stellst du sicher, dass das System fair bleibt? Das war weniger CRUD und mehr echte Logik - und deutlich interessanter zu entwickeln.
Nicht jede API muss eine Enterprise-Anwendung sein. Manchmal braucht man einfach ein sauberes Backend für ein Contact-Form oder ein Content-Management-System. Einfach, aber richtig gemacht.
Diese kleineren APIs haben mir beigebracht, dass gutes Design nicht von der Größe abhängt. Auch eine 3-Endpoint-API kann saubere Validation, ordentliche Error-Responses und vernünftige Dokumentation haben. Oft sind die kleinen Projekte die besten Lehrmeister.
Backend-Entwicklung ist mehr als nur "Daten in Database rein, Daten aus Database raus". Es geht um Architektur, Testbarkeit und Wartbarkeit. Diese Lektionen habe ich Schritt für Schritt gelernt.
"Wo gehört diese Logik hin?" war lange meine größte Frage. Clean Architecture gab mir endlich ein Framework für Entscheidungen: Business Logic in die Domain, Infrastructure bleibt außen.
Eine gute API ist eine Unterhaltung zwischen Client und Server. RESTful Design ist nicht nur ein Standard, sondern eine Sprache, die beide Seiten verstehen müssen.
Tests schreiben ist nicht nur Qualitätssicherung, sondern hilft beim API-Design. Wenn ein Test schwer zu schreiben ist, ist der Code vermutlich schlecht designt.
"Es funktioniert" ist nicht genug. Wie schnell funktioniert es? Wie zuverlässig? Wie findest du Probleme, bevor User sie bemerken?
Nach Jahren des Experimentierens hat sich ein Core-Stack herauskristallisiert, mit dem ich produktiv und glücklich arbeite. Nicht weil es hip ist, sondern weil es funktioniert.
Mature, gut dokumentiert, riesiges Ecosystem
Concise, type-safe, null-safe, Java interop
Robust, ACID, JSON support, performant
Unschlagbar für Kotlin + Spring Boot
Collections, Environments, automatisierte Tests
Universeller Database Client, top für PostgreSQL
Modern, parameterized tests, nested tests
Behavior verification, stubbing, spy objects
Echte PostgreSQL Container für realistische Tests
Technologie steht nie still, und ich auch nicht. Hier sind die nächsten großen Lernprojekte auf meiner Liste - sortiert nach "kann ich kaum erwarten" bis "sollte ich mal machen".
Aktuell liegen meine Database-Passwörter und API-Keys in Config-Files. Das ist... nicht optimal. Vault soll mir dynamische Secrets, automatische Rotation und ordentliche Encryption bringen. Plus: Ich will endlich verstehen, wie Enterprise-Secrets-Management funktioniert.
Warum jetzt: Mit mehr Services wird Secret-Management immer wichtiger. Außerdem will ich Vault in mein Ansible Playbook integrieren für Zero-Touch-Deployments.
Docker Compose ist großartig für Single-Node Deployments. Aber was, wenn ich mehrere Server habe? Was wenn ich Auto-Scaling brauche? Kubernetes ist der logische nächste Schritt. Das wird ein großes Lernprojekt, aber ich freue mich drauf.
Learning Plan: Erst minikube lokal, dann managed K8s Cluster, schließlich Migration der bestehenden Docker Compose Services. Helm Charts für Package Management.
Normale CRUD-APIs sind OK, aber was ist mit Audit-Trails? Rollbacks? Komplexen Business-Workflows? Event Sourcing könnte die Antwort sein. Statt Daten zu überschreiben, sammle ich Events. Das wäre perfekt für Lehrbericht-Workflows oder Lernfortschritt-Tracking.
Use Case: Azurrow könnte von Event Sourcing profitieren - jeder Lernschritt als Event, Replay für Analyse, unterschiedliche Read-Models für verschiedene Views.
Meine Spring Boot Monolithe werden langsam groß. Zeit, sie in kleinere, fokussierte Services aufzuteilen. Gleichzeitig will ich GraphQL ausprobieren - weniger API-Calls, bessere Performance für die Flutter Apps, type-safe queries.
Architecture Vision: User Service, Learning Service, Content Service - jeder mit eigener Database, kommuniziert über Events, GraphQL Gateway als einheitlicher API-Layer.