FROM node:22-slim AS frontend # Pin pnpm: corepack otherwise auto-fetches the latest (pnpm 11), which no longer # reads the "pnpm.onlyBuiltDependencies" field in package.json and fails the build # on ignored install scripts (esbuild / better-sqlite3). v10 still honors that field. RUN corepack enable pnpm && corepack prepare pnpm@10.34.3 --activate WORKDIR /app/web COPY web/package.json ./ RUN pnpm config set registry https://registry.npmmirror.com && pnpm install COPY web/ ./ RUN pnpm run build FROM node:22-slim AS production # Pin pnpm: corepack otherwise auto-fetches the latest (pnpm 11), which no longer # reads the "pnpm.onlyBuiltDependencies" field in package.json and fails the build # on ignored install scripts (esbuild / better-sqlite3). v10 still honors that field. RUN corepack enable pnpm && corepack prepare pnpm@10.34.3 --activate WORKDIR /app # Switch to Aliyun mirror for faster apt downloads in China RUN sed -i \ -e 's|http://deb.debian.org|http://mirrors.aliyun.com|g' \ -e 's|http://security.debian.org|http://mirrors.aliyun.com|g' \ /etc/apt/sources.list.d/debian.sources # Build tools needed to compile better-sqlite3 native addon RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/* COPY server/package.json ./server/ WORKDIR /app/server # hoisted mode: flat node_modules so native addons (better-sqlite3) can locate their .node files # pnpm v10 blocks build scripts by default; onlyBuiltDependencies allows better-sqlite3 to compile, # and explicit rebuild ensures the native addon is built even if install skipped it. RUN echo "node-linker=hoisted" > .npmrc && \ pnpm config set registry https://registry.npmmirror.com && \ pnpm install --prod && \ pnpm rebuild better-sqlite3 COPY server/ ./ RUN mkdir -p data COPY --from=frontend /app/web/dist /app/web/dist EXPOSE 3456 CMD ["pnpm", "exec", "tsx", "src/index.ts"]