FROM node:22-alpine AS base RUN apk add --no-cache openssl && \ npm install -g pnpm@11.6.0 # ── deps ──────────────────────────────────────────────────────────────────── FROM base AS deps WORKDIR /app ENV PRISMA_CLI_BINARY_TARGETS=linux-musl-openssl-3.0.x ENV CI=true COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./ RUN pnpm install --frozen-lockfile --ignore-scripts # ── builder ───────────────────────────────────────────────────────────────── # Bust cache when needed: docker build --build-arg CACHE_BUST=$(date +%s) ARG CACHE_BUST=1 FROM base AS builder WORKDIR /app ENV PRISMA_CLI_BINARY_TARGETS=linux-musl-openssl-3.0.x COPY --from=deps /app/node_modules ./node_modules COPY . . RUN pnpm prisma generate ENV NEXT_TELEMETRY_DISABLED=1 ENV NODE_OPTIONS="--max-old-space-size=512" RUN pnpm build # ── runner ────────────────────────────────────────────────────────────────── FROM node:22-alpine AS runner WORKDIR /app RUN apk add --no-cache openssl ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV PRISMA_CLI_BINARY_TARGETS=linux-musl-openssl-3.0.x RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 nextjs COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static COPY --from=builder --chown=nextjs:nodejs /app/src/generated ./src/generated COPY --from=builder /app/prisma ./prisma # Upload directory — mount a volume here for persistence: -v /host/uploads:/data/uploads RUN mkdir -p /data/uploads && chown nextjs:nodejs /data/uploads ENV UPLOAD_DIR=/data/uploads USER nextjs EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" CMD ["node", "server.js"]