Dockerfile 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # ---- Base ----
  2. FROM node:20-slim AS base
  3. RUN corepack enable pnpm
  4. WORKDIR /app
  5. # Install build dependencies for native modules (better-sqlite3)
  6. RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
  7. # ---- Dependencies ----
  8. FROM base AS deps
  9. COPY package.json pnpm-lock.yaml ./
  10. COPY prisma ./prisma/
  11. COPY prisma.config.ts ./
  12. RUN pnpm install --frozen-lockfile
  13. # ---- Build ----
  14. FROM base AS build
  15. COPY --from=deps /app/node_modules ./node_modules
  16. COPY . .
  17. RUN pnpm prisma generate
  18. RUN pnpm build
  19. # ---- Web (Next.js standalone server) ----
  20. FROM node:20-slim AS web
  21. WORKDIR /app
  22. ENV NODE_ENV=production
  23. # Copy standalone output
  24. COPY --from=build /app/.next/standalone ./
  25. COPY --from=build /app/.next/static ./.next/static
  26. COPY --from=build /app/public ./public
  27. # Copy Prisma client + schema for db:push at runtime
  28. COPY --from=build /app/generated ./generated
  29. COPY --from=build /app/prisma ./prisma
  30. COPY --from=build /app/prisma.config.ts ./prisma.config.ts
  31. # Copy better-sqlite3 native binding
  32. COPY --from=deps /app/node_modules/.pnpm/better-sqlite3@*/node_modules/better-sqlite3/build ./node_modules/better-sqlite3/build
  33. COPY --from=deps /app/node_modules/.pnpm/@prisma+adapter-better-sqlite3@*/node_modules/@prisma/adapter-better-sqlite3 ./node_modules/@prisma/adapter-better-sqlite3
  34. # SQLite data directory
  35. RUN mkdir -p /app/data
  36. ENV DATABASE_URL="file:/app/data/prod.db"
  37. EXPOSE 3000
  38. CMD ["node", "server.js"]
  39. # ---- Worker ----
  40. FROM base AS worker
  41. WORKDIR /app
  42. ENV NODE_ENV=production
  43. COPY --from=deps /app/node_modules ./node_modules
  44. COPY --from=build /app/generated ./generated
  45. COPY . .
  46. # SQLite data directory (shared via volume)
  47. RUN mkdir -p /app/data
  48. ENV DATABASE_URL="file:/app/data/prod.db"
  49. CMD ["pnpm", "tsx", "src/worker/index.ts"]