# ── Stage 1: Build frontend ─────────────────────────────────────────────────── FROM node:20-alpine AS frontend-builder WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build # ── Stage 2: Build backend ──────────────────────────────────────────────────── FROM golang:1.22-alpine AS backend-builder WORKDIR /app/backend COPY backend/go.mod backend/go.sum ./ RUN go mod download COPY backend/ ./ # CGO disabled — pure Go SQLite (modernc.org/sqlite). RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /archivum ./cmd/server # ── Stage 3: Runtime image ──────────────────────────────────────────────────── FROM alpine:3.20 # Allow PUID/PGID override at runtime. ARG PUID=1000 ARG PGID=1000 RUN addgroup -g "${PGID}" archivum \ && adduser -u "${PUID}" -G archivum -s /sbin/nologin -D archivum # Embed frontend into the binary's working directory. COPY --from=frontend-builder /app/frontend/dist /srv/archivum/ui COPY --from=backend-builder /archivum /usr/local/bin/archivum # Volumes: config and data live outside the image. VOLUME ["/config", "/data"] ENV DOCKER_PATH=/config USER archivum EXPOSE 4000 ENTRYPOINT ["/usr/local/bin/archivum"]