# 🐧 [DevOps Engineer] — Zwischenstand & Roadmap > **Stand:** 3. April 2026 > **Rolle:** Docker, CI/CD, Gradle, Security, Desktop-Packaging, Infrastruktur --- ## ✅ Erledigte Sprints ### Sprint A — Abgeschlossen - [x] **A-1** | Docker-Compose-Setup auf aktuellen Stand gebracht - [x] Alle Services in `docker-compose.yaml` / `dc-*.yaml` geprüft - [x] Lokale Entwicklungsumgebung startet mit einem einzigen Befehl - [x] Healthchecks für alle Services definiert ### Sprint B — Abgeschlossen - [x] **B-1** | CI/CD Pipeline für Compose Desktop Tests (headless) - [x] Gitea Actions Workflow: `.gitea/workflows/desktop-tests.yml` - [x] Headless-Umgebung: `xvfb-run` (1920×1080×24) für Compose Desktop Tests - [x] Gradle-Task: `:frontend:shells:meldestelle-desktop:jvmTest` - [x] Build-Artefakte gespeichert (JARs, Compose-Distributables) - [x] **B-2** | Gradle-Build-Optimierungen - [x] Build-Cache aktiv: `org.gradle.caching=true` - [x] Parallele Builds aktiv: `org.gradle.parallel=true` - [x] Headless-Flag: `-Djava.awt.headless=true` - [x] Gradle Wrapper auf `9.4.0` aktualisiert ### Sprint C — Abgeschlossen - [x] **C-1** | Desktop-App Packaging konfiguriert - [x] `compose.desktop.nativeDistributions` vollständig in `build.gradle.kts` konfiguriert - [x] Linux: `.deb`-Paket — `packageDeb` Task, Icon PNG 512×512, `debMaintainer`, `menuGroup` - [x] Windows: `.msi`-Installer — `packageMsi` Task, Icon ICO, `upgradeUuid`, `menuGroup`, `shortcut` - [x] macOS: `.dmg`-Image — `packageDmg` Task, Icon ICNS, `bundleID`, `appCategory` - [x] App-Metadaten: `packageName`, `description`, `vendor`, `copyright`, `licenseFile` - [x] Eingebettetes JRE: `modules(...)` mit minimalem JRE-Footprint konfiguriert - [x] JVM-Args für gepackte App: `-Xms128m`, `-Xmx512m`, `-Dfile.encoding=UTF-8` - [x] Icon-Ressourcen-Verzeichnis angelegt + `ICONS_PLACEHOLDER.md` mit Anforderungen - [ ] ⚠️ **Offen:** Echte Icon-Dateien (`icon.png`, `icon.ico`, `icon.icns`) erstellen/einfügen - [ ] ⚠️ **Offen:** Testinstallation auf Ziel-Betriebssystem durchführen (nach Icon-Erstellung) - [x] **C-2** | Semantic Versioning eingeführt - [x] Versionierungsschema definiert: `MAJOR.MINOR.PATCH[-QUALIFIER]` - [x] Zentrale Versionsquelle: `version.properties` im Root-Projekt (Single Source of Truth) - [x] Root `build.gradle.kts`: Version wird aus `version.properties` gelesen (kein Hardcode mehr) - [x] Desktop `build.gradle.kts`: `packageVersion` aus `version.properties` (reines `MAJOR.MINOR.PATCH`) - [x] Git-Tagging-Strategie definiert: `vMAJOR.MINOR.PATCH` (z. B. `v1.0.0`) - [x] Release-Workflow angelegt: `.gitea/workflows/release.yml` - Trigger: Änderung an `version.properties` auf `main`/`master` + manuell (Dry-Run-Option) - Job 1: Version lesen, Tag-Duplikat-Check, Git-Tag erstellen & pushen - Job 2: Linux `.deb` bauen & als Artefakt hochladen - Job 3: Windows `.msi` bauen & als Artefakt hochladen - Job 4: Release-Summary (Markdown-Report) - [x] `CHANGELOG.md` angelegt (Keep-a-Changelog-Format, SemVer) --- ## 🔴 Sprint C — Restpunkte - [ ] **C-3** | Produktions-Deployment vorbereiten - [ ] Reverse-Proxy-Konfiguration (Nginx / Traefik) für Backend prüfen - [ ] HTTPS-Zertifikat-Management dokumentieren - [ ] Backup-Strategie für Produktionsdatenbanken definieren --- ## 🟠 Sprint D — Priorität 2 (nächste Woche) - [ ] **D-1** | Multi-Tenant Datenbankinfrastruktur absichern - [ ] Sicherstellen: Pro-Tenant-Schema in Postgres korrekt isoliert - [ ] Monitoring: Tenant-Schemas in Grafana-Dashboard sichtbar - [ ] Backup: Pro-Tenant-Backup-Strategie definieren - [ ] **D-2** | mDNS / LAN-Discovery Infrastruktur (nach ADR-0022) - [ ] mDNS-Dienst (Avahi o. ä.) in Docker-Compose für lokale Entwicklung bereitstellen - [ ] WebSocket-Endpunkt in Nginx/Traefik-Konfiguration durchreichen > ⏸️ **Pangolin / externer Zugriff** — Nur für Remote-Support-Szenarien; kein MVP-Blocker --- ## 📌 Abhängigkeiten | Warte auf | Von wem | Betrifft | |-----------------------------|-------------------|---------------------| | ADR-0022 LAN-Sync | 🏗️ Architect B-1 | D-2 mDNS-Infra | | QA: Test-Integration in CI | 🧐 QA C-4 | C-1 Packaging-Tests | | Icon-Dateien (PNG/ICO/ICNS) | 🖌️ UI/UX | C-1 Release-Build | --- ## 💡 Empfehlungen (nach Priorität) 1. **Icons erstellen** — Vor dem ersten echten Release-Build müssen `icon.png`, `icon.ico` und `icon.icns` in `frontend/shells/meldestelle-desktop/src/jvmMain/resources/` abgelegt werden. Siehe `ICONS_PLACEHOLDER.md` für Anforderungen und ImageMagick-Schnell-Befehle. 2. **Testinstallation** — Nach Icon-Erstellung: `.deb` auf Ubuntu/Debian, `.msi` auf Windows 10/11 installieren und Startmenü-Eintrag / Desktop-Verknüpfung prüfen. 3. **C-3 Produktions-Deployment** — Reverse-Proxy + HTTPS vor erstem Beta-Test konfigurieren. 4. **D-1 Tenant-Backup** — Wenn eine Veranstaltung = eine Datenbank, muss jeder Tenant einzeln gesichert werden können. --- ## 🗂️ Geänderte Dateien (diese Session) | Datei | Änderung | |----------------------------------------------------------------------------------|------------------------------------------------------------------------| | `version.properties` | **NEU** — Zentrale SemVer-Quelle (`1.0.0-SNAPSHOT`) | | `build.gradle.kts` (root) | Version aus `version.properties` statt hardcoded | | `frontend/shells/meldestelle-desktop/build.gradle.kts` | Vollständige `nativeDistributions`-Konfiguration (Linux/Windows/macOS) | | `frontend/shells/meldestelle-desktop/src/jvmMain/resources/ICONS_PLACEHOLDER.md` | **NEU** — Icon-Anforderungen dokumentiert | | `.gitea/workflows/release.yml` | **NEU** — Release-Workflow (Tag + Packaging) | | `CHANGELOG.md` | **NEU** — Keep-a-Changelog-Format |