# syntax=docker/dockerfile:1 FROM node:22-bookworm-slim AS dependencies WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --no-audit --no-fund FROM dependencies AS builder COPY . . # Next.js embeds NEXT_PUBLIC_* values into browser bundles; the server secret is runtime-only. ARG NEXT_PUBLIC_SUPABASE_URL ARG NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ NODE_OPTIONS=--max-old-space-size=640 \ NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL} \ NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=${NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY} # The Webpack compiler cache is build-only and can be hundreds of megabytes. RUN if [ -z "$NEXT_PUBLIC_SUPABASE_URL" ] || [ -z "$NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY" ]; then \ echo "In Dokploy, set NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY under Application > Environment > Build Time Arguments." >&2; \ exit 1; \ fi && npm run build:docker \ && rm -rf /app/.next/cache/webpack # Reuse the installation, and prune only after the build has completed. # A second independent npm ci stage could overlap with compilation in BuildKit. FROM builder AS production-dependencies RUN npm prune --omit=dev --no-audit --no-fund FROM node:22-bookworm-slim AS runner WORKDIR /app ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ NODE_OPTIONS=--max-old-space-size=256 \ PORT=3000 \ HOSTNAME=0.0.0.0 \ MINEGEO_HOST=0.0.0.0 \ MINEGEO_WORKER_HEAP_MB=512 \ UV_THREADPOOL_SIZE=2 COPY --from=production-dependencies --chown=node:node /app/node_modules ./node_modules COPY --from=builder --chown=node:node /app/.next ./.next COPY --from=builder --chown=node:node /app/public ./public COPY --chown=node:node package.json tsconfig.json next.config.ts ./ COPY --chown=node:node scripts/supervise.mjs scripts/runtime-config.mjs scripts/assets.mjs ./scripts/ COPY --chown=node:node worker ./worker COPY --chown=node:node shared ./shared COPY --chown=node:node lib ./lib COPY --chown=node:node renderer ./renderer RUN mkdir -p /app/.cache && chown node:node /app/.cache USER node EXPOSE 3000 CMD ["node", "scripts/supervise.mjs", "production"]