diff --git a/.gitignore b/.gitignore
index c381d9af..005d81b1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,3 +56,7 @@ desktop.ini
docs/temp/
docs/Bin/
docs/_archive/
+
+# Conveyor
+conveyor.rootkey
+output/
diff --git a/conveyor.conf b/conveyor.conf
index 97b9232b..f4ae9879 100644
--- a/conveyor.conf
+++ b/conveyor.conf
@@ -1,42 +1,31 @@
# =============================================================================
# Conveyor Configuration for Meldestelle Desktop App
# =============================================================================
-# Dieser Build-Weg ermöglicht das Cross-Packaging für Windows (MSI) auf Linux.
-# Dokumentation: https://conveyor.hydraulic.dev/
-# =============================================================================
+include required("/stdlib/jdk/21/openjdk.conf")
include required("https://raw.githubusercontent.com/hydraulic-software/conveyor/master/configs/jvm/extract-native-libraries.conf")
-# Basis-Import der Gradle-Konfiguration (sofern das Plugin genutzt wird,
-# aber wir definieren es hier explizit für maximale Kontrolle im CI/CD).
app {
- # Anzeige-Name und Vendor
display-name = "Meldestelle"
rdns-name = "at.mocode.meldestelle"
vendor = "mo-code.at"
contact-email = "support@mo-code.at"
-
- # Version aus version.properties (Conveyor kann HOCON-Variablen nutzen)
- # Für diesen Task hart codiert oder via CLI-Flag --variable übergeben.
version = "1.0.0"
-
- # Beschreibung
description = "ÖTO-konforme Turnier-Meldestelle – Desktop App"
- # Ziel-Plattformen
- # Wir konzentrieren uns auf Windows, können aber Linux/Mac später ergänzen.
- site.base-url = "localhost" # Später echte Update-URL
+ # Ziel-Plattformen: Windows und Linux (AMD/Intel 64-bit)
+ machines = [ windows.amd64, linux.amd64.glibc ]
- # Icons
- icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png"
+ site.base-url = "localhost"
+
+ # Wir geben nur den Ordner an, Conveyor findet die icon.png darin automatisch
+ icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources"
- # Einbetten der JRE (Temurin 21 wie in CI genutzt)
jvm {
gui {
main-class = "at.mocode.frontend.shell.desktop.MainKt"
}
- # JVM-Argumente (analog build.gradle.kts)
jvm-options = [
"-Xms128m",
"-Xmx512m",
@@ -45,19 +34,14 @@ app {
]
}
- # Input-Dateien: Hier ziehen wir die Uber-JAR oder die Gradle-Outputs.
- # Da wir plattformunabhängig bleiben wollen, nutzen wir das Gradle-Output-Dir.
- inputs += "frontend/shells/meldestelle-desktop/build/libs/meldestelle-desktop-jvm-*.jar"
+ # JARs aus dem Gradle-Build
+ inputs += "frontend/shells/meldestelle-desktop/build/libs/*.jar"
- # Windows-spezifische Einstellungen
windows {
- # Icon als .ico
- icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.ico"
- # GUID für Upgrades (muss stabil bleiben)
upgrade-uuid = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
- # Menü-Eintrag
menu-group = "Meldestelle"
- # Verknüpfung
desktop-shortcut = true
}
}
+
+conveyor.compatibility-level = 22
diff --git a/docs/02_Guides/Desktop-Packaging-Guide.md b/docs/02_Guides/Desktop-Packaging-Guide.md
new file mode 100644
index 00000000..05df4bc9
--- /dev/null
+++ b/docs/02_Guides/Desktop-Packaging-Guide.md
@@ -0,0 +1,98 @@
+# 📦 Guide: Desktop App Packaging (Linux, Windows, macOS)
+
+Dieses Dokument beschreibt, wie die Meldestelle Desktop App für verschiedene Betriebssysteme paketiert wird. Wir nutzen einen hybriden Ansatz aus **Gradle (Compose-Desktop)** für lokale Linux-Builds und **Conveyor** für das Cross-Packaging (Windows/macOS) von Linux aus.
+
+---
+
+## 1. Voraussetzungen
+
+### Linux (Entwicklungsrechner / Fedora)
+Um native Pakete bauen zu können, müssen folgende Werkzeuge auf dem System vorhanden sein:
+
+```bash
+# Für RPM-Pakete (Fedora)
+sudo dnf install rpm-build
+
+# Für DEB-Pakete (Ubuntu/Debian)
+sudo apt install dpkg-dev fakeroot
+```
+
+### Conveyor (Cross-Packaging Tool)
+Conveyor wird benötigt, um von Linux aus Windows-Installer (.msi) oder macOS-Pakete zu erzeugen.
+
+**Installation auf Fedora/Linux:**
+Da automatisierte Skripte manchmal unzuverlässig sind, hier der direkte Weg über das Binär-Paket:
+
+1. **Tarball herunterladen:**
+ Besuchen Sie [https://downloads.hydraulic.dev/conveyor/download.html](https://downloads.hydraulic.dev/conveyor/download.html) und laden Sie die neueste `linux-amd64.tar.gz` Datei herunter.
+
+2. **Manuelle Installation:**
+ ```bash
+ # Entpacken
+ tar -xvf hydraulic-conveyor-*-linux-amd64.tar.gz
+ # In den Pfad verschieben
+ sudo mv conveyor /usr/local/bin/
+ ```
+
+3. **Verifizieren:**
+ ```bash
+ conveyor --version
+ ```
+
+---
+
+## 2. Lokale Linux-Builds (Gradle)
+
+Die schnellste Methode, um während der Entwicklung ein installierbares Paket für das eigene System zu erstellen.
+
+### RPM-Paket (Fedora)
+```bash
+./gradlew :frontend:shells:meldestelle-desktop:packageRpm
+```
+*Ausgabe: `frontend/shells:meldestelle-desktop/build/compose/binaries/main/rpm/`*
+
+### DEB-Paket (Ubuntu/Debian)
+```bash
+./gradlew :frontend:shells:meldestelle-desktop:packageDeb
+```
+*Ausgabe: `frontend/shells:meldestelle-desktop/build/compose/binaries/main/deb/`*
+
+### Portable Version (Ohne Installation)
+```bash
+./gradlew :frontend:shells:meldestelle-desktop:createDistributable
+```
+*Ausgabe: `frontend/shells:meldestelle-desktop/build/compose/binaries/main/app/`*
+
+---
+
+## 3. Cross-Packaging mit Conveyor
+
+Conveyor nutzt die kompilierte JAR-Datei und schnürt daraus Pakete für alle Zielplattformen.
+
+### Schritt 1: JAR erstellen
+```bash
+./gradlew :frontend:shells:meldestelle-desktop:jvmJar
+```
+
+### Schritt 2: Pakete bauen
+```bash
+# Erstellt den Windows-Installer und die HTML-Downloadseite
+conveyor make site
+```
+
+### Schritt 3: Ergebnisse
+Die fertigen Installer (z.B. `.msi` für Windows) befinden sich im neu erstellten Ordner `output/`.
+
+---
+
+## 4. Problembehandlung & Optimierung
+
+### Native Access Warnungen
+Die App benötigt Zugriff auf native Bibliotheken (Netty/SQLite). Der notwendige Parameter `--enable-native-access=ALL-UNNAMED` ist bereits fest hinterlegt.
+
+### Firewall-Konfiguration
+Für Netzwerk-Tests (Discovery/Chat) müssen die Ports 8090, 8080 und 5353 (UDP) geöffnet sein.
+Nutzen Sie dafür das bereitgestellte Skript:
+```bash
+sudo ./setup-firewall-linux.sh
+```
diff --git a/docs/90_Reports/Network-POC-Testplan.md b/docs/90_Reports/Network-POC-Testplan.md
new file mode 100644
index 00000000..4dad2248
--- /dev/null
+++ b/docs/90_Reports/Network-POC-Testplan.md
@@ -0,0 +1,47 @@
+# 🧪 Testplan: Real-World Netzwerk-POC (Chat)
+
+Ziel dieses Tests ist die Verifizierung der stabilen Kommunikation zwischen verschiedenen Geräten (Master & Client) im lokalen Netzwerk (LAN/WLAN) inklusive automatischer Dienst-Erkennung (mDNS).
+
+---
+
+## Vorbereitung (USB-Stick)
+
+Folgende Dateien sollten auf dem Test-USB-Stick vorhanden sein:
+1. **Installer:** Das .rpm oder .deb Paket der App (oder der distributable Ordner).
+2. **Windows-Installer:** Die .msi Datei (via Conveyor).
+3. **Setup-Skript:** setup-firewall-linux.sh.
+
+---
+
+## Durchführung
+
+### 1. Master-Gerät einrichten (Zentrale)
+1. App auf dem Haupt-PC installieren und starten.
+2. In der **Geräte-Initialisierung**:
+ * Rolle: **MASTER** wählen.
+ * Gerätename vergeben (z.B. "Meldestelle-Master").
+ * Sicherheitsschlüssel (Sync-Key) festlegen (z.B. "geheim123").
+3. Auf **Finalisieren** klicken.
+4. Der Master zeigt nun seine IP-Adresse an und wartet auf Clients.
+
+### 2. Client-Geräte einrichten (Richter/PC)
+1. App auf weiteren Geräten (Linux/Windows) starten.
+2. In der **Geräte-Initialisierung**:
+ * Rolle: **CLIENT** wählen.
+ * **Shared Key** eingeben (muss exakt wie beim Master sein).
+3. Warten, bis der Master in der Liste erscheint (mDNS Discovery).
+4. Master auswählen und auf **Jetzt verbinden** klicken.
+
+### 3. Verbindungs-Check & Chat
+1. Sobald der Status auf "Verbunden" steht, den Button **"Verbindung testen (Chat & Self-Test)"** klicken.
+2. Im Chat-Modal eine Nachricht schreiben.
+3. Prüfen, ob die Nachricht auf allen verbundenen Geräten erscheint.
+4. Den automatischen "Ping-Pong" Self-Test beobachten.
+
+---
+
+## Erfolgskriterien
+* [ ] Master wird innerhalb von 10 Sekunden automatisch in der Client-Liste gefunden.
+* [ ] Nachrichten werden nahezu verzögerungsfrei (< 500ms) übertragen.
+* [ ] Der Status wechselt zuverlässig auf "CONNECTED".
+* [ ] Keine FocusRelatedWarning mehr in der Konsole/Log.
diff --git a/frontend/shells/meldestelle-desktop/build.gradle.kts b/frontend/shells/meldestelle-desktop/build.gradle.kts
index f103a495..44e38057 100644
--- a/frontend/shells/meldestelle-desktop/build.gradle.kts
+++ b/frontend/shells/meldestelle-desktop/build.gradle.kts
@@ -1,21 +1,6 @@
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import java.util.*
-/**
- * Shell-Modul: Meldestelle Desktop App
- * Reines JVM/Compose-Desktop-Modul – Desktop-First gemäß MASTER_ROADMAP.
- * Setzt alle Core- und Feature-Module zu einer lauffähigen Desktop-Anwendung zusammen.
- *
- * Packaging:
- * ./gradlew :frontend:shells:meldestelle-desktop:packageDeb → Linux .deb
- * ./gradlew :frontend:shells:meldestelle-desktop:packageMsi → Windows .msi
- * ./gradlew :frontend:shells:meldestelle-desktop:packageDmg → macOS .dmg
- * ./gradlew :frontend:shells:meldestelle-desktop:packageReleaseDistributables → alle Plattformen
- *
- * Version: Wird automatisch aus version.properties im Root-Projekt gelesen (SemVer).
- * Icons: src/jvmMain/resources/icon.png / icon.ico / icon.icns
- * → siehe ICONS_PLACEHOLDER.md für Anforderungen
- */
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.composeCompiler)
@@ -26,16 +11,12 @@ plugins {
group = "at.mocode.frontend.shell"
version = "1.0.0"
-// ---------------------------------------------------------------
-// Version aus root version.properties lesen (SemVer)
-// ---------------------------------------------------------------
val versionProps = Properties().also { props ->
rootProject.file("version.properties").inputStream().use { props.load(it) }
}
val vMajor: String? = versionProps.getProperty("VERSION_MAJOR", "1")
val vMinor: String? = versionProps.getProperty("VERSION_MINOR", "0")
val vPatch: String? = versionProps.getProperty("VERSION_PATCH", "0")
-// nativeDistributions erwartet reines "MAJOR.MINOR.PATCH" (kein Qualifier)
val packageVer = "$vMajor.$vMinor.$vPatch"
kotlin {
@@ -43,7 +24,6 @@ kotlin {
sourceSets {
jvmMain.dependencies {
- // Core-Module
implementation(projects.frontend.core.domain)
implementation(projects.core.coreDomain)
implementation(projects.frontend.core.designSystem)
@@ -54,10 +34,8 @@ kotlin {
implementation(projects.frontend.core.auth)
implementation(projects.core.znsParser)
- // Feature-Module
implementation(projects.frontend.features.pingFeature)
implementation(projects.frontend.features.nennungFeature)
-
implementation(projects.frontend.features.znsImportFeature)
implementation(projects.frontend.features.veranstalterFeature)
implementation(projects.frontend.features.veranstaltungFeature)
@@ -70,7 +48,6 @@ kotlin {
implementation(projects.frontend.features.billingFeature)
implementation(projects.frontend.features.deviceInitialization)
- // Compose Desktop
implementation(compose.desktop.currentOs)
implementation(compose.runtime)
implementation(compose.foundation)
@@ -80,15 +57,10 @@ kotlin {
implementation(compose.uiTooling)
implementation(libs.composeHotReloadApi)
- // DI (Koin)
implementation(libs.koin.core)
implementation(libs.koin.compose)
implementation(libs.koin.compose.viewmodel)
-
- // Coroutines
implementation(libs.kotlinx.coroutines.swing)
-
- // Bundles
implementation(libs.bundles.kmp.common)
implementation(libs.bundles.compose.common)
implementation(libs.logback.classic)
@@ -105,12 +77,8 @@ compose.desktop {
mainClass = "at.mocode.frontend.shell.desktop.MainKt"
nativeDistributions {
- // Ziel-Formate: Linux .deb, Windows .msi, macOS .dmg
- targetFormats(TargetFormat.Deb, TargetFormat.Msi, TargetFormat.Dmg)
+ targetFormats(TargetFormat.Deb, TargetFormat.Rpm, TargetFormat.Msi, TargetFormat.Dmg)
- // -------------------------------------------------------
- // Gemeinsame App-Metadaten
- // -------------------------------------------------------
packageName = "meldestelle"
packageVersion = packageVer
description = "ÖTO-konforme Turnier-Meldestelle – Desktop App"
@@ -118,53 +86,30 @@ compose.desktop {
copyright = "© 2024–2026 mo-code.at. Alle Rechte vorbehalten."
licenseFile.set(rootProject.file("LICENSE"))
- // -------------------------------------------------------
- // Linux (.deb)
- // -------------------------------------------------------
linux {
- // PNG 512×512 px — siehe src/jvmMain/resources/ICONS_PLACEHOLDER.md
iconFile.set(project.file("src/jvmMain/resources/icon.png"))
packageName = "meldestelle"
- // Debian-Kategorie
appCategory = "misc"
- // Menü-Eintrag
menuGroup = "Meldestelle"
shortcut = true
debMaintainer = "support@mo-code.at"
}
- // -------------------------------------------------------
- // Windows (.msi)
- // -------------------------------------------------------
windows {
- // ICO Multi-Size — siehe src/jvmMain/resources/ICONS_PLACEHOLDER.md
iconFile.set(project.file("src/jvmMain/resources/icon.ico"))
- // Eindeutige GUID für Windows Installer Upgrade-Erkennung
- // WICHTIG: Diese UUID darf sich NIE ändern!
upgradeUuid = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
menuGroup = "Meldestelle"
- // Startmenü-Verknüpfung
shortcut = true
- // Desktop-Verknüpfung
dirChooser = true
perUserInstall = false
}
- // -------------------------------------------------------
- // macOS (.dmg)
- // -------------------------------------------------------
macOS {
- // ICNS 1024×1024 px — siehe src/jvmMain/resources/ICONS_PLACEHOLDER.md
iconFile.set(project.file("src/jvmMain/resources/icon.icns"))
bundleID = "at.mocode.meldestelle"
appCategory = "public.app-category.productivity"
- // Für notarisierten Release: signing-Konfiguration hier ergänzen
- // signing { sign.set(true); identity.set("Developer ID Application: ...") }
}
- // -------------------------------------------------------
- // JVM-Laufzeit-Konfiguration (eingebettetes JRE)
- // -------------------------------------------------------
modules(
"java.base",
"java.desktop",
@@ -177,7 +122,6 @@ compose.desktop {
)
}
- // JVM-Argumente für die gepackte Anwendung
jvmArgs(
"--enable-native-access=ALL-UNNAMED",
"-Xms128m",
diff --git a/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png b/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png
index fc232d66..d2a261e5 100644
Binary files a/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png and b/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..477d939c
--- /dev/null
+++ b/index.html
@@ -0,0 +1,850 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+CHANGELOG.md - Realease notes & Feedback Management Tool
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Effortlessly collect feedback
+
+
+
+
Create better products driven by customer feedback
+
Simplify feedback collection, lighten support tasks, and share product updates—all in one powerful tool.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Features
+
+
+
+
All-in-One Platform for Customer Feedback
+
Centralize your feedback, prioritize your next steps, and keep everyone informed.
+
+
+
+
+
+
+
+
+
+
+ Analyze feedback
+
+
+
+ Build roadmap
+
+
+
+ Prioritize requests
+
+
+
+ Share updates
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Powerful SaaS solutions.
+
+
Feedback Management
+
Don’t let valuable ideas fall through the cracks. Use a single tool to collect, analyze, and organize feedback and feature requests efficiently.
+
+ - Capture customer input seamlessly from conversations with Autopilot.
+ - Detect and merge duplicate requests to better quantify user needs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Define Your Product Vision.
+
+
Build your roadmap
+
Keep users and stakeholders informed about current projects and upcoming plans.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Management & prioritization
+
+
Prioritize feature requests
+
Create a prioritization formula to score feedback and feature requests, ensuring you focus on the most impactful features.
+
+ - Adjust impact and effort factors to fit your needs.
+ - Include business-specific post fields for greater flexibility.
+ - Prioritize features based on user demand.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Share updates
+
Create a changelog that keeps everyone informed and engaged.
+
+ - Publish Detailed Release Notes.
+ - Notify users who voted on specific feature requests.
+ - Drive customer retention, engagement and feature adoption.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Capture feedback
+
+
+
+
Easy to set up and use
+
Simplify feedback collection, lighten support workloads, and announce product updates—all with a single tool.
+
+
+
+
+
+
+
+
+
Feedback Board
+
Gather, analyze, and organize feedback in a centralized location
+
+
+
+
+
+
+
+
+
+
+
+
Product Roadmap
+
Create public/private roadmaps to keep everyone updated on your progress
+
+
+
+
+
+
+
+
+
+
+
+
Changelog
+
Increase transparency with detailed change logs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Feature Request
+
Organize feature requests to identify the most in-demand improvements.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Customer Satisfaction
+
Collect ongoing feedback to track and improve customer satisfaction over time.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Analyze feedback
+
+ Uncover valuable customer insights to make better product decisions.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Bug Reporting
+
Receive instant notifications when users report bugs, keeping you ahead of critical issues.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Uptime monitoring service
+
Create beautiful status pages & incident management reports and keep your visitors updated.(Soon)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Join Our Newsletter
+
Subscribe Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Help Center
+
+
+
+
Frequently Asked Questions
+
+
+
+
+
+
+
+
+
+
+
+
+
CHANGELOG.md is a SaaS platform designed to help you collect, analyze, and act on customer feedback to uncover valuable insights and make informed product decisions.
+
+
+
+
+
+
Absolutely! With our prioritization tools, you can score feedback and feature requests based on factors like impact and effort, helping you focus on what matters most.
+
+
+
+
+
+
CHANGELOG.md allows you to build a clear and actionable roadmap by organizing feedback and aligning it with your product vision.
+
+
+
+
+
+
Yes! CHANGELOG.md includes a changelog feature where you can publish detailed release notes, link them to specific feature requests, and notify users who requested those features automatically.
+
+
+
+
+
+
Yes, CHANGELOG.md integrates with popular customer support and project management tools, allowing your team to seamlessly capture and manage feedback within their existing workflows.
+
+
+
+
+
+
Product managers, customer success teams, and anyone involved in building and improving products can benefit from CHANGELOG.md. It’s perfect for startups, SaaS companies, and organizations looking to make data-driven product decisions.
+
+
+
+
+
+
Getting started is simple! Sign up for a free trial, set up your feedback portal, and start collecting insights to drive your product decisions.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ More features. More power.
+
+
+
+
We bring companies and customers even closer
+
Ready to start building the right things?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copyright © 2026 Changelog.md. All Rights Reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/setup-firewall-linux.sh b/setup-firewall-linux.sh
new file mode 100755
index 00000000..8026f155
--- /dev/null
+++ b/setup-firewall-linux.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+echo "==========================================="
+echo "Meldestelle - Netzwerk-Setup für POC"
+echo "==========================================="
+
+if [ "$EUID" -ne 0 ]; then
+ echo "Bitte mit sudo ausführen: sudo ./setup-firewall-linux.sh"
+ exit
+fi
+
+# Erkennung der Firewall (firewalld für Fedora/KDE, ufw für Ubuntu)
+if command -v firewall-cmd &> /dev/null; then
+ echo "[Fedora/firewalld] Öffne Ports 8090 (TCP), 8080 (TCP) und 5353 (UDP)..."
+ firewall-cmd --permanent --add-port=8090/tcp
+ firewall-cmd --permanent --add-port=8080/tcp
+ firewall-cmd --permanent --add-service=mdns
+ firewall-cmd --reload
+ echo "Fertig!"
+elif command -v ufw &> /dev/null; then
+ echo "[Ubuntu/ufw] Öffne Ports 8090 (TCP), 8080 (TCP) und 5353 (UDP)..."
+ ufw allow 8090/tcp
+ ufw allow 8080/tcp
+ ufw allow 5353/udp
+ echo "Fertig!"
+else
+ echo "Keine bekannte Firewall (ufw/firewalld) gefunden. Bitte Ports manuell prüfen."
+fi
+
+echo "Das System ist nun bereit für den Meldestelle-POC."