# ==========================================
# 构建参数：国内源配置（可通过 --build-arg 覆盖）
# ==========================================
ARG NPM_REGISTRY=https://registry.npmmirror.com
ARG GOPROXY=https://goproxy.cn,direct
ARG APT_MIRROR=mirrors.aliyun.com

# ==========================================
# 阶段 1: 构建前端（Vue 3 + Vite）
# ==========================================
FROM registry.jerryyan.top/library/node:20-slim AS web-builder
ARG NPM_REGISTRY
ARG APT_MIRROR

WORKDIR /app/web

# 设置 npm 国内镜像并安装 pnpm（锁定 pnpm@10，避免大版本升级突袭）
ENV NPM_CONFIG_REGISTRY=${NPM_REGISTRY}
RUN npm install -g pnpm@10 && pnpm config set registry ${NPM_REGISTRY}

# 如有需要替换 Debian apt 源（node:20-slim 基于 Debian）
RUN sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
    sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list 2>/dev/null || true

# 先拷贝依赖文件，利用 Docker 缓存层（pnpm-workspace.yaml 含 onlyBuiltDependencies 批准清单）
COPY web/package.json web/pnpm-lock.yaml web/pnpm-workspace.yaml ./
RUN pnpm install --frozen-lockfile

# 拷贝前端源码并构建
COPY web/ ./
RUN pnpm build

# ==========================================
# 阶段 2: 构建 Go 后端
# ==========================================
FROM registry.jerryyan.top/library/golang:1.26-bookworm AS go-builder
ARG GOPROXY
ARG APT_MIRROR

WORKDIR /app

# 替换 apt 源并安装 CGO 编译所需的系统依赖
RUN sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list.d/debian.sources && \
    apt-get update && apt-get install -y --no-install-recommends gcc libc6-dev && \
    rm -rf /var/lib/apt/lists/*

# 设置 Go 国内模块代理
ENV GOPROXY=${GOPROXY}

# 下载 Go 模块依赖（缓存层）
COPY go.mod go.sum ./
RUN go mod download

# 拷贝全部后端源码
COPY . .

# 将阶段 1 构建好的前端产物放入 web/dist，供 Go embed 使用
COPY --from=web-builder /app/web/dist ./web/dist

# 构建后端可执行文件（启用 CGO，因为项目依赖了 mattn/go-sqlite3）
RUN CGO_ENABLED=1 GOOS=linux go build -ldflags="-w -s" -o bin/server ./cmd/server

# ==========================================
# 阶段 3: 运行镜像（最小化）
# ==========================================
FROM registry.jerryyan.top/library/debian:bookworm-slim
ARG APT_MIRROR

WORKDIR /app

# 替换 apt 源并安装 ca-certificates、wget（健康检查需要）
RUN sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list.d/debian.sources && \
    apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && \
    rm -rf /var/lib/apt/lists/*

# 拷贝二进制和默认配置
COPY --from=go-builder /app/bin/server ./server
COPY --from=go-builder /app/configs ./configs

# 创建持久化目录：SQLite 数据和上传文件
RUN mkdir -p /app/data /app/uploads

EXPOSE 8080

# 声明需要挂载的卷
VOLUME ["/app/data", "/app/uploads", "/app/configs"]

ENTRYPOINT ["./server"]
CMD ["-config", "configs/config.yaml"]
