Delivery Handbuch
Vollständige, direkt lesbare All-in-One-Dokumentation für den Delivery-Bereich.
Einziger Haupt-Einstieg: seb4u-java-master/index.html
Überblick und Schnellstart
Dieses Delivery-Handbuch ist eine All-in-One-Seite. Alle wichtigen Inhalte werden direkt hier angezeigt. Du musst nicht in Unterordner wechseln, um CI/CD, Docker, Kubernetes, Security, Observability, Runbooks, ADRs, Templates, Skripte oder Konfigurationen zu lesen.
seb4u-java-master/index.html. Diese Seite ist das vollständige Delivery-Handbuch im Ordner delivery/.Schnellstart
cd delivery
cp .env.example .env
./scripts/preflight.sh
./scripts/ci-local.sh
./scripts/dev-up.sh
./scripts/smoke-test.sh
./scripts/dev-down.sh
Delivery
Quelle: README.md
Delivery
Dieser Ordner ist kein eigener Einstiegspunkt. Der einzige Einstieg für das gesamte Paket ist:
seb4u-java-master/index.html
Der Ordner delivery/ enthält die Delivery-/DevOps-Artefakte zum Java-Master-System:
- CI/CD-Workflows unter
.github/workflows/ - Docker-Dateien und
compose.yaml - Kubernetes-Demo-Manifeste unter
k8s/ - lokale Skripte unter
scripts/ - Delivery-Dokumentation unter
docs/devops/ - ADRs unter
docs/adr/ - API-Beispiele unter
docs/api/ - Maven-/Java-Projektdateien für Delivery-Prüfungen
Wichtige HTML-Dokumente
Diese HTML-Seiten sind Dokumentationsseiten, aber keine separaten Startpunkte:
docs/devops/DELIVERY_MASTER_PLAN.htmldocs/devops/CI_CD.htmldocs/devops/DOCKER.htmldocs/devops/KUBERNETES_BASELINE.htmlfalls vorhanden, sonstk8s/README.htmldocs/devops/SECURITY_DELIVERY_CHECKLIST.htmldocs/devops/OBSERVABILITY_DEEP_DIVE.htmldocs/devops/RELEASE_RUNBOOK.htmldocs/devops/INCIDENT_RUNBOOK.htmldocs/devops/OPERATIONS_PLAYBOOK.html
Schnellstart lokal
cd delivery
cp .env.example .env
bash scripts/preflight.sh
bash scripts/ci-local.sh
make docker-up
make smoke
make docker-down
Name
Im gesamten Paket heißt dieser Bereich nur noch Delivery. Alte Namen wie Delivery, Delivery, fixed, clean oder v2 werden nicht mehr verwendet.
seb4u Java Master – Delivery
Quelle: docs/devops/DELIVERY_INTRO.md
seb4u Java Master – Delivery
Dieses Paket erweitert das bestehende Java-Master-Projekt um professionelle Delivery-Struktur.
Neue Bereiche
- GitHub Actions CI
- Docker und Compose
- lokale Make-Targets
- Package Guard
- Quality-Gates
- Smoke-Tests
- OpenAPI-Vertrag
- ADRs
- Release- und Incident-Runbooks
- Portfolio-Guide
Schnellstart
cp .env.example .env
make compile
make test
make quality
make docker-up
make smoke
make docker-down
Wichtigste Dateien
.github/workflows/ci.yml
.github/workflows/docker-smoke.yml
.github/workflows/release-dry-run.yml
Dockerfile.spring
Dockerfile.file-worker
compose.yaml
Makefile
docs/devops/
docs/adr/
docs/api/commerceflow-openapi.yaml
docs/project/
scripts/package-guard.sh
scripts/quality-gates.sh
scripts/smoke-test.sh
Package-Standard
Alle eigenen Java-Packages bleiben bei:
com.seb4u.demo...com.seb4u.demo.spring...com.seb4u.demo.jakarta...
SEB4U Delivery
Quelle: docs/devops/DELIVERY_OVERVIEW.md
SEB4U Delivery
Der Delivery Pack wurde ausgebaut. Er ist jetzt nicht nur ein kleines DevOps-Beispiel, sondern ein kompletter professioneller Auslieferungs- und Betriebsrahmen für das Java-Master-Projekt.
Inhalt
| Bereich | Enthalten |
|---|---|
| CI/CD | GitHub Actions für CI, Docker Smoke, Release Dry Run, Security, Docs, Nightly Quality |
| Container | Dockerfiles, Compose, lokale Stack-Skripte |
| Kubernetes | Namespace, Deployment, Service, Ingress, HPA, PDB, NetworkPolicy, Kustomize |
| Qualität | Package Guard, Quality Gates, OpenAPI Check, Local CI, Performance Smoke |
| Security | Delivery Security Checklist, Supply Chain Hinweise, Secret Scan Baseline |
| Betrieb | Incident Runbook, Operations Playbook, Rollback Strategy, Service Levels |
| Observability | Logging-Konzept, Metrics, Alert-Regeln, Beispiel-Konfigurationen |
| Projektführung | ADRs, Roadmap, Task Board, Review-Rubrik, PR Template |
Umfang
- Dateien gesamt: 180
- Java-Dateien: 54
- GitHub Workflows: 6
- Kubernetes YAML-Dateien: 9
- Shell-Skripte: 13
- DevOps/Doku-Dateien: 46
Start
cp .env.example .env
bash scripts/preflight.sh
bash scripts/ci-local.sh
make docker-up
make smoke
make docker-down
Delivery Master Plan
Quelle: docs/devops/DELIVERY_MASTER_PLAN.md
Delivery Master Plan
Dieses Dokument beschreibt die professionelle Auslieferung des SEB4U Java Master Projekts von lokalem Build bis Release.
Zielbild
| Bereich | Ziel | Artefakt |
|---|---|---|
| Build | reproduzierbar, schnell, prüfbar | Maven, Wrapper-Strategie, CI |
| Test | Unit, Integration, Smoke, Contract | JUnit, Testplan, OpenAPI |
| Container | lokal und CI nutzbar | Dockerfiles, Compose |
| Security | früh prüfen, nicht erst im Betrieb | Package Guard, Dependency Checkliste |
| Release | nachvollziehbar und rückrollbar | Runbook, Changelog, Tags |
| Betrieb | beobachtbar, diagnosefähig | Logs, Metrics, Traces, Health |
Pipeline-Stufen
- Validate: Java-Version, Package-Standard, Format, statische Checks.
- Compile: alle Module kompilieren.
- Test: Unit- und Modul-Tests.
- Contract: OpenAPI-Datei validieren und Beispielrequests prüfen.
- Package: JARs und Container bauen.
- Smoke: Service startet, Healthcheck antwortet, Beispielrequest funktioniert.
- Release Dry Run: Version, Changelog, Git-Tag, Rollback-Plan prüfen.
- Deploy: Zielumgebung aktualisieren.
- Observe: Logs, Metriken und Fehlerbudget beobachten.
Definition of Done
- Alle Qualitäts-Gates grün.
- Keine fremden Demo-Packages (
com.example,com.acme). - OpenAPI und Implementierung passen zusammen.
- Smoke-Test läuft gegen Container.
- Release Notes sind geschrieben.
- Rollback-Schritte sind dokumentiert.
Lokale Entwicklung
Quelle: docs/devops/LOCAL_DEVELOPMENT.md
Lokale Entwicklung
Voraussetzungen
- Java 25 oder kompatible JDK-Installation
- Maven 3.9+ oder IDE mit Maven-Integration
- Docker mit Compose-Unterstützung
- Git
Standardworkflow
make compile
make test
make quality
Spring Adapter starten
make run-spring
oder per Docker:
make docker-up
make smoke
make docker-down
Typische Fehler
| Symptom | Ursache | Lösung |
|---|---|---|
Unsupported class file major version |
falsches JDK | Java 25 aktivieren |
| Port 8080 belegt | anderer Service läuft | APP_PORT=8090 make docker-up |
| Docker Healthcheck rot | App startet noch | Logs lesen: docker compose logs -f |
| Tests grün, Docker rot | Dockerfile/Runtime-Problem | Smoke-Workflow lokal nachbauen |
CI/CD Pipeline
Quelle: docs/devops/CI_CD.md
CI/CD Pipeline
Pipeline-Stufen
Checkout -> JDK Setup -> Compile -> Test -> Package -> Package Guard -> Reports
CI-Ziele
- schnelles Feedback bei Pull Requests
- reproduzierbarer Maven-Build
- Erkennen falscher Package-Namen
- zentrale Testreports
- separater Docker-Smoke für Runtime-Probleme
Branch-Strategie
| Branch | Zweck | Gate |
|---|---|---|
main |
stabiler Stand | CI muss grün sein |
feature/* |
Lern-/Featurearbeit | PR + Review |
release/* |
Release-Kandidat | Release-Dry-Run |
Quality Gates
mvn compilemvn testmvn packagescripts/package-guard.sh- OpenAPI- und ADR-Dateien vorhanden
Warum kein Deployment automatisch?
Das Projekt ist ein Lernsystem. Deshalb erzeugt die Pipeline zuerst reproduzierbare Artefakte. Echte Deployments sollten später mit Umgebung, Secrets, Registry und Rollback-Regeln ergänzt werden.
Quality Gates
Quelle: docs/devops/QUALITY_GATES.md
Quality Gates
Definition of Done
Ein Modul gilt als fertig, wenn:
- es kompiliert
- Tests vorhanden und grün sind
- Package-Standard eingehalten wird
- README aktualisiert ist
- Fehlerfälle erklärt sind
- bei API-Code der Vertrag dokumentiert ist
Review-Checkliste
| Bereich | Frage |
|---|---|
| Architektur | Bleibt Domain frei von Frameworks? |
| API | Sind Fehlerantworten stabil? |
| I/O | Sind Pfade validiert und Schreibvorgänge atomar? |
| Concurrency | Gibt es Timeouts, Cancellation und Shutdown? |
| Security | Werden Secrets nie geloggt? |
| Testing | Gibt es positive und negative Fälle? |
| Betrieb | Gibt es Healthcheck und Runbook? |
Automatisierte Gates
bash scripts/package-guard.sh
mvn -B -ntp compile
mvn -B -ntp test
mvn -B -ntp package
Docker & Compose
Quelle: docs/devops/DOCKER.md
Docker & Compose
Services
| Service | Profil | Zweck |
|---|---|---|
commerceflow-spring |
app |
REST/HTTP Adapter |
file-worker |
worker |
File-/Outbox-Demo |
docs |
docs |
Workbook/Cheat-Sheets lokal anzeigen |
App starten
docker compose --profile app up -d --build
curl http://localhost:8080/actuator/health
Dokumentation starten
docker compose --profile docs up -d
open http://localhost:8088
Designregeln
- Dockerfiles bauen nur konkrete Adapter, nicht alle Lernmodule als Runtime.
- Domain und Application bleiben Framework-neutral.
- Runtime-Images laufen mit unprivilegiertem User.
- Healthchecks prüfen den tatsächlichen HTTP-Prozess.
Kubernetes Demo Manifeste
Quelle: k8s/README.md
Kubernetes Demo Manifeste
Diese Manifeste sind als Lern- und Strukturbeispiel gedacht. Für Produktion müssen Image Registry, Secrets, Ressourcenlimits und Netzwerkregeln projektspezifisch angepasst werden.
kubectl apply -k k8s/
kubectl get pods -n seb4u
Environment Strategy
Quelle: docs/devops/ENVIRONMENT_STRATEGY.md
Environment Strategy
| Umgebung | Zweck | Daten | Deployment |
|---|---|---|---|
| local | Entwicklung | Demo/Test | Compose |
| ci | automatisierte Checks | generiert | GitHub Actions |
| staging | Releaseprobe | anonymisiert | Container/K8s |
| prod | Betrieb | echt | kontrolliert |
Konfigurationsregeln
- Defaults dürfen sicher sein, aber nicht produktionsgefährlich.
- Secrets nie committen.
- Ports, URLs und Credentials über Environment oder Profile.
- Feature Flags explizit dokumentieren.
Test Strategy
Quelle: docs/devops/TEST_STRATEGY.md
Test Strategy
Testpyramide
| Ebene | Zweck | Beispiele |
|---|---|---|
| Unit | reine Logik | Money, Result, Validatoren |
| Modul | Ports/Use Cases | PlaceOrderUseCase mit Fake Ports |
| Integration | Adapter | File Outbox, Spring Controller |
| Contract | API-Vertrag | OpenAPI gegen Request/Response |
| Smoke | läuft der Service? | Healthcheck + Beispielorder |
| Performance Smoke | grobe Regression | 100 Beispielrequests, Latenzgrenze |
Anti-Patterns
- Alles mit Spring-Kontext testen, obwohl reine Domainlogik reicht.
- Zufällige Tests ohne kontrollierte Clock/ID-Generatoren.
- Tests, die Reihenfolge oder globale Zustände voraussetzen.
- Nur Happy Path testen.
Checkliste pro Pull Request
- [ ] Mindestens ein Test schützt die neue Fachregel.
- [ ] Fehlerfall ist abgedeckt.
- [ ] Keine Sleeps in Tests ohne Timeout-Strategie.
- [ ] Tests sind unabhängig voneinander ausführbar.
- [ ] Keine echten Secrets in Testdaten.
Security Delivery Checklist
Quelle: docs/devops/SECURITY_DELIVERY_CHECKLIST.md
Security Delivery Checklist
Vor Merge
- [ ] Keine Secrets im Repository.
- [ ] Keine alten Demo-Packages.
- [ ] Eingaben validiert.
- [ ] Fehlerantworten verraten keine Interna.
- [ ] Authentifizierung/Autorisierung nicht im Controller versteckt.
- [ ] Logs enthalten keine Passwörter, Tokens oder vollständige Zahlungsdaten.
Vor Release
- [ ] Dependency-Report geprüft.
- [ ] Container läuft als non-root User.
- [ ] Nur notwendige Ports exposed.
- [ ] CORS bewusst konfiguriert.
- [ ] Rate Limit oder Schutzkonzept dokumentiert.
- [ ] Rollback-Plan vorhanden.
Threat Model Kurzform
| Bedrohung | Schutz |
|---|---|
| Manipulierte Requests | Validation + Fehlerverträge |
| Replay | Idempotency Keys |
| Datenverlust | Outbox + atomare Dateioperationen |
| Secret Leak | .env.example, keine echten Secrets |
| Supply Chain | Dependabot, Lock/Version Review |
Supply Chain Security
Quelle: docs/devops/SUPPLY_CHAIN_SECURITY.md
Supply Chain Security
Risiken
- Ungeprüfte Dependencies.
- Zu breite Version Ranges.
- Base Images ohne Update-Strategie.
- Build-Skripte ohne Review.
- Secrets in CI Logs.
Regeln
- Versionen zentral verwalten.
- Dependency Updates klein und regelmäßig einspielen.
- CI-Workflows wie Code behandeln.
- Container möglichst minimal halten.
- Keine Tokens in Beispieldateien.
Observability
Quelle: docs/devops/OBSERVABILITY.md
Observability
Ziel
Nicht nur wissen, dass etwas kaputt ist, sondern schnell erkennen:
- welche Operation betroffen ist
- welche Korrelation/Order-ID betroffen ist
- ob der Fehler transient oder dauerhaft ist
- ob ein Rollback nötig ist
Minimalstandard
| Signal | Beispiel |
|---|---|
| Logs | strukturierte Events mit Order-ID |
| Metrics | Requests, Fehler, Dauer, Queue-Länge |
| Traces | Use Case über Adaptergrenzen hinweg |
| Health | Liveness und Readiness |
Log-Event-Form
{
"event": "order.placed",
"orderId": "ord-123",
"customerId": "cus-1",
"durationMs": 42,
"result": "success"
}
Lernaufgabe
Erweitere commerceflow-adapter-spring um einen Request-Logging-Filter,
der pro Request eine Korrelation-ID erzeugt oder übernimmt.
Observability Deep Dive
Quelle: docs/devops/OBSERVABILITY_DEEP_DIVE.md
Observability Deep Dive
Was beobachtet wird
| Signal | Frage | Beispiel |
|---|---|---|
| Logs | Was ist passiert? | order.created, payment.failed |
| Metrics | Wie oft/langsam? | Requestdauer, Fehlerquote |
| Traces | Wo hängt es? | Controller → Use Case → Adapter |
| Events | Welche Fachänderung? | OrderPlaced, PaymentApproved |
Strukturierte Logfelder
{
"service": "commerceflow",
"env": "local",
"correlationId": "c-123",
"orderId": "o-987",
"event": "order.created",
"durationMs": 42
}
Alert-Regeln
- Fehlerquote > 2% für 10 Minuten.
- P95 Latenz > 500ms für 15 Minuten.
- Outbox Queue wächst über Schwellenwert.
- Healthcheck schlägt mehrfach fehl.
Service Levels
Quelle: docs/devops/SERVICE_LEVELS.md
Service Levels
Beispiel-SLOs für CommerceFlow
| Messwert | Ziel |
|---|---|
| Verfügbarkeit local/staging | nicht relevant, nur Demo |
| Fehlerquote API | < 2% im Smoke-Test |
| P95 Response Time | < 500ms im Smoke-Test |
| Outbox Verarbeitung | innerhalb 60 Sekunden |
Fehlerbudget
Ein Fehlerbudget verhindert, dass neue Features blind ausgeliefert werden, wenn der Service instabil ist. Für Lernprojekte genügt ein vereinfachter Ansatz: Wenn Smoke/Quality-Gates rot sind, wird nicht released.
Production Readiness Matrix
Quelle: docs/devops/PRODUCTION_READINESS_MATRIX.md
Production Readiness Matrix
| Kategorie | Bronze | Silber | Gold |
|---|---|---|---|
| Build | mvn test läuft |
CI prüft alle Module | reproduzierbare Versionen + SBOM |
| Tests | Unit Tests | Integration + Smoke | Contract + Performance Smoke |
| Config | .env.example |
Profile lokal/ci/prod | Secret-Strategie dokumentiert |
| Logging | lesbare Logs | strukturierte Logs | Correlation IDs + Audit Events |
| Metrics | Health Endpoint | technische Metriken | Business-Metriken + Alerts |
| Security | Input Validation | Dependency Checks | Threat Model + Release Gate |
| Deployment | manuell | Docker Compose | Kubernetes Manifeste + Rollback |
| Betrieb | README | Runbooks | Incident Simulation |
Master-Regeln
- Ein Service ist nicht fertig, wenn er nur lokal startet.
- Jede Änderung braucht einen Weg zum Testen, Releasen und Zurückrollen.
- Logs sind Teil des Produkts, nicht Debug-Reste.
- Konfiguration gehört nicht in Code, sondern in Umgebung, Profile oder Secret Stores.
Release Runbook
Quelle: docs/devops/RELEASE_RUNBOOK.md
Release Runbook
1. Vorbereitung
git status
make quality
bash scripts/release-dry-run.sh 1.0.0
2. Prüfung
- Sind alle Tests grün?
- Stimmen Package-Namen mit
com.seb4u.demo...? - Sind README, Workbook und Cheat-Sheets aktuell?
- Ist das OpenAPI-Dokument aktuell?
- Gibt es offene ADRs?
3. Artefakte
- Maven-Module als JARs
- Docker Image für Spring Adapter
- ZIP-Archiv für Lernpaket
- SHA256-Prüfsumme
4. Rollback
- letzte funktionierende Git-Revision identifizieren
- Docker-Image-Tag zurücksetzen
- Compose oder Plattform neu starten
- Smoke-Test ausführen
- Incident-Notiz schreiben
5. Nachbereitung
- Changelog ergänzen
- Lessons Learned notieren
- Workbook-Aufgaben ggf. anpassen
Rollback Strategy
Quelle: docs/devops/ROLLBACK_STRATEGY.md
Rollback Strategy
Rollback-Arten
| Art | Wann | Risiko |
|---|---|---|
| Container-Rollback | Service-Code fehlerhaft | niedrig |
| Config-Rollback | falsche Variable/Profile | mittel |
| Daten-Rollback | Migration fehlerhaft | hoch |
| Feature-Flag-Off | Feature fehlerhaft | niedrig |
Vor jedem Release klären
- Welche Version ist die letzte bekannte gute Version?
- Sind Datenmigrationen rückwärtskompatibel?
- Gibt es ein Feature Flag?
- Welche Smoke-Tests bestätigen den Rollback?
Incident Runbook
Quelle: docs/devops/INCIDENT_RUNBOOK.md
Incident Runbook
Erste 5 Minuten
- Umfang klären: lokal, CI, Docker, Runtime?
- Logs sichern:
docker compose logs --no-color > incident.log - Health prüfen:
curl -v /actuator/health - letzte Änderung finden:
git log --oneline -5 - Workaround oder Rollback entscheiden
Diagnosematrix
| Problem | Prüfen | Häufige Lösung |
|---|---|---|
| App startet nicht | Java-Version, JAR, Env | Dockerfile oder JDK korrigieren |
| Tests hängen | Concurrency-Code | Timeouts, Executor Shutdown |
| API 500 | Controller/Use Case | Fehlervertrag testen |
| Outbox leer | Adapter-Konfiguration | Pfade/Volumes prüfen |
| CI rot | Workflow-Log | lokal denselben Maven-Befehl ausführen |
Postmortem-Fragen
- Was war der technische Auslöser?
- Welcher Test hätte es verhindert?
- Welche Dokumentation fehlte?
- Welche Metrik hätte früher gewarnt?
Operations Playbook
Quelle: docs/devops/OPERATIONS_PLAYBOOK.md
Operations Playbook
Häufige Symptome
| Symptom | Erste Prüfung | Nächster Schritt |
|---|---|---|
| Service startet nicht | Logs, Port, Env | Config prüfen |
| Healthcheck rot | /actuator/health |
Dependency prüfen |
| Requests langsam | Metriken, Logs | Thread/DB/File IO prüfen |
| Outbox wächst | Worker Logs | Dead-letter prüfen |
| 4xx häufen sich | Request Validation | API Docs prüfen |
| 5xx häufen sich | Stacktraces | Rollback erwägen |
Incident-Minimalprozess
- Problem beschreiben.
- Zeit und betroffene Version notieren.
- Scope feststellen.
- Sofortmaßnahme wählen.
- Ursache analysieren.
- Follow-up Task erstellen.
CommerceFlow Runbook
Quelle: docs/devops/RUNBOOK_COMMERCEFLOW.md
CommerceFlow Runbook
Start lokal
cp .env.example .env
make docker-up
make smoke
Diagnose
docker compose ps
docker compose logs -f commerceflow-spring
curl -i http://localhost:8080/actuator/health
Typische Fehler
| Fehler | Ursache | Lösung |
|---|---|---|
| Port belegt | 8080 genutzt | .env Port ändern |
| Build rot | Java/Maven fehlt | Devcontainer nutzen |
| Smoke rot | Service nicht ready | Logs prüfen |
| Outbox leer | Use Case nicht ausgeführt | Beispielrequest senden |
Code Ownership
Quelle: docs/devops/CODE_OWNERSHIP.md
Code Ownership
| Bereich | Owner-Rolle | Review-Fokus |
|---|---|---|
| Domain | Backend/Core | Invarianten, Typmodell |
| Application | Backend | Use Cases, Transaktionen |
| Adapter | Integration | Fehler, I/O, Timeouts |
| Delivery | DevOps | CI, Container, Release |
| Docs | Tech Lead | Verständlichkeit, Aktualität |
Review-Regeln
- Kritische Pfade brauchen zweiten Review.
- Delivery-Dateien zählen als produktiver Code.
- Jede neue Architekturentscheidung bekommt ein ADR, wenn sie mehrere Module betrifft.
Changelog Template
Quelle: docs/devops/CHANGELOG_TEMPLATE.md
Changelog Template
[Unreleased]
Added
Changed
Fixed
Security
[x.y.z] - YYYY-MM-DD
Added
Changed
Fixed
Release Notes Template
Quelle: docs/devops/RELEASE_NOTES_TEMPLATE.md
Release Notes Template
Version
vX.Y.Z
Änderungen
- Feature:
- Fix:
- Breaking Change:
- Migration:
Risiken
- Technisch:
- Fachlich:
- Betrieb:
Tests
- [ ] Unit
- [ ] Integration
- [ ] Smoke
- [ ] Docker
- [ ] Rollback geprüft
Projekt-Roadmap
Quelle: docs/project/ROADMAP.md
Projekt-Roadmap
Phase 1: Stabilisieren
- Package Guard in CI aktiv
- Smoke-Test lokal und in GitHub Actions
- OpenAPI-Vertrag prüfen
- README pro Modul aktuell halten
Phase 2: Professionalisieren
- Spring Adapter mit echten Fehlerantworten erweitern
- Testcontainers für Spring Adapter ergänzen
- Observability-Beispiele um Metriken erweitern
- Docker-Image in Registry veröffentlichen
Phase 3: Portfolio-Reife
- Screenshots und API-Beispiele ergänzen
- Architekturdiagramme aktualisieren
- 3–5 Architekturentscheidungen erklären
- Demo-Video oder README Walkthrough erstellen
Task Board
Quelle: docs/project/TASK_BOARD.md
Task Board
Backlog
| ID | Aufgabe | Modul | Schwierigkeit |
|---|---|---|---|
| B-001 | Request Correlation ID einbauen | Spring | Mittel |
| B-002 | Outbox Worker idempotent machen | File Adapter | Schwer |
| B-003 | Contract-Test aus OpenAPI ableiten | Tests | Schwer |
| B-004 | Docker Image Größe messen | DevOps | Mittel |
| B-005 | Algorithmen-Benchmark ergänzen | Algorithms | Mittel |
In Progress
| ID | Aufgabe | Notiz |
|---|---|---|
| P-001 | Delivery Pack prüfen | make quality lokal ausführen |
Done-Kriterien
- Code kompiliert
- Tests grün
- README/Workbook angepasst
- Package Guard grün
- Smoke-Test dokumentiert
Review-Rubrik
Quelle: docs/project/REVIEW_RUBRIC.md
Review-Rubrik
| Punkte | Bedeutung |
|---|---|
| 0 | fehlt oder falsch |
| 1 | funktioniert nur für Happy Path |
| 2 | solide, aber mit Lücken |
| 3 | produktionsnah und gut erklärt |
Bewertungskategorien
| Kategorie | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| Korrektheit | kompiliert nicht | Happy Path | Edge Cases | Fehlerverträge |
| Architektur | vermischt Schichten | teilweise getrennt | klare Ports | sauber hexagonal |
| Tests | keine | wenige | relevante Fälle | inkl. negative Fälle |
| Betrieb | keine Hinweise | Startbefehl | Health/Logs | Runbook/Smoke |
| Security | ignoriert | einfache Checks | Validation | sichere Defaults |
Portfolio Guide
Quelle: docs/project/PORTFOLIO_GUIDE.md
Portfolio Guide
Ziel
Das Projekt soll zeigen, dass du Java nicht nur syntaktisch kennst, sondern strukturiert entwickeln, testen und betreiben kannst.
README-Erzählung
- Problem: CommerceFlow simuliert Bestellung und Outbox.
- Architektur: Domain, Application, Adapter.
- Qualität: Tests, Package Guard, CI.
- Betrieb: Docker, Healthcheck, Smoke-Test.
- Lernen: Workbook und Cheat-Sheets.
Gute Demo-Reihenfolge
make test
make docker-up
make smoke
make docker-down
Interview-Satz
„Ich habe das Projekt bewusst hexagonal aufgebaut: Die Domain kennt weder Spring noch Jakarta, Adapter implementieren Ports, und CI prüft Package- und Build-Regeln automatisch.“
Architektur: seb4u Java Master Projektpaket
Quelle: docs/ARCHITECTURE.md
Architektur: seb4u Java Master Projektpaket
Modulgruppen
A Lernlabs
java-core
java-io
java-concurrency
java-algorithms
security-labs
B CommerceFlow Core
commerceflow-domain
commerceflow-application
C Adapter
commerceflow-adapter-file
commerceflow-adapter-spring
commerceflow-adapter-jakarta
D Tests
commerceflow-tests
Dependency-Regel
Adapter -> Application -> Domain
Labs -> keine CommerceFlow-Abhängigkeit
Domain -> keine Framework-Abhängigkeit
Package-Regel
com.seb4u.demo.*
com.seb4u.demo.spring.*
com.seb4u.demo.jakarta.*
Projektstruktur
Quelle: docs/PROJECT_TREE.md
Projektstruktur
seb4u-java-master-parent/
├── pom.xml
├── README.md
├── docs/
├── java-core/
├── java-io/
├── java-concurrency/
├── java-algorithms/
├── security-labs/
├── commerceflow-domain/
├── commerceflow-application/
├── commerceflow-adapter-file/
├── commerceflow-adapter-spring/
├── commerceflow-adapter-jakarta/
└── commerceflow-tests/
Architecture Decision Records
Quelle: docs/adr/README.md
Architecture Decision Records
ADRs dokumentieren wichtige Projektentscheidungen. Jede Entscheidung wird kurz, prüfbar und änderbar beschrieben.
Index
- ADR-0001: Package Standard
- ADR-0002: Hexagonale CommerceFlow Architektur
- ADR-0003: Maven Multi-Module Aufbau
- ADR-0004: Docker Compose für lokale Laufzeit
- ADR-0005: CI Quality Gates
- ADR-0006: OpenAPI als API-Vertrag
Vorlage
# ADR-XXXX: Titel
## Status
Akzeptiert | Ersetzt | Entwurf
## Kontext
## Entscheidung
## Konsequenzen
Zweck
Quelle: .github/PULL_REQUEST_TEMPLATE.md
Zweck
Änderung
Tests
- [ ] Unit
- [ ] Integration
- [ ] Smoke
- [ ] Nicht nötig, Begründung:
Risiko
Checkliste
- [ ] Package-Standard eingehalten
- [ ] Keine Secrets
- [ ] Doku aktualisiert
- [ ] Rollback bedacht
seb4u Projektpaket Check
Quelle: SEB4U_PROJECT_EXPORT_CHECK.md
seb4u Projektpaket Check
Ziel: Empfehlung 9 + 10 umsetzen.
- Projekt-Export Edition: umgesetzt
- Maven Multi-Module Edition: umgesetzt
- Package-Standard:
com.seb4u.demo,com.seb4u.demo.spring,com.seb4u.demo.jakarta - Hexagonale CommerceFlow-Struktur: umgesetzt
- Spring und Jakarta getrennt: umgesetzt
- README pro Modul: umgesetzt
- Quickstart und HTTP-Testrequest: umgesetzt
Hinweis: Der Container hatte kein Maven installiert. Es wurde deshalb ein statischer Struktur- und Package-Check durchgeführt; Maven-Build bitte lokal mit JDK 25 und Maven ausführen.
seb4u Java Master Projektpaket – Report
Quelle: SEB4U_PROJECT_EXPORT_REPORT.md
seb4u Java Master Projektpaket – Report
Ergebnis
- Java-Dateien: 44
- Maven-POMs: 12
- Maven-Module: 11
- README-Dateien: 12
- eindeutige Package-Deklarationen: 13
- ungültige Packages: 0
Module
java-corejava-iojava-concurrencyjava-algorithmssecurity-labscommerceflow-domaincommerceflow-applicationcommerceflow-adapter-filecommerceflow-adapter-springcommerceflow-adapter-jakartacommerceflow-tests
Package-Standard
Alle eigenen Java-Dateien liegen unter einer dieser Basen:
com.seb4u.democom.seb4u.demo.springcom.seb4u.demo.jakarta
Statischer Package-Check: OK
Compile-Check
javac --release 21für alle frameworkfreien Main-Module: OK- Spring/Jakarta-Module benötigen externe Dependencies und wurden im Container nicht mit Maven gebaut.
- Im Container war Maven nicht installiert; lokaler Vollbuild bitte mit JDK 25 und Maven ausführen:
mvn clean verify
Empfohlener lokaler Volltest
cd seb4u-java-master-parent
mvn clean verify
mvn -pl commerceflow-adapter-spring -am spring-boot:run
SEB4U Java Master – Delivery-Bereinigung Check
Quelle: check.md
SEB4U Java Master – Delivery-Bereinigung Check
Datum: 2026-07-03T08:59:39
Ziel
Im Gesamtpaket soll es genau eine Delivery-Sektion geben.
Ergebnis
- Einziger Delivery-Startpunkt:
delivery/index.html - Delivery-Dokumentation:
delivery/index.html - Kein zusätzliches Delivery-ZIP im Hauptpaket
- Einheitlicher sichtbarer Name: Delivery
- Alle Delivery-Inhalte liegen direkt lesbar unter
delivery/
Prüfwerte
- HTML-Dateien geprüft: 109
- Fehlende lokale HTML-Links: 0
- HTML-Dateien mit doppelten IDs: 0
- Alte Delivery-Doppelbegriffe in Startdateien: 0
- ZIP-Dateien innerhalb von
delivery/: 0
Fehlende Links
Keine.
Doppelte IDs
Keine.
Alte Begriffe in Startdateien
Keine.
ZIP-Dateien in Delivery
Keine.
commerceflow-adapter-file
Quelle: commerceflow-adapter-file/README.md
commerceflow-adapter-file
Dateibasierte Adapter für Repository und Outbox.
commerceflow-adapter-jakarta
Quelle: commerceflow-adapter-jakarta/README.md
commerceflow-adapter-jakarta
Jakarta Servlet Adapter mit Package com.seb4u.demo.jakarta.commerceflow.
commerceflow-adapter-spring
Quelle: commerceflow-adapter-spring/README.md
commerceflow-adapter-spring
Spring Boot REST Adapter mit Package com.seb4u.demo.spring.commerceflow.
commerceflow-application
Quelle: commerceflow-application/README.md
commerceflow-application
Use Cases und Ports ohne Framework-Abhängigkeit.
commerceflow-domain
Quelle: commerceflow-domain/README.md
commerceflow-domain
Frameworkfreier Domain Core für CommerceFlow.
commerceflow-tests
Quelle: commerceflow-tests/README.md
commerceflow-tests
Akzeptanztests und Architekturregeln für CommerceFlow.
ADR-0001-package-standard: Package Standard
Quelle: docs/adr/ADR-0001-package-standard.md
ADR-0001-package-standard: Package Standard
Status
Akzeptiert
Kontext
Das seb4u Java Master Projekt ist gleichzeitig Lernsystem, Codebasis und Portfolio-Projekt. Deshalb müssen Architekturentscheidungen sichtbar dokumentiert werden.
Entscheidung
Alle eigenen Packages verwenden com.seb4u.demo, com.seb4u.demo.spring oder com.seb4u.demo.jakarta.
Konsequenzen
Ein konsistenter Package-Standard macht Codebeispiele kopierbar, suchbar und prüfbar.
Review-Fragen
- Ist die Entscheidung noch passend?
- Gibt es neue Module, die dagegen verstoßen?
- Muss das Workbook angepasst werden?
ADR-0002-hexagonal-commerceflow: Hexagonale CommerceFlow Architektur
Quelle: docs/adr/ADR-0002-hexagonal-commerceflow.md
ADR-0002-hexagonal-commerceflow: Hexagonale CommerceFlow Architektur
Status
Akzeptiert
Kontext
Das seb4u Java Master Projekt ist gleichzeitig Lernsystem, Codebasis und Portfolio-Projekt. Deshalb müssen Architekturentscheidungen sichtbar dokumentiert werden.
Entscheidung
Domain und Application bleiben Framework-neutral; Adapter implementieren Ports.
Konsequenzen
So kann Spring, Jakarta, File-I/O und Testing getrennt gelernt werden.
Review-Fragen
- Ist die Entscheidung noch passend?
- Gibt es neue Module, die dagegen verstoßen?
- Muss das Workbook angepasst werden?
ADR-0003-maven-multi-module: Maven Multi-Module Aufbau
Quelle: docs/adr/ADR-0003-maven-multi-module.md
ADR-0003-maven-multi-module: Maven Multi-Module Aufbau
Status
Akzeptiert
Kontext
Das seb4u Java Master Projekt ist gleichzeitig Lernsystem, Codebasis und Portfolio-Projekt. Deshalb müssen Architekturentscheidungen sichtbar dokumentiert werden.
Entscheidung
Das Projekt nutzt ein Parent-POM mit Lern- und CommerceFlow-Modulen.
Konsequenzen
Modulgrenzen werden sichtbar und Dependency-Richtung kann geprüft werden.
Review-Fragen
- Ist die Entscheidung noch passend?
- Gibt es neue Module, die dagegen verstoßen?
- Muss das Workbook angepasst werden?
ADR-0004-docker-compose-local: Docker Compose für lokale Laufzeit
Quelle: docs/adr/ADR-0004-docker-compose-local.md
ADR-0004-docker-compose-local: Docker Compose für lokale Laufzeit
Status
Akzeptiert
Kontext
Das seb4u Java Master Projekt ist gleichzeitig Lernsystem, Codebasis und Portfolio-Projekt. Deshalb müssen Architekturentscheidungen sichtbar dokumentiert werden.
Entscheidung
Lokale Runtime wird über Compose-Profile modelliert.
Konsequenzen
Lernende können App, Worker und Dokumentation getrennt starten.
Review-Fragen
- Ist die Entscheidung noch passend?
- Gibt es neue Module, die dagegen verstoßen?
- Muss das Workbook angepasst werden?
ADR-0005-ci-quality-gates: CI Quality Gates
Quelle: docs/adr/ADR-0005-ci-quality-gates.md
ADR-0005-ci-quality-gates: CI Quality Gates
Status
Akzeptiert
Kontext
Das seb4u Java Master Projekt ist gleichzeitig Lernsystem, Codebasis und Portfolio-Projekt. Deshalb müssen Architekturentscheidungen sichtbar dokumentiert werden.
Entscheidung
CI kompiliert, testet, paketiert und prüft Package-Regeln.
Konsequenzen
Schnelles Feedback verhindert schleichende Strukturfehler.
Review-Fragen
- Ist die Entscheidung noch passend?
- Gibt es neue Module, die dagegen verstoßen?
- Muss das Workbook angepasst werden?
ADR-0006-openapi-contract: OpenAPI als API-Vertrag
Quelle: docs/adr/ADR-0006-openapi-contract.md
ADR-0006-openapi-contract: OpenAPI als API-Vertrag
Status
Akzeptiert
Kontext
Das seb4u Java Master Projekt ist gleichzeitig Lernsystem, Codebasis und Portfolio-Projekt. Deshalb müssen Architekturentscheidungen sichtbar dokumentiert werden.
Entscheidung
Die CommerceFlow HTTP-API wird in docs/api/commerceflow-openapi.yaml beschrieben.
Konsequenzen
API-Design wird überprüfbar, testbar und für Frontend/Clients nutzbar.
Review-Fragen
- Ist die Entscheidung noch passend?
- Gibt es neue Module, die dagegen verstoßen?
- Muss das Workbook angepasst werden?
seb4u Delivery Pack
Quelle: docs/devops/README.md
seb4u Delivery Pack
Dieses Paket macht aus dem Lernprojekt ein professionelles Delivery-Setup.
Enthalten
- GitHub Actions für CI, Docker-Smoke und Release-Dry-Run
- Dockerfile für Spring Adapter und File Worker
- Compose-Profil für App, Worker und lokale Dokumentation
- lokale Make-Targets
- Qualitäts-Gates
- OpenAPI-Vertrag
- ADRs für Architekturentscheidungen
- Runbooks für Release, Incident, Rollback und lokale Entwicklung
Schnellstart
cp .env.example .env
make compile
make test
make docker-up
make smoke
make docker-down
Prinzip
Die Lernmodule bleiben bewusst einfach. Delivery-Dateien liegen außen herum und erklären, wie derselbe Code professionell gebaut, geprüft, paketiert und betrieben wird.
ADR-XXXX: Titel
Quelle: docs/templates/adr-template.md
ADR-XXXX: Titel
Status
Vorgeschlagen / Akzeptiert / Ersetzt
Kontext
Welche Entscheidung steht an?
Entscheidung
Was wird entschieden?
Konsequenzen
Was wird einfacher, was schwieriger?
Incident Report
Quelle: docs/templates/incident-template.md
Incident Report
Zusammenfassung
Zeitraum
Auswirkung
Ursache
Sofortmaßnahme
Dauerhafte Maßnahme
Follow-up Tasks
Release Checklist
Quelle: docs/templates/release-checklist-template.md
Release Checklist
- [ ] Version gesetzt
- [ ] Changelog aktualisiert
- [ ] Tests grün
- [ ] Docker Smoke grün
- [ ] Rollback dokumentiert
- [ ] Release Notes geschrieben
- [ ] Monitoring nach Release geprüft
java-algorithms
Quelle: java-algorithms/README.md
java-algorithms
Datenstrukturen und Algorithmen mit idiomatischem Java.
java-concurrency
Quelle: java-concurrency/README.md
java-concurrency
Virtual Threads, Bulkhead, Retry, CompletableFuture und Backpressure.
java-core
Quelle: java-core/README.md
java-core
Core Java Labs: Records, sealed Result, Value Objects, Guard Clauses und kleine Domänenmodelle.
java-io
Quelle: java-io/README.md
java-io
I/O und NIO.2 Labs: Safe Paths, Atomic Writes, CSV-Streaming und WatchService.
security-labs
Quelle: security-labs/README.md
security-labs
Passwort-Hashing, HMAC und sichere Vergleiche mit JDK-Bordmitteln.
Architekturdiagramm
Quelle: docs/architecture.svg
Datei: .devcontainer/devcontainer.json
Quelle: .devcontainer/devcontainer.json
{
"name": "seb4u Java Master",
"image": "mcr.microsoft.com/devcontainers/java:25",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
"customizations": {
"vscode": {
"extensions": [
"vscjava.vscode-java-pack",
"redhat.java",
"vmware.vscode-spring-boot",
"vscjava.vscode-maven",
"github.vscode-github-actions"
]
}
},
"postCreateCommand": "mvn -B -ntp -DskipTests compile || true",
"remoteUser": "vscode"
}
Datei: .env.example
Quelle: .env.example
JAVA_VERSION=25
APP_PORT=8080
DOCS_PORT=8088
COMMERCEFLOW_OUTBOX_DIR=./data/outbox
Datei: .github/dependabot.yml
Quelle: .github/dependabot.yml
version: 2
updates:
- package-ecosystem: maven
directory: '/'
schedule:
interval: weekly
open-pull-requests-limit: 5
labels: [dependencies, java]
- package-ecosystem: github-actions
directory: '/'
schedule:
interval: weekly
open-pull-requests-limit: 5
labels: [dependencies, ci]
- package-ecosystem: docker
directory: '/'
schedule:
interval: weekly
open-pull-requests-limit: 5
labels: [dependencies, docker]
Datei: .github/workflows/ci.yml
Quelle: .github/workflows/ci.yml
name: CI
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
workflow_dispatch:
permissions:
contents: read
checks: write
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
validate:
name: Validate Maven Modules
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 25
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '25'
cache: maven
- name: Print tool versions
run: |
java -version
mvn -version
- name: Compile all modules
run: mvn -B -ntp -DskipTests compile
- name: Run tests
run: mvn -B -ntp test
- name: Package without integration services
run: mvn -B -ntp -DskipTests package
- name: Package standard guard
run: bash scripts/package-guard.sh
- name: Upload build reports
if: always()
uses: actions/upload-artifact@v4
with:
name: surefire-reports
path: '**/target/surefire-reports/**'
if-no-files-found: ignore
Datei: .github/workflows/docker-smoke.yml
Quelle: .github/workflows/docker-smoke.yml
name: Docker Smoke
on:
workflow_dispatch:
pull_request:
paths:
- 'Dockerfile*'
- 'compose.yaml'
- 'commerceflow-*/**'
- 'pom.xml'
- '.github/workflows/docker-smoke.yml'
permissions:
contents: read
jobs:
docker-smoke:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build Spring image
run: docker build -f Dockerfile.spring -t seb4u/commerceflow-spring:ci .
- name: Compose up
run: docker compose --profile app up -d --build
- name: Smoke test
run: bash scripts/smoke-test.sh http://localhost:8080
- name: Logs on failure
if: failure()
run: docker compose logs --no-color
- name: Compose down
if: always()
run: docker compose down -v --remove-orphans
Datei: .github/workflows/docs-check.yml
Quelle: .github/workflows/docs-check.yml
name: Docs Check
on:
pull_request:
workflow_dispatch:
jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Required docs exist
run: |
test -f docs/devops/DELIVERY_MASTER_PLAN.md
test -f docs/devops/PRODUCTION_READINESS_MATRIX.md
test -f docs/api/commerceflow-openapi.yaml
test -f docs/adr/README.md
Datei: .github/workflows/nightly-quality.yml
Quelle: .github/workflows/nightly-quality.yml
name: Nightly Quality
on:
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
jobs:
nightly:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '25'
cache: maven
- name: Local CI
run: bash scripts/ci-local.sh
Datei: .github/workflows/release-dry-run.yml
Quelle: .github/workflows/release-dry-run.yml
name: Release Dry Run
on:
workflow_dispatch:
inputs:
release_version:
description: 'Release version, example: 1.0.0'
required: true
default: '1.0.0'
next_snapshot:
description: 'Next snapshot version, example: 1.0.1-SNAPSHOT'
required: true
default: '1.0.1-SNAPSHOT'
permissions:
contents: read
jobs:
release-dry-run:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 25
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '25'
cache: maven
- name: Validate release inputs
run: |
echo "Release: ${{ inputs.release_version }}"
echo "Next: ${{ inputs.next_snapshot }}"
test -n "${{ inputs.release_version }}"
test -n "${{ inputs.next_snapshot }}"
- name: Full verification
run: mvn -B -ntp verify
- name: Create dry-run archive
run: |
mkdir -p dist
git archive --format=zip --output dist/seb4u-java-master-${{ inputs.release_version }}.zip HEAD
ls -lah dist
- name: Upload dry-run archive
uses: actions/upload-artifact@v4
with:
name: release-dry-run
path: dist/*.zip
Datei: .github/workflows/security-check.yml
Quelle: .github/workflows/security-check.yml
name: Security Check
on:
pull_request:
workflow_dispatch:
jobs:
security-baseline:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check for obvious secrets
run: |
! grep -RInE "(password|secret|token|api[_-]?key)\s*[:=]\s*['\"]?[A-Za-z0-9_-]{16,}" . --exclude-dir=.git || exit 1
- name: Package guard
run: bash scripts/package-guard.sh
Datei: .gitignore
Quelle: .gitignore
target/
.idea/
.vscode/
*.iml
.DS_Store
commerceflow-data/
*.log
# Delivery pack
.env
.env.local
logs/
coverage/
target/
.docker/
*.pid
*.log
Datei: Dockerfile.file-worker
Quelle: Dockerfile.file-worker
# syntax=docker/dockerfile:1
ARG JAVA_VERSION=25
FROM maven:3-eclipse-temurin-${JAVA_VERSION} AS build
WORKDIR /workspace
COPY . .
RUN mvn -B -ntp -pl commerceflow-adapter-file -am -DskipTests package
FROM eclipse-temurin:${JAVA_VERSION}-jre
WORKDIR /app
RUN mkdir -p /app/data/outbox /app/data/archive && addgroup --system seb4u && adduser --system --ingroup seb4u seb4u
COPY --from=build /workspace/commerceflow-adapter-file/target/*.jar /app/commerceflow-file-worker.jar
USER seb4u
ENTRYPOINT ["java", "-jar", "/app/commerceflow-file-worker.jar"]
Datei: Dockerfile.spring
Quelle: Dockerfile.spring
# syntax=docker/dockerfile:1
ARG JAVA_VERSION=25
FROM maven:3-eclipse-temurin-${JAVA_VERSION} AS build
WORKDIR /workspace
COPY pom.xml ./
COPY java-core/pom.xml java-core/pom.xml
COPY java-io/pom.xml java-io/pom.xml
COPY java-concurrency/pom.xml java-concurrency/pom.xml
COPY java-algorithms/pom.xml java-algorithms/pom.xml
COPY security-labs/pom.xml security-labs/pom.xml
COPY commerceflow-domain/pom.xml commerceflow-domain/pom.xml
COPY commerceflow-application/pom.xml commerceflow-application/pom.xml
COPY commerceflow-adapter-file/pom.xml commerceflow-adapter-file/pom.xml
COPY commerceflow-adapter-spring/pom.xml commerceflow-adapter-spring/pom.xml
COPY commerceflow-adapter-jakarta/pom.xml commerceflow-adapter-jakarta/pom.xml
COPY commerceflow-tests/pom.xml commerceflow-tests/pom.xml
RUN mvn -B -ntp -DskipTests dependency:go-offline || true
COPY . .
RUN mvn -B -ntp -pl commerceflow-adapter-spring -am -DskipTests package
FROM eclipse-temurin:${JAVA_VERSION}-jre
WORKDIR /app
RUN mkdir -p /app/data/outbox && addgroup --system seb4u && adduser --system --ingroup seb4u seb4u
COPY --from=build /workspace/commerceflow-adapter-spring/target/*.jar /app/commerceflow-spring.jar
ENV SERVER_PORT=8080 \
MANAGEMENT_ENDPOINT_HEALTH_PROBES_ENABLED=true \
SPRING_PROFILES_ACTIVE=docker
EXPOSE 8080
USER seb4u
HEALTHCHECK --interval=20s --timeout=3s --start-period=30s --retries=5 \
CMD wget -qO- http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-XX:MaxRAMPercentage=75", "-jar", "/app/commerceflow-spring.jar"]
Datei: Makefile
Quelle: Makefile
SHELL := /usr/bin/env bash
MVN ?= mvn
APP_URL ?= http://localhost:8080
.PHONY: help compile test verify package run-spring docker-build docker-up docker-down smoke quality package-guard docs-tree clean
help:
@printf "seb4u Java Master targets:\n"
@printf " make compile Compile all modules\n"
@printf " make test Run unit tests\n"
@printf " make verify Run Maven verify\n"
@printf " make run-spring Run Spring adapter locally\n"
@printf " make docker-up Start Compose app profile\n"
@printf " make smoke Run smoke test against APP_URL\n"
@printf " make quality Run quality gate scripts\n"
compile:
$(MVN) -B -ntp compile
test:
$(MVN) -B -ntp test
verify:
$(MVN) -B -ntp verify
package:
$(MVN) -B -ntp -DskipTests package
run-spring:
$(MVN) -pl commerceflow-adapter-spring -am spring-boot:run
docker-build:
docker build -f Dockerfile.spring -t seb4u/commerceflow-spring:local .
docker-up:
docker compose --profile app up -d --build
docker-down:
docker compose down -v --remove-orphans
smoke:
bash scripts/smoke-test.sh $(APP_URL)
quality:
bash scripts/quality-gates.sh
package-guard:
bash scripts/package-guard.sh
docs-tree:
find . -maxdepth 3 -type f | sort
clean:
$(MVN) -B -ntp clean
docker compose down -v --remove-orphans || true
Datei: SEB4U_PROJECT_EXPORT_CHECK.json
Quelle: SEB4U_PROJECT_EXPORT_CHECK.json
{
"java_files": 44,
"pom_files": 12,
"readmes": 12,
"unique_packages": 13,
"invalid_packages": [],
"modules": [
"java-core",
"java-io",
"java-concurrency",
"java-algorithms",
"security-labs",
"commerceflow-domain",
"commerceflow-application",
"commerceflow-adapter-file",
"commerceflow-adapter-spring",
"commerceflow-adapter-jakarta",
"commerceflow-tests"
],
"javac_sanity_check": {
"status": "passed",
"scope": "frameworkfreie Module: java-core, java-io, java-concurrency, java-algorithms, security-labs, commerceflow-domain, commerceflow-application, commerceflow-adapter-file",
"runtime_in_container": "OpenJDK 21; Maven not installed in container"
}
}Datei: commerceflow-adapter-file/pom.xml
Quelle: commerceflow-adapter-file/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>commerceflow-adapter-file</artifactId>
<dependencies>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-domain</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-application</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><scope>test</scope></dependency>
</dependencies>
</project>
Datei: commerceflow-adapter-jakarta/pom.xml
Quelle: commerceflow-adapter-jakarta/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>commerceflow-adapter-jakarta</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-domain</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-application</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-adapter-file</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.1.0</version><scope>provided</scope></dependency>
</dependencies>
</project>
Datei: commerceflow-adapter-spring/pom.xml
Quelle: commerceflow-adapter-spring/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>commerceflow-adapter-spring</artifactId>
<dependencies>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-domain</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-application</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-adapter-file</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webmvc</artifactId></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Datei: commerceflow-application/pom.xml
Quelle: commerceflow-application/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>commerceflow-application</artifactId>
<dependencies>
<dependency>
<groupId>com.seb4u.demo</groupId>
<artifactId>commerceflow-domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Datei: commerceflow-domain/pom.xml
Quelle: commerceflow-domain/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>commerceflow-domain</artifactId>
<name>seb4u commerceflow-domain</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Datei: commerceflow-tests/pom.xml
Quelle: commerceflow-tests/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>commerceflow-tests</artifactId>
<dependencies>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-domain</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-application</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>com.seb4u.demo</groupId><artifactId>commerceflow-adapter-file</artifactId><version>${project.version}</version></dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><scope>test</scope></dependency>
</dependencies>
</project>
Datei: compose.yaml
Quelle: compose.yaml
name: seb4u-java-master
services:
commerceflow-spring:
profiles: [app]
build:
context: .
dockerfile: Dockerfile.spring
args:
JAVA_VERSION: ${JAVA_VERSION:-25}
image: seb4u/commerceflow-spring:local
environment:
SPRING_PROFILES_ACTIVE: docker
SERVER_PORT: 8080
COMMERCEFLOW_OUTBOX_DIR: /app/data/outbox
ports:
- '${APP_PORT:-8080}:8080'
volumes:
- commerceflow-outbox:/app/data/outbox
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:8080/actuator/health']
interval: 20s
timeout: 3s
retries: 5
start_period: 30s
file-worker:
profiles: [worker]
build:
context: .
dockerfile: Dockerfile.file-worker
args:
JAVA_VERSION: ${JAVA_VERSION:-25}
image: seb4u/commerceflow-file-worker:local
volumes:
- commerceflow-outbox:/app/data/outbox
docs:
profiles: [docs]
image: nginx:alpine
ports:
- '${DOCS_PORT:-8088}:80'
volumes:
- ./docs/workbook:/usr/share/nginx/html:ro
volumes:
commerceflow-outbox:
Datei: configs/application-local.yml
Quelle: configs/application-local.yml
server:
port: 8080
commerceflow:
outbox-dir: ./target/outbox
logging:
level:
com.seb4u.demo: DEBUG
Datei: configs/application-prod.yml
Quelle: configs/application-prod.yml
server:
port: 8080
commerceflow:
outbox-dir: ${COMMERCEFLOW_OUTBOX_DIR:/data/outbox}
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
probes:
enabled: true
logging:
level:
root: INFO
Datei: configs/logback-spring.xml
Quelle: configs/logback-spring.xml
<configuration>
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="commerceflow"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS} level=%level service=${appName} thread=%thread logger=%logger{36} msg="%msg"%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
Datei: configs/prometheus-rules.yaml
Quelle: configs/prometheus-rules.yaml
groups:
- name: commerceflow.rules
rules:
- alert: CommerceFlowHighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) > 0.02
for: 10m
labels:
severity: warning
annotations:
summary: "CommerceFlow error rate is high"
- alert: CommerceFlowSlowRequests
expr: histogram_quantile(0.95, rate(http_server_requests_seconds_bucket[5m])) > 0.5
for: 15m
labels:
severity: warning
annotations:
summary: "CommerceFlow P95 latency is high"
Datei: docs/api/commerceflow-openapi.yaml
Quelle: docs/api/commerceflow-openapi.yaml
openapi: 3.1.0
info:
title: CommerceFlow API
version: 1.0.0
description: |
Lern- und Portfolio-API für das seb4u Java Master Projekt.
Die API ist bewusst klein, aber mit professionellen Fehlerverträgen modelliert.
servers:
- url: http://localhost:8080
paths:
/actuator/health:
get:
summary: Healthcheck
responses:
'200':
description: Anwendung ist erreichbar
/orders:
post:
summary: Bestellung anlegen
operationId: placeOrder
tags: [Orders]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PlaceOrderRequest'
examples:
default:
value:
customerId: customer-100
currency: EUR
lines:
- sku: BOOK-JAVA
quantity: 1
unitPrice: '49.90'
responses:
'201':
description: Bestellung wurde angenommen
content:
application/json:
schema:
$ref: '#/components/schemas/PlaceOrderResponse'
'400':
description: Validierungsfehler
content:
application/json:
schema:
$ref: '#/components/schemas/Problem'
'409':
description: Konflikt, zum Beispiel doppelte Idempotency-Key-Verarbeitung
content:
application/json:
schema:
$ref: '#/components/schemas/Problem'
components:
schemas:
PlaceOrderRequest:
type: object
required: [customerId, currency, lines]
properties:
customerId:
type: string
minLength: 1
currency:
type: string
pattern: '^[A-Z]{3}$'
lines:
type: array
minItems: 1
items:
$ref: '#/components/schemas/OrderLineRequest'
OrderLineRequest:
type: object
required: [sku, quantity, unitPrice]
properties:
sku:
type: string
minLength: 1
quantity:
type: integer
minimum: 1
unitPrice:
type: string
pattern: '^[0-9]+(\\.[0-9]{2})$'
PlaceOrderResponse:
type: object
required: [orderId, status]
properties:
orderId:
type: string
status:
type: string
enum: [ACCEPTED, REJECTED]
Problem:
type: object
required: [type, title, status, detail]
properties:
type:
type: string
format: uri-reference
title:
type: string
status:
type: integer
detail:
type: string
correlationId:
type: string
Datei: docs/api/commerceflow-postman-collection.json
Quelle: docs/api/commerceflow-postman-collection.json
{
"info": {
"name": "SEB4U CommerceFlow",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "Health",
"request": { "method": "GET", "url": "http://localhost:8080/actuator/health" }
},
{
"name": "Place Order",
"request": {
"method": "POST",
"header": [
{ "key": "Content-Type", "value": "application/json" },
{ "key": "Idempotency-Key", "value": "demo-1" }
],
"url": "http://localhost:8080/orders",
"body": {
"mode": "raw",
"raw": "{\n \"customerId\": \"cust-100\",\n \"lines\": [{\"sku\": \"BOOK-1\", \"quantity\": 2, \"price\": \"19.90\", \"currency\": \"EUR\"}]\n}"
}
}
}
]
}
Datei: docs/api/commerceflow-requests.http
Quelle: docs/api/commerceflow-requests.http
### Health
GET http://localhost:8080/actuator/health
### Place order
POST http://localhost:8080/orders
Content-Type: application/json
Idempotency-Key: demo-{{$timestamp}}
{
"customerId": "cust-100",
"lines": [
{ "sku": "BOOK-1", "quantity": 2, "price": "19.90", "currency": "EUR" }
]
}
Datei: java-algorithms/pom.xml
Quelle: java-algorithms/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>java-algorithms</artifactId>
<name>seb4u java-algorithms</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Datei: java-concurrency/pom.xml
Quelle: java-concurrency/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>java-concurrency</artifactId>
<name>seb4u java-concurrency</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Datei: java-core/pom.xml
Quelle: java-core/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>java-core</artifactId>
<name>seb4u java-core</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Datei: java-io/pom.xml
Quelle: java-io/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>java-io</artifactId>
<name>seb4u java-io</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Datei: k8s/configmap.yaml
Quelle: k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: commerceflow-config
namespace: seb4u
data:
SPRING_PROFILES_ACTIVE: prod
COMMERCEFLOW_OUTBOX_DIR: /data/outbox
Datei: k8s/deployment.yaml
Quelle: k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: commerceflow-spring
namespace: seb4u
spec:
replicas: 2
selector:
matchLabels:
app: commerceflow-spring
template:
metadata:
labels:
app: commerceflow-spring
spec:
containers:
- name: app
image: commerceflow-spring:local
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: commerceflow-config
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 20
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "768Mi"
Datei: k8s/hpa.yaml
Quelle: k8s/hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: commerceflow-spring
namespace: seb4u
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: commerceflow-spring
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Datei: k8s/ingress.yaml
Quelle: k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: commerceflow
namespace: seb4u
spec:
rules:
- host: commerceflow.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: commerceflow-spring
port:
number: 80
Datei: k8s/kustomization.yaml
Quelle: k8s/kustomization.yaml
resources:
- namespace.yaml
- configmap.yaml
- deployment.yaml
- service.yaml
- ingress.yaml
- hpa.yaml
- pdb.yaml
- network-policy.yaml
Datei: k8s/namespace.yaml
Quelle: k8s/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: seb4u
Datei: k8s/network-policy.yaml
Quelle: k8s/network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: commerceflow-default
namespace: seb4u
spec:
podSelector:
matchLabels:
app: commerceflow-spring
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 8080
Datei: k8s/pdb.yaml
Quelle: k8s/pdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: commerceflow-spring
namespace: seb4u
spec:
minAvailable: 1
selector:
matchLabels:
app: commerceflow-spring
Datei: k8s/service.yaml
Quelle: k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
name: commerceflow-spring
namespace: seb4u
spec:
selector:
app: commerceflow-spring
ports:
- name: http
port: 80
targetPort: 8080
Datei: pom.xml
Quelle: pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>seb4u Java Master Parent</name>
<modules>
<module>java-core</module>
<module>java-io</module>
<module>java-concurrency</module>
<module>java-algorithms</module>
<module>security-labs</module>
<module>commerceflow-domain</module>
<module>commerceflow-application</module>
<module>commerceflow-adapter-file</module>
<module>commerceflow-adapter-spring</module>
<module>commerceflow-adapter-jakarta</module>
<module>commerceflow-tests</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>25</java.version>
<maven.compiler.release>${java.version}</maven.compiler.release>
<spring-boot.version>4.1.0</spring-boot.version>
<junit.version>6.1.1</junit.version>
<maven.compiler.plugin.version>3.15.0</maven.compiler.plugin.version>
<maven.surefire.plugin.version>3.5.4</maven.surefire.plugin.version>
<exec.maven.plugin.version>3.5.0</exec.maven.plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>${junit.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<release>${maven.compiler.release}</release>
<showWarnings>true</showWarnings>
<compilerArgs>
<arg>-Xlint:all</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.plugin.version}</version>
<configuration>
<useModulePath>false</useModulePath>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${exec.maven.plugin.version}</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Datei: scripts/ci-local.sh
Quelle: scripts/ci-local.sh
#!/usr/bin/env bash
set -euo pipefail
bash scripts/preflight.sh
mvn -q -DskipTests=false test
bash scripts/quality-gates.sh
bash scripts/release-dry-run.sh
Datei: scripts/dev-down.sh
Quelle: scripts/dev-down.sh
#!/usr/bin/env bash
set -euo pipefail
docker compose down -v --remove-orphans
Datei: scripts/dev-up.sh
Quelle: scripts/dev-up.sh
#!/usr/bin/env bash
set -euo pipefail
cp -n .env.example .env 2>/dev/null || true
docker compose --profile app up -d --build
bash scripts/smoke-test.sh "http://localhost:${APP_PORT:-8080}"
Datei: scripts/package-guard.sh
Quelle: scripts/package-guard.sh
#!/usr/bin/env bash
set -euo pipefail
bad=0
while IFS= read -r file; do
pkg=$(grep -E '^package ' "$file" | sed 's/package //;s/;//' || true)
case "$pkg" in
com.seb4u.demo|com.seb4u.demo.*|"") ;;
*) echo "Invalid package in $file: $pkg"; bad=1 ;;
esac
if grep -Eq 'package +(com\.example|com\.acme|shop|master)(\.|;)' "$file"; then
echo "Old demo package prefix found in $file"; bad=1
fi
if grep -Eq '^package +com\.seb4u\.demo\.(spring|jakarta)' "$file"; then
case "$file" in
*commerceflow-adapter-spring/src/main/java/com/seb4u/demo/spring/*|*commerceflow-adapter-jakarta/src/main/java/com/seb4u/demo/jakarta/*) ;;
*) echo "Framework package in unexpected module: $file"; bad=1 ;;
esac
fi
done < <(find . -type f -name '*.java' | sort)
if [[ "$bad" -ne 0 ]]; then
echo "Package guard failed."
exit 1
fi
echo "Package guard OK."
Datei: scripts/performance-smoke.sh
Quelle: scripts/performance-smoke.sh
#!/usr/bin/env bash
set -euo pipefail
base="${BASE_URL:-http://localhost:8080}"
requests="${REQUESTS:-25}"
start=$(date +%s)
for i in $(seq 1 "$requests"); do
curl -fsS "$base/actuator/health" >/dev/null
done
end=$(date +%s)
echo "Performance smoke OK: $requests health requests in $((end-start))s"
Datei: scripts/preflight.sh
Quelle: scripts/preflight.sh
#!/usr/bin/env bash
set -euo pipefail
command -v java >/dev/null || { echo "java fehlt"; exit 1; }
command -v mvn >/dev/null || { echo "maven fehlt"; exit 1; }
java -version
mvn -version
bash scripts/package-guard.sh
Datei: scripts/quality-gates.sh
Quelle: scripts/quality-gates.sh
#!/usr/bin/env bash
set -euo pipefail
echo "== seb4u quality gates =="
java -version
mvn -version
echo "1/5 package guard"
bash scripts/package-guard.sh
echo "2/5 compile"
mvn -B -ntp -DskipTests compile
echo "3/5 tests"
mvn -B -ntp test
echo "4/5 package"
mvn -B -ntp -DskipTests package
echo "5/5 smoke documentation check"
test -f docs/api/commerceflow-openapi.yaml
test -f docs/adr/ADR-0001-package-standard.md
test -f docs/devops/RELEASE_RUNBOOK.md
echo "Quality gates OK."
Datei: scripts/release-dry-run.sh
Quelle: scripts/release-dry-run.sh
#!/usr/bin/env bash
set -euo pipefail
VERSION="${1:-1.0.0-local}"
mkdir -p dist
mvn -B -ntp verify
git archive --format=zip --output "dist/seb4u-java-master-${VERSION}.zip" HEAD || \
zip -qr "dist/seb4u-java-master-${VERSION}.zip" . -x 'target/*' '.git/*' 'dist/*'
sha256sum "dist/seb4u-java-master-${VERSION}.zip" | tee "dist/seb4u-java-master-${VERSION}.sha256"
ls -lah dist
Datei: scripts/rollback-check.sh
Quelle: scripts/rollback-check.sh
#!/usr/bin/env bash
set -euo pipefail
[ -f docs/devops/ROLLBACK_STRATEGY.md ] || { echo "Rollback Strategie fehlt"; exit 1; }
[ -f docs/devops/RELEASE_NOTES_TEMPLATE.md ] || { echo "Release Notes Template fehlt"; exit 1; }
echo "Rollback Unterlagen vorhanden"
Datei: scripts/run-all-labs.sh
Quelle: scripts/run-all-labs.sh
#!/usr/bin/env bash
set -euo pipefail
mvn -pl java-core exec:java -Dexec.mainClass=com.seb4u.demo.core.CoreLabApp
mvn -pl java-io exec:java -Dexec.mainClass=com.seb4u.demo.io.IoLabApp
mvn -pl java-concurrency exec:java -Dexec.mainClass=com.seb4u.demo.concurrent.ConcurrencyLabApp
mvn -pl java-algorithms exec:java -Dexec.mainClass=com.seb4u.demo.algorithms.AlgorithmsLabApp
mvn -pl security-labs exec:java -Dexec.mainClass=com.seb4u.demo.security.SecurityLabApp
Datei: scripts/sbom-placeholder.sh
Quelle: scripts/sbom-placeholder.sh
#!/usr/bin/env bash
set -euo pipefail
mkdir -p target
cat > target/sbom-placeholder.json <<'JSON'
{
"name": "seb4u-java-master",
"note": "Placeholder: In echten Projekten CycloneDX oder ein vergleichbares SBOM-Tool einsetzen."
}
JSON
echo "SBOM Placeholder geschrieben: target/sbom-placeholder.json"
Datei: scripts/smoke-test.sh
Quelle: scripts/smoke-test.sh
#!/usr/bin/env bash
set -euo pipefail
BASE_URL="${1:-http://localhost:8080}"
echo "Smoke testing $BASE_URL"
for i in {1..30}; do
if curl -fsS "$BASE_URL/actuator/health" >/tmp/seb4u-health.json 2>/dev/null; then
cat /tmp/seb4u-health.json
break
fi
sleep 2
if [[ "$i" == "30" ]]; then
echo "Health endpoint not ready" >&2
exit 1
fi
done
curl -fsS -H 'Content-Type: application/json' \
-d '{"customerId":"customer-100","currency":"EUR","lines":[{"sku":"BOOK-JAVA","quantity":1,"unitPrice":"49.90"}]}' \
"$BASE_URL/orders" || true
echo "Smoke test finished."
Datei: scripts/spring-demo-request.http
Quelle: scripts/spring-demo-request.http
POST http://localhost:8080/api/orders
Content-Type: application/json
{
"customerId": "11111111-1111-1111-1111-111111111111",
"items": [
{ "sku": "BOOK-JAVA", "quantity": 2, "unitPrice": 39.90 },
{ "sku": "COURSE-JAVA", "quantity": 1, "unitPrice": 149.00 }
]
}
Datei: scripts/verify-openapi.sh
Quelle: scripts/verify-openapi.sh
#!/usr/bin/env bash
set -euo pipefail
file="docs/api/commerceflow-openapi.yaml"
[ -s "$file" ] || { echo "OpenAPI Datei fehlt: $file"; exit 1; }
grep -q "openapi:" "$file" || { echo "Keine OpenAPI Signatur"; exit 1; }
grep -q "/orders" "$file" || { echo "Pfad /orders fehlt"; exit 1; }
echo "OpenAPI Minimalcheck OK"
Datei: security-labs/pom.xml
Quelle: security-labs/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.seb4u.demo</groupId>
<artifactId>seb4u-java-master-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>security-labs</artifactId>
<name>seb4u security-labs</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Java-Quellen im Delivery-Paket
| Datei | Package |
|---|---|
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/AlwaysApprovedPaymentPort.java | com.seb4u.demo.commerceflow.adapter.file |
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/FileAdapterLabApp.java | com.seb4u.demo.commerceflow.adapter.file |
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/FileOutboxPort.java | com.seb4u.demo.commerceflow.adapter.file |
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/InMemoryOrderRepository.java | com.seb4u.demo.commerceflow.adapter.file |
commerceflow-adapter-jakarta/src/main/java/com/seb4u/demo/jakarta/commerceflow/CommerceFlowServlet.java | com.seb4u.demo.jakarta.commerceflow |
commerceflow-adapter-spring/src/main/java/com/seb4u/demo/spring/commerceflow/CommerceFlowConfiguration.java | com.seb4u.demo.spring.commerceflow |
commerceflow-adapter-spring/src/main/java/com/seb4u/demo/spring/commerceflow/CommerceFlowSpringApplication.java | com.seb4u.demo.spring.commerceflow |
commerceflow-adapter-spring/src/main/java/com/seb4u/demo/spring/commerceflow/OrderController.java | com.seb4u.demo.spring.commerceflow |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/commands/PlaceOrderCommand.java | com.seb4u.demo.commerceflow.application.commands |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/ports/OrderRepository.java | com.seb4u.demo.commerceflow.application.ports |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/ports/OutboxPort.java | com.seb4u.demo.commerceflow.application.ports |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/ports/PaymentPort.java | com.seb4u.demo.commerceflow.application.ports |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/usecases/PlaceOrderUseCase.java | com.seb4u.demo.commerceflow.application.usecases |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Ids.java | com.seb4u.demo.commerceflow.domain |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Money.java | com.seb4u.demo.commerceflow.domain |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Order.java | com.seb4u.demo.commerceflow.domain |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/OrderEvent.java | com.seb4u.demo.commerceflow.domain |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/OrderLine.java | com.seb4u.demo.commerceflow.domain |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/OrderStatus.java | com.seb4u.demo.commerceflow.domain |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Result.java | com.seb4u.demo.commerceflow.domain |
commerceflow-tests/src/test/java/com/seb4u/demo/commerceflow/tests/CommerceFlowAcceptanceTest.java | com.seb4u.demo.commerceflow.tests |
commerceflow-tests/src/test/java/com/seb4u/demo/commerceflow/tests/PackageStandardTest.java | com.seb4u.demo.commerceflow.tests |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/algorithms/DijkstraSolution.java | com.seb4u.demo.workbook.algorithms |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/architecture/PlaceOrderWorkflowSolution.java | com.seb4u.demo.workbook.architecture |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/cloud/IdempotencyStoreSolution.java | com.seb4u.demo.workbook.cloud |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/commerceflow/IdempotentOutboxSolution.java | com.seb4u.demo.workbook.commerceflow |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/core/Money.java | com.seb4u.demo.workbook.core |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/core/PackageGuardSolution.java | com.seb4u.demo.workbook.core |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/fullstack/PageResponse.java | com.seb4u.demo.workbook.fullstack |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/interview/ThreadSafeMemoizerSolution.java | com.seb4u.demo.workbook.interview |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/io/AtomicCsvImportSolution.java | com.seb4u.demo.workbook.io |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/portfolio/PortfolioReadmeTemplate.java | com.seb4u.demo.workbook.portfolio |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/AlgorithmsLabApp.java | com.seb4u.demo.algorithms |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/GraphAlgorithms.java | com.seb4u.demo.algorithms |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/LruCache.java | com.seb4u.demo.algorithms |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/SlidingWindow.java | com.seb4u.demo.algorithms |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/TopologicalSorter.java | com.seb4u.demo.algorithms |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/BackpressurePipeline.java | com.seb4u.demo.concurrent |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/BulkheadExecutor.java | com.seb4u.demo.concurrent |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/ConcurrencyLabApp.java | com.seb4u.demo.concurrent |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/RetryPolicy.java | com.seb4u.demo.concurrent |
java-core/src/main/java/com/seb4u/demo/core/CoreLabApp.java | com.seb4u.demo.core |
java-core/src/main/java/com/seb4u/demo/core/Money.java | com.seb4u.demo.core |
java-core/src/main/java/com/seb4u/demo/core/Result.java | com.seb4u.demo.core |
java-core/src/main/java/com/seb4u/demo/core/Validation.java | com.seb4u.demo.core |
java-core/src/test/java/com/seb4u/demo/core/MoneyTest.java | com.seb4u.demo.core |
java-io/src/main/java/com/seb4u/demo/io/AtomicFileWriter.java | com.seb4u.demo.io |
java-io/src/main/java/com/seb4u/demo/io/CsvLedgerImporter.java | com.seb4u.demo.io |
java-io/src/main/java/com/seb4u/demo/io/DebouncedDirectoryWatcher.java | com.seb4u.demo.io |
java-io/src/main/java/com/seb4u/demo/io/IoLabApp.java | com.seb4u.demo.io |
java-io/src/main/java/com/seb4u/demo/io/SafePath.java | com.seb4u.demo.io |
security-labs/src/main/java/com/seb4u/demo/security/HmacSigner.java | com.seb4u.demo.security |
security-labs/src/main/java/com/seb4u/demo/security/PasswordHasher.java | com.seb4u.demo.security |
security-labs/src/main/java/com/seb4u/demo/security/SecurityLabApp.java | com.seb4u.demo.security |
Vollständiger Delivery-Dateikatalog
| Datei | Bytes |
|---|---|
.devcontainer/devcontainer.json | 507 |
.devcontainer/devcontainer.json.html | 11886 |
.env.example | 83 |
.github/PULL_REQUEST_TEMPLATE.html | 11011 |
.github/PULL_REQUEST_TEMPLATE.md | 237 |
.github/dependabot.yml | 480 |
.github/dependabot.yml.html | 12956 |
.github/workflows/ci.yml | 1212 |
.github/workflows/ci.yml.html | 16851 |
.github/workflows/docker-smoke.yml | 865 |
.github/workflows/docker-smoke.yml.html | 14301 |
.github/workflows/docs-check.yml | 398 |
.github/workflows/docs-check.yml.html | 11273 |
.github/workflows/nightly-quality.yml | 367 |
.github/workflows/nightly-quality.yml.html | 12128 |
.github/workflows/release-dry-run.yml | 1358 |
.github/workflows/release-dry-run.yml.html | 16310 |
.github/workflows/security-check.yml | 413 |
.github/workflows/security-check.yml.html | 11520 |
.gitignore | 143 |
Dockerfile.file-worker | 551 |
Dockerfile.file-worker.html | 11697 |
Dockerfile.spring | 1542 |
Dockerfile.spring.html | 14711 |
Makefile | 1321 |
Makefile.html | 14861 |
README.html | 279311 |
README.md | 1387 |
SEB4U_PROJECT_EXPORT_CHECK.html | 11298 |
SEB4U_PROJECT_EXPORT_CHECK.json | 729 |
SEB4U_PROJECT_EXPORT_CHECK.md | 575 |
SEB4U_PROJECT_EXPORT_REPORT.html | 12622 |
SEB4U_PROJECT_EXPORT_REPORT.md | 1148 |
check.md | 760 |
commerceflow-adapter-file/README.html | 10775 |
commerceflow-adapter-file/README.md | 79 |
commerceflow-adapter-file/pom.xml | 929 |
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/AlwaysApprovedPaymentPort.java | 587 |
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/FileAdapterLabApp.java | 1049 |
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/FileOutboxPort.java | 1701 |
commerceflow-adapter-file/src/main/java/com/seb4u/demo/commerceflow/adapter/file/InMemoryOrderRepository.java | 691 |
commerceflow-adapter-jakarta/README.html | 10823 |
commerceflow-adapter-jakarta/README.md | 107 |
commerceflow-adapter-jakarta/pom.xml | 1143 |
commerceflow-adapter-jakarta/src/main/java/com/seb4u/demo/jakarta/commerceflow/CommerceFlowServlet.java | 2409 |
commerceflow-adapter-spring/README.html | 10819 |
commerceflow-adapter-spring/README.md | 106 |
commerceflow-adapter-spring/pom.xml | 1668 |
commerceflow-adapter-spring/src/main/java/com/seb4u/demo/spring/commerceflow/CommerceFlowConfiguration.java | 1439 |
commerceflow-adapter-spring/src/main/java/com/seb4u/demo/spring/commerceflow/CommerceFlowSpringApplication.java | 361 |
commerceflow-adapter-spring/src/main/java/com/seb4u/demo/spring/commerceflow/OrderController.java | 2443 |
commerceflow-adapter-spring/src/main/resources/application.properties | 153 |
commerceflow-application/README.html | 10771 |
commerceflow-application/README.md | 78 |
commerceflow-application/pom.xml | 831 |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/commands/PlaceOrderCommand.java | 415 |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/ports/OrderRepository.java | 300 |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/ports/OutboxPort.java | 178 |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/ports/PaymentPort.java | 302 |
commerceflow-application/src/main/java/com/seb4u/demo/commerceflow/application/usecases/PlaceOrderUseCase.java | 2867 |
commerceflow-domain/README.html | 10748 |
commerceflow-domain/README.md | 70 |
commerceflow-domain/pom.xml | 697 |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Ids.java | 770 |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Money.java | 1327 |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Order.java | 2164 |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/OrderEvent.java | 703 |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/OrderLine.java | 511 |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/OrderStatus.java | 104 |
commerceflow-domain/src/main/java/com/seb4u/demo/commerceflow/domain/Result.java | 1041 |
commerceflow-tests/README.html | 10753 |
commerceflow-tests/README.md | 78 |
commerceflow-tests/pom.xml | 1072 |
commerceflow-tests/src/test/java/com/seb4u/demo/commerceflow/tests/CommerceFlowAcceptanceTest.java | 1483 |
commerceflow-tests/src/test/java/com/seb4u/demo/commerceflow/tests/PackageStandardTest.java | 293 |
compose.yaml | 1100 |
compose.yaml.html | 15677 |
configs/application-local.yml | 109 |
configs/application-local.yml.html | 10257 |
configs/application-prod.yml | 280 |
configs/application-prod.yml.html | 11171 |
configs/logback-spring.xml | 458 |
configs/prometheus-rules.yaml | 573 |
configs/prometheus-rules.yaml.html | 12565 |
dateiliste.txt | 13696 |
docs/ARCHITECTURE.html | 11336 |
docs/ARCHITECTURE.md | 611 |
docs/PROJECT_TREE.html | 11004 |
docs/PROJECT_TREE.md | 444 |
docs/adr/ADR-0001-package-standard.html | 11383 |
docs/adr/ADR-0001-package-standard.md | 615 |
docs/adr/ADR-0002-hexagonal-commerceflow.html | 11390 |
docs/adr/ADR-0002-hexagonal-commerceflow.md | 599 |
docs/adr/ADR-0003-maven-multi-module.html | 11337 |
docs/adr/ADR-0003-maven-multi-module.md | 578 |
docs/adr/ADR-0004-docker-compose-local.html | 11350 |
docs/adr/ADR-0004-docker-compose-local.md | 565 |
docs/adr/ADR-0005-ci-quality-gates.html | 11277 |
docs/adr/ADR-0005-ci-quality-gates.md | 542 |
docs/adr/ADR-0006-openapi-contract.html | 11348 |
docs/adr/ADR-0006-openapi-contract.md | 588 |
docs/adr/README.html | 11356 |
docs/adr/README.md | 517 |
docs/api/commerceflow-openapi.yaml | 2839 |
docs/api/commerceflow-openapi.yaml.html | 24630 |
docs/api/commerceflow-postman-collection.json | 784 |
docs/api/commerceflow-postman-collection.json.html | 14039 |
docs/api/commerceflow-requests.http | 298 |
docs/api/commerceflow-requests.http.html | 10242 |
docs/architecture.svg | 2075 |
docs/devops/CHANGELOG_TEMPLATE.html | 10636 |
docs/devops/CHANGELOG_TEMPLATE.md | 147 |
docs/devops/CI_CD.html | 11769 |
docs/devops/CI_CD.md | 907 |
docs/devops/CODE_OWNERSHIP.html | 11253 |
docs/devops/CODE_OWNERSHIP.md | 526 |
docs/devops/DELIVERY_INTRO.html | 11885 |
docs/devops/DELIVERY_INTRO.md | 949 |
docs/devops/DELIVERY_MASTER_PLAN.html | 12494 |
docs/devops/DELIVERY_MASTER_PLAN.md | 1473 |
docs/devops/DELIVERY_OVERVIEW.html | 12218 |
docs/devops/DELIVERY_OVERVIEW.md | 1218 |
docs/devops/DOCKER.html | 11841 |
docs/devops/DOCKER.md | 709 |
docs/devops/ENVIRONMENT_STRATEGY.html | 11266 |
docs/devops/ENVIRONMENT_STRATEGY.md | 509 |
docs/devops/INCIDENT_RUNBOOK.html | 11694 |
docs/devops/INCIDENT_RUNBOOK.md | 868 |
docs/devops/LOCAL_DEVELOPMENT.html | 11842 |
docs/devops/LOCAL_DEVELOPMENT.md | 771 |
docs/devops/OBSERVABILITY.html | 12332 |
docs/devops/OBSERVABILITY.md | 786 |
docs/devops/OBSERVABILITY_DEEP_DIVE.html | 12490 |
docs/devops/OBSERVABILITY_DEEP_DIVE.md | 713 |
docs/devops/OPERATIONS_PLAYBOOK.html | 11474 |
docs/devops/OPERATIONS_PLAYBOOK.md | 665 |
docs/devops/PRODUCTION_READINESS_MATRIX.html | 11982 |
docs/devops/PRODUCTION_READINESS_MATRIX.md | 1002 |
docs/devops/QUALITY_GATES.html | 11853 |
docs/devops/QUALITY_GATES.md | 793 |
docs/devops/README.html | 11506 |
docs/devops/README.md | 746 |
docs/devops/RELEASE_NOTES_TEMPLATE.html | 10866 |
docs/devops/RELEASE_NOTES_TEMPLATE.md | 252 |
docs/devops/RELEASE_RUNBOOK.html | 11527 |
docs/devops/RELEASE_RUNBOOK.md | 739 |
docs/devops/ROLLBACK_STRATEGY.html | 11214 |
docs/devops/ROLLBACK_STRATEGY.md | 502 |
docs/devops/RUNBOOK_COMMERCEFLOW.html | 11584 |
docs/devops/RUNBOOK_COMMERCEFLOW.md | 527 |
docs/devops/SECURITY_DELIVERY_CHECKLIST.html | 11694 |
docs/devops/SECURITY_DELIVERY_CHECKLIST.md | 884 |
docs/devops/SERVICE_LEVELS.html | 11147 |
docs/devops/SERVICE_LEVELS.md | 511 |
docs/devops/SUPPLY_CHAIN_SECURITY.html | 10949 |
docs/devops/SUPPLY_CHAIN_SECURITY.md | 389 |
docs/devops/TEST_STRATEGY.html | 11775 |
docs/devops/TEST_STRATEGY.md | 953 |
docs/project/PORTFOLIO_GUIDE.html | 11525 |
docs/project/PORTFOLIO_GUIDE.md | 703 |
docs/project/REVIEW_RUBRIC.html | 11901 |
docs/project/REVIEW_RUBRIC.md | 658 |
docs/project/ROADMAP.html | 11316 |
docs/project/ROADMAP.md | 602 |
docs/project/TASK_BOARD.html | 11714 |
docs/project/TASK_BOARD.md | 655 |
docs/templates/adr-template.html | 10841 |
docs/templates/adr-template.md | 205 |
docs/templates/incident-template.html | 10775 |
docs/templates/incident-template.md | 143 |
docs/templates/release-checklist-template.html | 10883 |
docs/templates/release-checklist-template.md | 214 |
docs/workbook/seb4u_java_master_cheatsheets.html | 14451 |
docs/workbook/seb4u_java_master_cheatsheets.md | 3100 |
docs/workbook/seb4u_java_master_cheatsheets.pdf | 81363 |
docs/workbook/seb4u_java_master_workbook.html | 94007 |
docs/workbook/seb4u_java_master_workbook.md | 17036 |
docs/workbook/seb4u_java_master_workbook.pdf | 144479 |
docs/workbook/workbook-solutions/README.html | 11413 |
docs/workbook/workbook-solutions/README.md | 382 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/algorithms/DijkstraSolution.java | 1283 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/architecture/PlaceOrderWorkflowSolution.java | 1713 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/cloud/IdempotencyStoreSolution.java | 1005 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/commerceflow/IdempotentOutboxSolution.java | 725 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/core/Money.java | 1457 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/core/PackageGuardSolution.java | 1008 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/fullstack/PageResponse.java | 646 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/interview/ThreadSafeMemoizerSolution.java | 455 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/io/AtomicCsvImportSolution.java | 2270 |
docs/workbook/workbook-solutions/src/main/java/com/seb4u/demo/workbook/portfolio/PortfolioReadmeTemplate.java | 917 |
java-algorithms/README.html | 10741 |
java-algorithms/README.md | 75 |
java-algorithms/pom.xml | 689 |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/AlgorithmsLabApp.java | 652 |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/GraphAlgorithms.java | 2134 |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/LruCache.java | 540 |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/SlidingWindow.java | 621 |
java-algorithms/src/main/java/com/seb4u/demo/algorithms/TopologicalSorter.java | 1270 |
java-concurrency/README.html | 10759 |
java-concurrency/README.md | 90 |
java-concurrency/pom.xml | 691 |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/BackpressurePipeline.java | 1455 |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/BulkheadExecutor.java | 2018 |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/ConcurrencyLabApp.java | 853 |
java-concurrency/src/main/java/com/seb4u/demo/concurrent/RetryPolicy.java | 985 |
java-core/README.html | 10758 |
java-core/README.md | 110 |
java-core/pom.xml | 677 |
java-core/src/main/java/com/seb4u/demo/core/CoreLabApp.java | 622 |
java-core/src/main/java/com/seb4u/demo/core/Money.java | 1724 |
java-core/src/main/java/com/seb4u/demo/core/Result.java | 1493 |
java-core/src/main/java/com/seb4u/demo/core/Validation.java | 880 |
java-core/src/test/java/com/seb4u/demo/core/MoneyTest.java | 289 |
java-io/README.html | 10732 |
java-io/README.md | 90 |
java-io/pom.xml | 673 |
java-io/src/main/java/com/seb4u/demo/io/AtomicFileWriter.java | 930 |
java-io/src/main/java/com/seb4u/demo/io/CsvLedgerImporter.java | 1561 |
java-io/src/main/java/com/seb4u/demo/io/DebouncedDirectoryWatcher.java | 2826 |
java-io/src/main/java/com/seb4u/demo/io/IoLabApp.java | 640 |
java-io/src/main/java/com/seb4u/demo/io/SafePath.java | 671 |
k8s/README.html | 11141 |
k8s/README.md | 272 |
k8s/configmap.yaml | 165 |
k8s/configmap.yaml.html | 10526 |
k8s/deployment.yaml | 1062 |
k8s/deployment.yaml.html | 15255 |
k8s/hpa.yaml | 390 |
k8s/hpa.yaml.html | 12045 |
k8s/ingress.yaml | 356 |
k8s/ingress.yaml.html | 11665 |
k8s/kustomization.yaml | 153 |
k8s/kustomization.yaml.html | 10713 |
k8s/namespace.yaml | 55 |
k8s/namespace.yaml.html | 9949 |
k8s/network-policy.yaml | 322 |
k8s/network-policy.yaml.html | 11693 |
k8s/pdb.yaml | 189 |
k8s/pdb.yaml.html | 10666 |
k8s/service.yaml | 197 |
k8s/service.yaml.html | 11028 |
pom.xml | 3273 |
scripts/ci-local.sh | 156 |
scripts/ci-local.sh.html | 9936 |
scripts/dev-down.sh | 78 |
scripts/dev-down.sh.html | 9741 |
scripts/dev-up.sh | 189 |
scripts/dev-up.sh.html | 10324 |
scripts/package-guard.sh | 883 |
scripts/package-guard.sh.html | 14854 |
scripts/performance-smoke.sh | 301 |
scripts/performance-smoke.sh.html | 11486 |
scripts/preflight.sh | 217 |
scripts/preflight.sh.html | 10815 |
scripts/quality-gates.sh | 486 |
scripts/quality-gates.sh.html | 11200 |
scripts/release-dry-run.sh | 379 |
scripts/release-dry-run.sh.html | 11532 |
scripts/rollback-check.sh | 260 |
scripts/rollback-check.sh.html | 10928 |
scripts/run-all-labs.sh | 462 |
scripts/run-all-labs.sh.html | 10624 |
scripts/sbom-placeholder.sh | 304 |
scripts/sbom-placeholder.sh.html | 10298 |
scripts/smoke-test.sh | 590 |
scripts/smoke-test.sh.html | 12779 |
scripts/spring-demo-request.http | 275 |
scripts/spring-demo-request.http.html | 10139 |
scripts/verify-openapi.sh | 317 |
scripts/verify-openapi.sh.html | 11832 |
security-labs/README.html | 10744 |
security-labs/README.md | 84 |
security-labs/pom.xml | 685 |
security-labs/src/main/java/com/seb4u/demo/security/HmacSigner.java | 1085 |
security-labs/src/main/java/com/seb4u/demo/security/PasswordHasher.java | 2186 |
security-labs/src/main/java/com/seb4u/demo/security/SecurityLabApp.java | 701 |