Spaces:
Running
Running
| # --------------------------------------------------------------- | |
| # 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"] | |