# Stage 1: Builder FROM golang:1.25.5-alpine AS builder # Build-Dependencies (bash für das Cache-Version-Skript + optipng/jpegoptim für Bildkompression) RUN apk add --no-cache git bash sed optipng jpegoptim WORKDIR /app # Dependencies cachen COPY go.mod go.sum ./ RUN go mod download # Source Code kopieren COPY . . # Assets generieren (falls nicht vorhanden) RUN if [ ! -f cmd/client/web/assets/assets.json ]; then \ echo "🔨 Generiere Assets..."; \ go run ./cmd/builder; \ else \ echo "✅ Assets bereits vorhanden"; \ fi # Cache-Version aktualisieren (für Browser-Cache-Busting) RUN chmod +x scripts/cache-version.sh && \ ./scripts/cache-version.sh # ARG für den Build-Modus (z.B. "main" für Produktion) ARG BUILD_MODE=dev # Bilder komprimieren (NUR für BUILD_MODE=main) # Spart Zeit bei Feature-Branch Builds RUN if [ "$BUILD_MODE" = "main" ]; then \ echo "🗜️ PRODUCTION MODE: Komprimiere Bilder..." && \ find cmd/client/web -type f -name "*.png" -exec optipng -o3 -strip all {} \; && \ find cmd/client/web -type f \( -name "*.jpg" -o -name "*.jpeg" \) -exec jpegoptim -m85 --strip-all --all-progressive --preserve --totals {} \; && \ echo "✅ Bildkompression abgeschlossen"; \ else \ echo "⚡ DEV/FEATURE MODE: Bildkompression übersprungen"; \ fi # Server binary bauen RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags="-w -s" -o server ./cmd/server # WASM Client bauen (mit Strip-Flags: -w entfernt Debug-Info, -s entfernt Symbol-Tabelle) RUN GOOS=js GOARCH=wasm go build -ldflags="-w -s" -o cmd/client/web/main.wasm ./cmd/client # Unnötige Audio-Dateien entfernen (game.wav = 40MB, nur game.mp3 wird verwendet) RUN rm -f cmd/client/web/assets/game.wav # Stage 2: Production Image FROM alpine:latest RUN apk --no-cache add ca-certificates curl tzdata && \ addgroup -g 1000 appuser && \ adduser -D -u 1000 -G appuser appuser WORKDIR /app # Binary und Web-Dateien vom Builder kopieren COPY --from=builder /app/server . COPY --from=builder /app/cmd/client/web ./cmd/client/web # User wechseln USER appuser # Port für HTTP/WebSocket EXPOSE 8080 # Healthcheck HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1 CMD ["./server"]