# ────────────────────────────────────────────────────────────────────── # WannPassts – Multi-Stage-Build: Frontend + Backend in einem Image # Bauen: docker build -t wannpassts . # Starten: docker run -p 8080:8080 -v wannpassts-data:/data wannpassts # ────────────────────────────────────────────────────────────────────── # ── Stage 1: Frontend bauen ─────────────────────────────────────────── FROM node:22-alpine AS frontend WORKDIR /build # Dependencies zuerst (besserer Layer-Cache) COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build # ── Stage 2: Backend bauen (CGO-frei → statisches Binary) ──────────── # go.mod verlangt Go >= 1.25 (modernc.org/sqlite) FROM golang:1.25-alpine AS backend WORKDIR /build COPY backend/go.mod backend/go.sum ./ RUN go mod download COPY backend/ ./ RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w" -o /out/wannpassts ./cmd/server # ── Stage 3: Laufzeit ───────────────────────────────────────────────── FROM alpine:3.20 # ca-certificates: nötig für HTTPS zu Google/CalDAV/ICS-Servern RUN apk add --no-cache ca-certificates tzdata \ && adduser -D -H -u 1000 app \ && mkdir -p /data && chown -R app:app /data WORKDIR /app COPY --from=backend /out/wannpassts ./wannpassts COPY --from=frontend /build/dist ./dist USER app ENV PORT=8080 \ DB_PATH=/data/wannpassts.db \ STATIC_DIR=/app/dist \ APP_URL=http://localhost:8080 # FRONTEND_URL ist bewusst nicht gesetzt: Ohne Wert leiten Callbacks auf APP_URL. # Bei getrenntem Frontend-Host einfach -e FRONTEND_URL=https://… setzen. VOLUME /data EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \ CMD wget -qO- http://127.0.0.1:8080/api/health || exit 1 ENTRYPOINT ["/app/wannpassts"]