FROM node:22-slim AS frontend RUN corepack enable pnpm 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 RUN corepack enable pnpm 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"]