# 支持: linux/amd64, linux/arm64, linux/arm/v7

# ========== 支持在 CI 注入国内镜像源前缀拉 node 基础镜像 ==========
# 用法：docker buildx build \
#   --build-arg DOCKER_MIRROR=docker.m.daocloud.io/library/ \
#   --build-arg NODE_BUILDER_TAG=22-alpine \
#   --build-arg NODE_RUNTIME_TAG=22-alpine \
#   ...
# 缺省（DOCKER_MIRROR 为空）等价于原来的 node:22-alpine，本地开发不变
ARG DOCKER_MIRROR=""
ARG NODE_BUILDER_TAG="22-alpine"
ARG NODE_RUNTIME_TAG="22-alpine"

# ==========================================
# 第一阶段：依赖安装与构建阶段
# ==========================================
FROM ${DOCKER_MIRROR}node:${NODE_BUILDER_TAG} AS builder

WORKDIR /app
ENV NODE_OPTIONS="--max-old-space-size=1024"
ENV VITE_BUILD_THREADS=1
ENV NITRO_PRESET=node-server
# 1. 仅复制依赖相关文件和 scripts 目录（因为 postinstall 需要），利用 Docker 缓存层
COPY package.json package-lock.json ./
COPY scripts ./scripts

# 配置 npm 镜像加速并安装依赖，严格内存优化
RUN set -eux; \
    npm config set registry https://registry.npmmirror.com; \
    npm config set maxsockets 3; \
    npm config set progress false; \
    npm config set cache /tmp/npm-cache; \
    npm install --package-lock-only --ignore-scripts; \
    npm ci --prefer-offline --no-audit --no-fund --maxsockets=3

# 2. 复制源代码并进行构建
# 只有在 package.json 没变而源代码改变时，才会从这一步开始重新执行，跳过上面的耗时依赖安装
COPY . .

# ========== OAuth / 第三方登录构建期配置（process.env.AGGREGATE_OAUTH_APP_ID 控制 nuxt.config.ts public.oauth.aggregate 开关） ==========
# 说明：
#   - 这些是 **构建期** 变量，只在 RUN npm run build 时用到（runtimeConfig.public 只会在 build 时固化到 .output/public 包）
#   - 部署时运行期变量（同一套值）会通过 docker-compose.yml env_file: [.env] 注入到容器 process.env 供 server/utils/oauth-strategies.ts loadAggregateSettings 使用
ARG OAUTH_REDIRECT_URI=""
ARG OAUTH_STATE_SECRET=""
ARG AGGREGATE_OAUTH_APP_ID=""
ARG AGGREGATE_OAUTH_APP_KEY=""
ARG AGGREGATE_OAUTH_LOGIN_TYPE=""
ARG AGGREGATE_OAUTH_ENDPOINT=""
ENV OAUTH_REDIRECT_URI="${OAUTH_REDIRECT_URI}" \
    OAUTH_STATE_SECRET="${OAUTH_STATE_SECRET}" \
    AGGREGATE_OAUTH_APP_ID="${AGGREGATE_OAUTH_APP_ID}" \
    AGGREGATE_OAUTH_APP_KEY="${AGGREGATE_OAUTH_APP_KEY}" \
    AGGREGATE_OAUTH_LOGIN_TYPE="${AGGREGATE_OAUTH_LOGIN_TYPE}" \
    AGGREGATE_OAUTH_ENDPOINT="${AGGREGATE_OAUTH_ENDPOINT}"

# 构建应用，使用内存优化脚本适应4GB总内存
RUN chmod +x scripts/memory-build.js && \
    node scripts/memory-build.js
RUN npm prune --omit=dev

# ==========================================
# 第二阶段：运行阶段
# ==========================================
FROM ${DOCKER_MIRROR}node:${NODE_RUNTIME_TAG} AS runtime

USER root
WORKDIR /app

# 从构建阶段复制必要文件，剔除无关的开发依赖
COPY --from=builder /app/package.json ./
COPY --from=builder /app/package-lock.json ./
COPY --from=builder /app/drizzle.config.ts ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.output ./.output
COPY --from=builder /app/app/drizzle ./app/drizzle
COPY --from=builder /app/scripts ./scripts
# 如果有 vendor 目录再取消注释
# COPY --from=builder /app/vendor ./vendor

# 环境变量配置
ENV NODE_ENV=production \
    PORT=3000 \
    NPM_CONFIG_UPDATE_NOTIFIER=false \
    PREBUILT=true \
    NODE_OPTIONS="--max-old-space-size=512"

# 暴露端口
EXPOSE $PORT

# 启动命令：先执行数据库迁移，再启动应用
CMD ["sh", "-c", "node scripts/deploy.js && node .output/server/index.mjs"]
