# opsx-licence — 前端嵌入 Go 单二进制，Docker 部署
# Stage 1: Node 构建 Vue
# Stage 2: Go(+CGO) 嵌入 static 并编译
# Stage 3: 精简运行时
# 署名 Logan.Li

# ==================== Stage 1: Frontend ====================
FROM node:20-bookworm-slim AS frontend-builder

WORKDIR /frontend
ENV NODE_OPTIONS="--max-old-space-size=2048"
RUN npm config set registry https://registry.npmmirror.com

COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci

COPY frontend/ ./
RUN npm run build

# ==================== Stage 2: Backend ====================
FROM golang:1.25-bookworm AS backend-builder

WORKDIR /src
ENV GOPROXY=https://goproxy.cn,direct
ENV CGO_ENABLED=1

RUN apt-get update && apt-get install -y --no-install-recommends \
      gcc libc6-dev \
    && rm -rf /var/lib/apt/lists/*

COPY backend/go.mod backend/go.sum ./
RUN go mod download

COPY backend/ ./
RUN rm -rf static && mkdir -p static
COPY --from=frontend-builder /frontend/dist/. ./static/

RUN go build -trimpath -ldflags="-s -w" -o /out/opsx-licence .

# ==================== Stage 3: Runtime ====================
FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
      ca-certificates tzdata curl \
    && rm -rf /var/lib/apt/lists/* \
    && useradd --system --uid 10001 --home-dir /app --shell /usr/sbin/nologin opsx

ENV TZ=Asia/Shanghai \
    PORT=9001 \
    GIN_MODE=release \
    DB_DRIVER=sqlite \
    DB_NAME=/data/db.sqlite3

WORKDIR /app
COPY --from=backend-builder /out/opsx-licence /app/opsx-licence

RUN mkdir -p /data && chown -R opsx:opsx /app /data
USER opsx

VOLUME ["/data"]
EXPOSE 9001

HEALTHCHECK --interval=15s --timeout=3s --start-period=10s --retries=5 \
  CMD curl -fsS "http://127.0.0.1:${PORT}/readyz" || exit 1

ENTRYPOINT ["/app/opsx-licence"]
