# ─── Stage 1: Build Vue frontend ─────────────────────────────────────────────── FROM node:22-alpine AS web-builder WORKDIR /web COPY apps/web/package*.json ./ RUN npm ci COPY apps/web/ . RUN npm run build # ─── Stage 2: Build Go binary (with embedded Vue assets) ──────────────────────── FROM golang:1.23-alpine AS api-builder WORKDIR /api COPY apps/api/go.mod ./ RUN go mod download COPY apps/api/ . # Inject the compiled frontend so //go:embed picks it up COPY --from=web-builder /web/dist ./static/dist RUN go mod tidy && CGO_ENABLED=0 GOOS=linux go build -o /bin/server ./cmd/server # ─── Stage 3: Minimal runtime image ───────────────────────────────────────────── FROM alpine:3.20 RUN apk add --no-cache ca-certificates tzdata COPY --from=api-builder /bin/server /bin/server EXPOSE 8080 ENTRYPOINT ["/bin/server"]