# syntax=docker/dockerfile:1.6 FROM node:25-slim AS base WORKDIR /app FROM base AS deps # Install build dependencies for native modules like better-sqlite3 RUN apt-get update && apt-get install -y --no-install-recommends \ python3 \ make \ g++ \ openssl \ ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY package.json package-lock.json* ./ # Install dependencies RUN if [ -f package-lock.json ]; then npm ci; else npm install; fi FROM base AS builder ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Set a temporary database path for build ENV DATABASE_PATH=/tmp/build.db ENV DATABASE_URL=file:/tmp/build.db COPY --from=deps /app/node_modules ./node_modules COPY . . # Build the Next.js application RUN npm run build && rm -f /tmp/build.db FROM base AS runner ENV NODE_ENV=production ENV PORT=3000 WORKDIR /app # Install gosu for privilege dropping RUN apt-get update && apt-get install -y --no-install-recommends \ gosu \ && rm -rf /var/lib/apt/lists/* RUN groupadd -g 1001 nodejs && useradd -r -u 1001 -g nodejs nextjs COPY --from=builder /app/public ./public COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/package.json ./package.json # Copy instrumentation file and all required chunks for server startup initialization COPY --from=builder /app/.next/server/instrumentation.js ./.next/server/instrumentation.js COPY --from=builder /app/.next/server/instrumentation ./.next/server/instrumentation COPY --from=builder /app/.next/server/chunks/ ./.next/server/chunks/ # Copy Drizzle migrations for runtime schema management COPY --from=builder /app/drizzle ./drizzle # Create data directory for SQLite database RUN mkdir -p /app/data && chown -R nextjs:nodejs /app/data # Copy entrypoint script COPY docker/web/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh EXPOSE 3000 # Run as root so entrypoint can fix permissions, then switch to nextjs ENTRYPOINT ["/entrypoint.sh"]