Die feste Adresse 192.168.180.135 der SwyxTray-App wird überall durch 127.0.0.1 ersetzt: Die App läuft auf dem Arbeitsplatz des Anwenders, die Verbindung bleibt damit auf dem Rechner und braucht keine Firewall-Freigabe. Scheitert der Verbindungsaufbau, weil eine über HTTPS ausgelieferte Seite kein unverschlüsseltes ws:// öffnen darf, meldet der Browser nur "The operation is insecure." – describeConnectFailure() benennt stattdessen den Grund und den Ausweg (wss:// oder Loopback). node_modules/ wird nun auf jeder Ebene ignoriert, nicht nur unter frontend/. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
77 lines
3.1 KiB
Docker
77 lines
3.1 KiB
Docker
# 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=127.0.0.1 -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"]
|