FROM node:22-alpine AS builder

WORKDIR /app

RUN npm install -g pnpm@10

COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN pnpm install --frozen-lockfile

# NEXT_PUBLIC_* 会在构建时内联进浏览器代码；默认同源 /api，不能留空（空串不会触发代码里的默认值）
ARG NEXT_PUBLIC_API_BASE_URL=/api
ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \
    NEXT_TELEMETRY_DISABLED=1

COPY . .
RUN pnpm build

FROM node:22-alpine

ENV NODE_ENV=production \
    NEXT_TELEMETRY_DISABLED=1 \
    HOSTNAME=127.0.0.1 \
    PORT=22787 \
    TZ=Asia/Shanghai

WORKDIR /app

COPY --from=builder --chown=node:node /app/.next/standalone ./
COPY --from=builder --chown=node:node /app/.next/static ./.next/static
COPY --from=builder --chown=node:node /app/public ./public
# 数据库迁移文件：启动时自动应用（src/server/db/migrate.ts）
COPY --from=builder --chown=node:node /app/drizzle ./drizzle
# WebDAV 独立进程复用同一容器内的 Next API
COPY --from=builder --chown=node:node /app/src/server/webdav ./src/server/webdav
COPY --from=builder --chown=node:node /app/scripts ./scripts
# Next 不追踪独立脚本的依赖；仅复制 XML 解析器的自包含 CJS 构建与入口描述
COPY --from=builder --chown=node:node /app/node_modules/fast-xml-parser/lib ./node_modules/fast-xml-parser/lib
COPY --from=builder --chown=node:node /app/node_modules/fast-xml-parser/package.json ./node_modules/fast-xml-parser/package.json

# SQLite 数据库目录：生产环境通过 DB_FILE_NAME 指向挂载卷；预先创建并授权，未挂载时也能启动
RUN mkdir -p /app/data && chown node:node /app/data

USER node

EXPOSE 22787 3201

# 端口可由 -e PORT 覆盖，检查必须跟随实际端口（host 网络下写死会探测到别的服务）
HEALTHCHECK --interval=10s --timeout=5s --start-period=10s --retries=3 \
  CMD wget -q --spider http://127.0.0.1:${PORT}/login || exit 1

# 配置由部署时挂载的 /app/.env 提供（不存在则忽略）；已通过 -e 传入的变量优先，不会被覆盖
CMD ["node", "--env-file-if-exists=/app/.env", "scripts/start.mjs"]
