# ---- Base ---- FROM node:20-slim AS base RUN corepack enable pnpm WORKDIR /app # Install build dependencies for native modules (better-sqlite3) RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/* # ---- Dependencies ---- FROM base AS deps COPY package.json pnpm-lock.yaml ./ COPY prisma ./prisma/ COPY prisma.config.ts ./ RUN pnpm install --frozen-lockfile # ---- Build ---- FROM base AS build COPY --from=deps /app/node_modules ./node_modules COPY . . RUN pnpm prisma generate RUN pnpm build # ---- Web (Next.js standalone server) ---- FROM node:20-slim AS web WORKDIR /app ENV NODE_ENV=production # Copy standalone output COPY --from=build /app/.next/standalone ./ COPY --from=build /app/.next/static ./.next/static COPY --from=build /app/public ./public # Copy Prisma client + schema for db:push at runtime COPY --from=build /app/generated ./generated COPY --from=build /app/prisma ./prisma COPY --from=build /app/prisma.config.ts ./prisma.config.ts # Copy better-sqlite3 native binding COPY --from=deps /app/node_modules/.pnpm/better-sqlite3@*/node_modules/better-sqlite3/build ./node_modules/better-sqlite3/build COPY --from=deps /app/node_modules/.pnpm/@prisma+adapter-better-sqlite3@*/node_modules/@prisma/adapter-better-sqlite3 ./node_modules/@prisma/adapter-better-sqlite3 # SQLite data directory RUN mkdir -p /app/data ENV DATABASE_URL="file:/app/data/prod.db" EXPOSE 3000 CMD ["node", "server.js"] # ---- Worker ---- FROM base AS worker WORKDIR /app ENV NODE_ENV=production COPY --from=deps /app/node_modules ./node_modules COPY --from=build /app/generated ./generated COPY . . # SQLite data directory (shared via volume) RUN mkdir -p /app/data ENV DATABASE_URL="file:/app/data/prod.db" CMD ["pnpm", "tsx", "src/worker/index.ts"]