# syntax=docker/dockerfile:1 # SwyxWeb als ein Container: Das React-Frontend wird gebaut, in die statischen # Ressourcen des Backends gelegt und zusammen mit ihm in ein Jar gepackt. # Ausgeliefert wird am Ende alles über den einen Port des Backends (8080). # # Der eingebaute SwyxTray-Mock (/ws und /api/mock/**) läuft NICHT mit: seine # Bohnen hängen am Spring-Profil "mock", und das setzt dieses Image nicht. # # Die beiden Build-Stufen laufen bewusst auf $BUILDPLATFORM, also nativ auf dem # bauenden Rechner: JS-Bundle und Jar sind architekturunabhängig. Nur die # Laufzeitstufe wird für die Zielarchitektur gezogen. Ein Build mit # --platform linux/amd64 auf einem ARM-Mac läuft dadurch ohne Emulation. # --------------------------------------------------------------------------- # 1. Frontend bauen (Vite -> frontend/dist) # --------------------------------------------------------------------------- FROM --platform=$BUILDPLATFORM node:22-alpine AS frontend WORKDIR /build # Erst die Abhängigkeiten, damit diese Schicht im Cache bleibt, solange sich # package.json/package-lock.json nicht ändern. COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ # VITE_WS_URL nur setzen, wenn die Adresse fest ins Bundle soll; im Normalfall # kommt sie zur Laufzeit aus /api/config (siehe README). ARG VITE_WS_URL RUN npm run build # --------------------------------------------------------------------------- # 2. Backend bauen (Spring Boot 4.1, Java 21) inkl. Frontend als static/ # --------------------------------------------------------------------------- FROM --platform=$BUILDPLATFORM maven:3.9-eclipse-temurin-21 AS backend WORKDIR /build # Abhängigkeiten vorab auflösen – eigene Schicht, unabhängig vom Quelltext. COPY backend/pom.xml ./ RUN --mount=type=cache,target=/root/.m2 \ mvn -B -q dependency:go-offline COPY backend/src ./src COPY --from=frontend /build/dist/ ./src/main/resources/static/ RUN --mount=type=cache,target=/root/.m2 \ mvn -B -DskipTests clean package \ && cp target/*.jar /build/app.jar # --------------------------------------------------------------------------- # 3. Laufzeit-Image # --------------------------------------------------------------------------- FROM eclipse-temurin:21-jre-alpine AS runtime # Nicht als root laufen. RUN addgroup -S swyx && adduser -S -G swyx swyx WORKDIR /app COPY --from=backend --chown=swyx:swyx /build/app.jar ./app.jar USER swyx EXPOSE 8080 # Adresse der SwyxTray-App zur Laufzeit überschreibbar (Spring Relaxed Binding): # -e APP_WEBSOCKET_HOST=192.168.180.135 -e APP_WEBSOCKET_PORT=17654 # -e APP_WEBSOCKET_PATH=/ws -e APP_WEBSOCKET_SECURE=false # # SPRING_PROFILES_ACTIVE bleibt bewusst leer – der SwyxTray-Mock bliebe sonst # beim Ausrollen erreichbar. Für eine Vorführung ohne Telefonanlage lässt er # sich einzeln einschalten: -e SPRING_PROFILES_ACTIVE=mock ENV JAVA_OPTS="-XX:MaxRAMPercentage=75.0" HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \ CMD wget -q -O /dev/null http://127.0.0.1:8080/api/config || exit 1 ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /app/app.jar"]