75 lines
2.3 KiB
Docker
75 lines
2.3 KiB
Docker
# 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"]
|