feat(frontend): Struktur und Kommentare verfeinert, Mail-Service-Konfiguration erweitert
Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
# ===================================================================
|
||||
# Multi-stage Dockerfile for Meldestelle Mail Service
|
||||
# Features: Security hardening, monitoring support, optimal caching, BuildKit cache mounts
|
||||
# ===================================================================
|
||||
|
||||
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||
ARG GRADLE_VERSION=9.4.1
|
||||
ARG JAVA_VERSION=25
|
||||
ARG BUILD_DATE
|
||||
ARG VERSION=1.0.0-SNAPSHOT
|
||||
|
||||
# ===================================================================
|
||||
# Build Stage
|
||||
# ===================================================================
|
||||
FROM eclipse-temurin:${JAVA_VERSION}-jdk-alpine AS builder
|
||||
|
||||
ARG VERSION
|
||||
ARG BUILD_DATE
|
||||
|
||||
LABEL stage=builder \
|
||||
service="mail-service" \
|
||||
maintainer="Meldestelle Development Team"
|
||||
|
||||
WORKDIR /workspace
|
||||
|
||||
# Gradle optimizations
|
||||
ENV GRADLE_OPTS="-Dorg.gradle.caching=true \
|
||||
-Dorg.gradle.daemon=false \
|
||||
-Dorg.gradle.parallel=true \
|
||||
-Dorg.gradle.workers.max=2 \
|
||||
-Dorg.gradle.jvmargs=-Xmx2g \
|
||||
-XX:+UseParallelGC \
|
||||
-XX:MaxMetaspaceSize=512m"
|
||||
ENV GRADLE_USER_HOME=/root/.gradle
|
||||
|
||||
# 1. Copy full project structure for a reliable monorepo build
|
||||
COPY . .
|
||||
|
||||
RUN chmod +x gradlew
|
||||
|
||||
# 2. Build the service
|
||||
RUN --mount=type=cache,target=/root/.gradle/caches \
|
||||
--mount=type=cache,target=/root/.gradle/wrapper \
|
||||
./gradlew :backend:services:mail:mail-service:bootJar --no-daemon --info
|
||||
|
||||
# 3. Extract layers
|
||||
WORKDIR /builder
|
||||
RUN cp /workspace/backend/services/mail/mail-service/build/libs/*.jar app.jar && \
|
||||
java -Djarmode=layertools -jar app.jar extract
|
||||
|
||||
# ===================================================================
|
||||
# Runtime Stage
|
||||
# ===================================================================
|
||||
FROM eclipse-temurin:${JAVA_VERSION}-jre-alpine AS runtime
|
||||
|
||||
ARG BUILD_DATE
|
||||
ARG VERSION
|
||||
ARG JAVA_VERSION
|
||||
|
||||
LABEL service="mail-service" \
|
||||
version="${VERSION}" \
|
||||
description="Microservice for Mail and Online Entries" \
|
||||
maintainer="Meldestelle Development Team" \
|
||||
java.version="${JAVA_VERSION}" \
|
||||
build.date="${BUILD_DATE}"
|
||||
|
||||
ARG APP_USER=appuser
|
||||
ARG APP_GROUP=appgroup
|
||||
ARG APP_UID=1001
|
||||
ARG APP_GID=1001
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN apk update && \
|
||||
apk upgrade && \
|
||||
apk add --no-cache curl tzdata tini && \
|
||||
rm -rf /var/cache/apk/* && \
|
||||
addgroup -g ${APP_GID} -S ${APP_GROUP} && \
|
||||
adduser -u ${APP_UID} -S ${APP_USER} -G ${APP_GROUP} -h /app -s /bin/sh && \
|
||||
mkdir -p /app/logs /app/tmp /app/config && \
|
||||
chown -R ${APP_USER}:${APP_GROUP} /app && \
|
||||
chmod -R 750 /app
|
||||
|
||||
# Copy Spring Boot layers
|
||||
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /builder/dependencies/ ./
|
||||
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /builder/spring-boot-loader/ ./
|
||||
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /builder/snapshot-dependencies/ ./
|
||||
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /builder/application/ ./
|
||||
|
||||
USER ${APP_USER}
|
||||
|
||||
EXPOSE 8085 5005
|
||||
|
||||
HEALTHCHECK --interval=15s --timeout=3s --start-period=40s --retries=3 \
|
||||
CMD curl -fsS --max-time 2 http://localhost:8085/actuator/health/readiness || exit 1
|
||||
|
||||
ENV JAVA_OPTS="-XX:MaxRAMPercentage=75.0 \
|
||||
-XX:+UseG1GC \
|
||||
-XX:+UseStringDeduplication \
|
||||
-XX:+UseContainerSupport \
|
||||
-Djava.security.egd=file:/dev/./urandom \
|
||||
-Djava.awt.headless=true \
|
||||
-Dfile.encoding=UTF-8 \
|
||||
-Duser.timezone=Europe/Vienna \
|
||||
-Dmanagement.endpoints.web.exposure.include=health,info,metrics,prometheus"
|
||||
|
||||
ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
|
||||
SERVER_PORT=8085 \
|
||||
LOGGING_LEVEL_ROOT=INFO
|
||||
|
||||
ENTRYPOINT ["tini", "--", "sh", "-c", "\
|
||||
echo 'Starting Mail Service with Java ${JAVA_VERSION}...'; \
|
||||
if [ \"${DEBUG:-false}\" = \"true\" ]; then \
|
||||
echo 'DEBUG mode enabled'; \
|
||||
exec java ${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 org.springframework.boot.loader.launch.JarLauncher; \
|
||||
else \
|
||||
exec java ${JAVA_OPTS} org.springframework.boot.loader.launch.JarLauncher; \
|
||||
fi"]
|
||||
+14
-2
@@ -2,6 +2,9 @@ package at.mocode.mail.service.api
|
||||
|
||||
import at.mocode.mail.service.persistence.NennungEntity
|
||||
import at.mocode.mail.service.persistence.NennungRepository
|
||||
import jakarta.validation.Valid
|
||||
import jakarta.validation.constraints.Email
|
||||
import jakarta.validation.constraints.NotBlank
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.mail.SimpleMailMessage
|
||||
import org.springframework.mail.javamail.JavaMailSender
|
||||
@@ -11,14 +14,23 @@ import kotlin.uuid.Uuid
|
||||
|
||||
@OptIn(ExperimentalUuidApi::class)
|
||||
data class NennungRequest(
|
||||
@field:NotBlank(message = "Turniernummer ist erforderlich")
|
||||
val turnierNr: String,
|
||||
@field:NotBlank(message = "Vorname ist erforderlich")
|
||||
val vorname: String,
|
||||
@field:NotBlank(message = "Nachname ist erforderlich")
|
||||
val nachname: String,
|
||||
@field:NotBlank(message = "Lizenznummer ist erforderlich")
|
||||
val lizenz: String,
|
||||
@field:NotBlank(message = "Pferdename ist erforderlich")
|
||||
val pferdName: String,
|
||||
@field:NotBlank(message = "Pferdealter ist erforderlich")
|
||||
val pferdAlter: String,
|
||||
@field:Email(message = "Ungültiges Email-Format")
|
||||
@field:NotBlank(message = "Email ist erforderlich")
|
||||
val email: String,
|
||||
val telefon: String?,
|
||||
@field:NotBlank(message = "Bewerbe sind erforderlich")
|
||||
val bewerbe: String,
|
||||
val bemerkungen: String?
|
||||
)
|
||||
@@ -26,7 +38,7 @@ data class NennungRequest(
|
||||
@OptIn(ExperimentalUuidApi::class)
|
||||
@RestController
|
||||
@RequestMapping("/api/mail")
|
||||
@CrossOrigin(origins = ["*"]) // Für Wasm-Web-App (Compose HTML/Wasm)
|
||||
@CrossOrigin(origins = ["http://localhost:8080", "https://nennung.mo-code.at"]) // Für Wasm-Web-App (Compose HTML/Wasm)
|
||||
class MailController(
|
||||
private val nennungRepository: NennungRepository,
|
||||
private val mailSender: JavaMailSender
|
||||
@@ -34,7 +46,7 @@ class MailController(
|
||||
private val logger = LoggerFactory.getLogger(MailController::class.java)
|
||||
|
||||
@PostMapping("/nennung")
|
||||
fun receiveNennung(@RequestBody request: NennungRequest) {
|
||||
fun receiveNennung(@Valid @RequestBody request: NennungRequest) {
|
||||
logger.info("Nennung via API erhalten: ${request.vorname} ${request.nachname} für Turnier ${request.turnierNr}")
|
||||
|
||||
val entity = NennungEntity(
|
||||
|
||||
@@ -2,34 +2,32 @@ spring:
|
||||
application:
|
||||
name: mail-service
|
||||
datasource:
|
||||
url: jdbc:h2:mem:maildb;DB_CLOSE_DELAY=-1
|
||||
driver-class-name: org.h2.Driver
|
||||
username: sa
|
||||
password: ""
|
||||
h2:
|
||||
console:
|
||||
enabled: true
|
||||
path: /h2-console
|
||||
url: ${SPRING_DATASOURCE_URL:jdbc:h2:mem:maildb;DB_CLOSE_DELAY=-1}
|
||||
driver-class-name: ${SPRING_DATASOURCE_DRIVER_CLASS_NAME:org.h2.Driver}
|
||||
username: ${SPRING_DATASOURCE_USERNAME:sa}
|
||||
password: ${SPRING_DATASOURCE_PASSWORD:""}
|
||||
jpa:
|
||||
hibernate:
|
||||
ddl-auto: update
|
||||
show-sql: true
|
||||
mail:
|
||||
host: ${MAIL_HOST:imap.world4you.com}
|
||||
port: ${MAIL_PORT:993}
|
||||
username: ${MAIL_USERNAME:online-nennen@mo-code.at}
|
||||
password: ${MAIL_PASSWORD:}
|
||||
host: ${SPRING_MAIL_HOST:imap.world4you.com}
|
||||
port: ${SPRING_MAIL_PORT:993}
|
||||
username: ${SPRING_MAIL_USERNAME:online-nennen@mo-code.at}
|
||||
password: ${SPRING_MAIL_PASSWORD:}
|
||||
properties:
|
||||
mail:
|
||||
store:
|
||||
protocol: imaps
|
||||
imaps:
|
||||
host: ${MAIL_HOST:imap.world4you.com}
|
||||
port: ${MAIL_PORT:993}
|
||||
host: ${SPRING_MAIL_HOST:imap.world4you.com}
|
||||
port: ${SPRING_MAIL_PORT:993}
|
||||
ssl:
|
||||
enable: true
|
||||
smtp:
|
||||
auth: true
|
||||
auth: ${SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH:true}
|
||||
starttls:
|
||||
enable: true
|
||||
host-smtp: ${SMTP_HOST:smtp.world4you.com}
|
||||
port-smtp: ${SMTP_PORT:587}
|
||||
enable: ${SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE:true}
|
||||
|
||||
server:
|
||||
port: 8085
|
||||
|
||||
Reference in New Issue
Block a user