File size: 2,095 Bytes
d6fa094
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73f257f
d6fa094
 
 
 
 
 
73f257f
d6fa094
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# ---------------------------------------------------------------
# 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"]