# --------------------------------------------------------------- # Stage 1: Build the React admin panel # --------------------------------------------------------------- FROM node:24 AS webui-builder WORKDIR /app/webui # Clone the repo to get webui source RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/CJackHwang/ds2api.git /app/src WORKDIR /app/src/webui RUN npm ci RUN npm run build # --------------------------------------------------------------- # Stage 2: Build the Go binary # --------------------------------------------------------------- FROM golang:1.26 AS go-builder WORKDIR /app/src # Copy source from webui stage (already cloned) COPY --from=webui-builder /app/src ./ ARG TARGETOS ARG TARGETARCH COPY --from=webui-builder /app/src/go.mod /app/src/go.sum* ./ RUN go mod download RUN set -eux; \ GOOS="${TARGETOS:-$(go env GOOS)}"; \ GOARCH="${TARGETARCH:-$(go env GOARCH)}"; \ CGO_ENABLED=0 GOOS="${GOOS}" GOARCH="${GOARCH}" \ go build -buildvcs=false -ldflags="-s -w" -o /out/ds2api ./cmd/ds2api # --------------------------------------------------------------- # Stage 3: Runtime image (Hugging Face Space) # --------------------------------------------------------------- FROM debian:bookworm-slim WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates \ && groupadd -r ds2api && useradd -r -g ds2api -d /app -s /sbin/nologin ds2api \ && mkdir -p /app/data /data && chown -R ds2api:ds2api /app /data \ && rm -rf /var/lib/apt/lists/* # Copy Go binary COPY --from=go-builder /out/ds2api /usr/local/bin/ds2api # Copy admin webui static files COPY --from=webui-builder --chown=ds2api:ds2api /app/src/static/admin /app/static/admin # Copy config COPY --chown=ds2api:ds2api config.json /data/config.json USER ds2api # Hugging Face Spaces sets PORT env var automatically. # ds2api respects PORT and falls back to 5001 if not set. ENV PORT=7860 ENV DS2API_CONFIG_PATH=/data/config.json EXPOSE ${PORT} CMD ["/usr/local/bin/ds2api"]