Files
SvenandClaude Opus 5 521ceb044b Loopback als Vorgabe, verständliche Meldung bei Mixed Content
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>
2026-08-24 17:16:41 +02:00

77 lines
3.1 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"]