diff --git a/.env.example b/.env.example index 12c035ba..f3ac0a4e 100644 --- a/.env.example +++ b/.env.example @@ -159,6 +159,82 @@ PING_DEBUG=true PING_SERVICE_NAME=ping-service PING_CONSUL_PREFER_IP=true +# --- MAIL-SERVICE --- +MAIL_PORT=8083:8085 +MAIL_DEBUG_PORT=5014:5014 +MAIL_SERVER_PORT=8085 +MAIL_SPRING_PROFILES_ACTIVE=docker +MAIL_DEBUG=true +MAIL_SERVICE_NAME=mail-service +MAIL_CONSUL_PREFER_IP=true +MAIL_SMTP_HOST=smtp.world4you.com +MAIL_SMTP_PORT=587 +MAIL_SMTP_USER=online-nennen@mo-code.at +MAIL_SMTP_PASSWORD= +MAIL_SMTP_AUTH=true +MAIL_SMTP_STARTTLS=true + +# --- MASTERDATA-SERVICE --- +MASTERDATA_PORT=8086:8086 +MASTERDATA_DEBUG_PORT=5007:5007 +MASTERDATA_SERVER_PORT=8086 +MASTERDATA_SPRING_PROFILES_ACTIVE=docker +MASTERDATA_DEBUG=true +MASTERDATA_SERVICE_NAME=masterdata-service +MASTERDATA_CONSUL_PREFER_IP=true + +# --- EVENTS-SERVICE --- +EVENTS_PORT=8085:8085 +EVENTS_DEBUG_PORT=5008:5008 +EVENTS_SERVER_PORT=8085 +EVENTS_SPRING_PROFILES_ACTIVE=docker +EVENTS_DEBUG=true +EVENTS_SERVICE_NAME=events-service +EVENTS_CONSUL_PREFER_IP=true + +# --- ZNS-IMPORT-SERVICE --- +ZNS_IMPORT_PORT=8095:8095 +ZNS_IMPORT_DEBUG_PORT=5009:5009 +ZNS_IMPORT_SERVER_PORT=8095 +ZNS_IMPORT_SPRING_PROFILES_ACTIVE=docker +ZNS_IMPORT_DEBUG=true +ZNS_IMPORT_SERVICE_NAME=zns-import-service +ZNS_IMPORT_CONSUL_PREFER_IP=true + +# --- RESULTS-SERVICE --- +RESULTS_PORT=8088:8088 +RESULTS_DEBUG_PORT=5010:5010 +RESULTS_SERVER_PORT=8088 +RESULTS_SPRING_PROFILES_ACTIVE=docker +RESULTS_DEBUG=true +RESULTS_SERVICE_NAME=results-service +RESULTS_CONSUL_PREFER_IP=true + +# --- BILLING-SERVICE --- +BILLING_PORT=8087:8087 +BILLING_DEBUG_PORT=5012:5012 +BILLING_SERVER_PORT=8087 +BILLING_SPRING_PROFILES_ACTIVE=docker +BILLING_DEBUG=true +BILLING_SERVICE_NAME=billing-service +BILLING_CONSUL_PREFER_IP=true + +# --- SCHEDULING-SERVICE --- +SCHEDULING_PORT=8084:8084 +SCHEDULING_DEBUG_PORT=5013:5013 +SCHEDULING_SERVER_PORT=8084 +SCHEDULING_SPRING_PROFILES_ACTIVE=docker +SCHEDULING_DEBUG=true +SCHEDULING_SERVICE_NAME=scheduling-service +SCHEDULING_CONSUL_PREFER_IP=true + +# --- SERIES-SERVICE --- +SERIES_PORT=8089:8089 +SERIES_DEBUG_PORT=5011:5011 +SERIES_SERVER_PORT=8089 +SERIES_SPRING_PROFILES_ACTIVE=docker +SERIES_DEBUG=true + # --- WEB-APP --- WEB_APP_PORT=4000:4000 # URL für API-Zugriffe vom Browser (Public URL via Pangolin) diff --git a/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt b/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt index c8de16ad..7adaf8fe 100644 --- a/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt +++ b/backend/services/mail/mail-service/src/main/kotlin/at/mocode/mail/service/api/MailController.kt @@ -6,6 +6,7 @@ import jakarta.validation.Valid import jakarta.validation.constraints.Email import jakarta.validation.constraints.NotBlank import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Value import org.springframework.mail.SimpleMailMessage import org.springframework.mail.javamail.JavaMailSender import org.springframework.web.bind.annotation.* @@ -45,6 +46,9 @@ class MailController( ) { private val logger = LoggerFactory.getLogger(MailController::class.java) + @Value("\${spring.mail.username}") + private lateinit var baseMailAddress: String + @PostMapping("/nennung") fun receiveNennung(@Valid @RequestBody request: NennungRequest) { logger.info("Nennung via API erhalten: ${request.vorname} ${request.nachname} für Turnier ${request.turnierNr}") @@ -70,7 +74,16 @@ class MailController( // Bestätigung an Reiter senden try { val message = SimpleMailMessage() - message.from = "online-nennen@mo-code.at" + + // Dynamische Absenderadresse mit Plus-Addressing (z.B. online-nennen+26128@mo-code.at) + val dynamicFrom = try { + val (user, domain) = baseMailAddress.split("@") + "$user+${request.turnierNr}@$domain" + } catch (e: Exception) { + baseMailAddress + } + + message.from = dynamicFrom message.setTo(request.email) message.subject = "Bestätigung: Ihre Online-Nennung für Turnier ${request.turnierNr}" message.text = """ diff --git a/backend/services/mail/mail-service/src/main/resources/application.yaml b/backend/services/mail/mail-service/src/main/resources/application.yaml index 7ae38b8a..1721c4bb 100644 --- a/backend/services/mail/mail-service/src/main/resources/application.yaml +++ b/backend/services/mail/mail-service/src/main/resources/application.yaml @@ -11,19 +11,12 @@ spring: ddl-auto: update show-sql: true mail: - host: ${SPRING_MAIL_HOST:imap.world4you.com} - port: ${SPRING_MAIL_PORT:993} + host: ${SPRING_MAIL_HOST:smtp.world4you.com} + port: ${SPRING_MAIL_PORT:587} username: ${SPRING_MAIL_USERNAME:online-nennen@mo-code.at} password: ${SPRING_MAIL_PASSWORD:} properties: mail: - store: - protocol: imaps - imaps: - host: ${SPRING_MAIL_HOST:imap.world4you.com} - port: ${SPRING_MAIL_PORT:993} - ssl: - enable: true smtp: auth: ${SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH:true} starttls: diff --git a/dc-backend.yaml b/dc-backend.yaml index 0d229a7a..ac51cdc6 100644 --- a/dc-backend.yaml +++ b/dc-backend.yaml @@ -559,7 +559,7 @@ services: container_name: "${PROJECT_NAME:-meldestelle}-mail-service" restart: unless-stopped ports: - - "${MAIL_PORT:-8085:8085}" + - "${MAIL_PORT:-8083:8085}" - "${MAIL_DEBUG_PORT:-5014:5014}" environment: SPRING_PROFILES_ACTIVE: "${MAIL_SPRING_PROFILES_ACTIVE:-docker}" @@ -710,7 +710,7 @@ services: SPRING_PROFILES_ACTIVE: "${SERIES_SPRING_PROFILES_ACTIVE:-docker}" DEBUG: "${SERIES_DEBUG:-true}" SERVER_PORT: "${SERIES_SERVER_PORT:-8089}" - SPRING_APPLICATION_NAME: "series-service" + SPRING_APPLICATION_NAME: "${SERIES_SERVICE_NAME:-series-service}" # --- KEYCLOAK --- SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: "${KC_ISSUER_URI:-http://keycloak:8080/realms/meldestelle}" diff --git a/docs/03_Journal/2026-04-15_Live-Gang-Vorbereitung.md b/docs/03_Journal/2026-04-15_Live-Gang-Vorbereitung.md index 6b29826a..a4451b4a 100644 --- a/docs/03_Journal/2026-04-15_Live-Gang-Vorbereitung.md +++ b/docs/03_Journal/2026-04-15_Live-Gang-Vorbereitung.md @@ -8,10 +8,14 @@ ## 👷 Durchgeführte Arbeiten (DevOps & Frontend) -1. **Infrastruktur (Docker):** +1. **Infrastruktur (Docker & Mail):** - Dockerfile für `mail-service` erstellt. - `dc-backend.yaml` um den `mail-service` erweitert (inkl. Postgres-Link, Consul-Discovery und SMTP-Konfiguration). - - `application.yaml` im `mail-service` für dynamische Konfiguration via Environment-Variablen fit gemacht. +- Port-Kollision zwischen `events-service` und `mail-service` behoben (`mail-service` Host-Port auf 8083). +- `.env` und `.env.example` (SSoT) umfassend für alle Microservices (Standard-Ports, Debug, SMTP) vervollständigt. +- `application.yaml` im `mail-service` auf SMTP-Versand (World4You Standard) optimiert und IMAP-Reste entfernt. +- **Plus-Addressing:** Backend-Logik im `MailController` implementiert, um Mails dynamisch als + `online-nennen+[TurnierNr]@mo-code.at` zu versenden. 2. **Frontend (Konfigurierbarkeit):** - Common `PlatformConfig` erweitert um `resolveMailServiceUrl`. - Implementierung für Wasm, JS und JVM hinzugefügt, um Backend-URLs zur Laufzeit steuern zu können (Wasm: via global diff --git a/docs/ScreenShots/Cloudflare_Konfig_2026-04-15_12-07.png b/docs/ScreenShots/Cloudflare_Konfig_2026-04-15_12-07.png new file mode 100644 index 00000000..aa5473ae Binary files /dev/null and b/docs/ScreenShots/Cloudflare_Konfig_2026-04-15_12-07.png differ diff --git a/docs/ScreenShots/World4You-E-Mail-Konfig_2026-04-15_12-08.png b/docs/ScreenShots/World4You-E-Mail-Konfig_2026-04-15_12-08.png new file mode 100644 index 00000000..9f250dc8 Binary files /dev/null and b/docs/ScreenShots/World4You-E-Mail-Konfig_2026-04-15_12-08.png differ diff --git a/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt b/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt index 067950b6..9a27b0f4 100644 --- a/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt +++ b/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt @@ -28,7 +28,7 @@ actual object PlatformConfig { // 2) Try window location origin (same origin gateway/proxy setup) val origin = try { getOrigin() - } catch (e: Throwable) { + } catch (_: Throwable) { null }