# syntax=docker/dockerfile:1

# ─── 阶段 1：构建 ────────────────────────────────────────────
FROM node:20-alpine AS builder

WORKDIR /app

# 禁止 husky 在无 .git 环境下报错
ENV HUSKY=0

# 安装 gadmin2 CLI（建议锁定版本号以保证构建可复现）
RUN yarn global add @gadmin2n/cli@0.0.80

# 先复制依赖描述文件，源码未变时此层可复用缓存
COPY server/package.json server/yarn.lock ./server/

# 安装全量依赖（含 devDependencies，用于代码生成和 TypeScript 编译）
RUN --mount=type=cache,target=/root/.yarn \
    cd server && yarn install --frozen-lockfile

# 复制 Prisma schema 配置和所有源码
COPY config/ ./config/
COPY server/ ./server/

# 代码生成 + 编译
RUN gadmin2 g prisma:server && cd server && yarn build

# ─── 阶段 2：运行 ────────────────────────────────────────────
FROM node:20-alpine AS runner

WORKDIR /app/server

STOPSIGNAL SIGQUIT

# 禁止 husky 在无 .git 环境下报错
ENV HUSKY=0

# 先复制依赖描述文件
COPY server/package.json server/yarn.lock ./

# 只安装 production 依赖，大幅减少镜像体积
RUN --mount=type=cache,target=/root/.yarn \
    yarn install --production --frozen-lockfile

# 从构建阶段复制 Prisma 生成的 Client（含平台原生二进制）
COPY --from=builder /app/server/node_modules/.prisma ./node_modules/.prisma

# 从构建阶段复制编译产物
COPY --from=builder /app/server/dist ./dist

# 复制 Prisma schema（feature 分支部署时 prisma db push 需要）
COPY --from=builder /app/server/prisma ./prisma

# 复制启动脚本和数据库迁移脚本
COPY server/start-prod.sh server/migrate-between-pg-schemas.js ./
RUN chmod +x start-prod.sh

# 复制环境变量配置（作为默认值，K8s 注入的同名变量优先级更高）
COPY server/.env ./.env

EXPOSE 8000

CMD ["yarn", "start:prod"]
