# Stage 1: Dependencies FROM node:20-alpine AS deps # Install OpenSSL for Prisma RUN apk add --no-cache openssl libc6-compat WORKDIR /app # Copy package files COPY package.json ./ # Install dependencies (skip scripts to avoid postinstall which needs source code) RUN npm install --ignore-scripts # Stage 2: Builder FROM node:20-alpine AS builder # Install OpenSSL for Prisma RUN apk add --no-cache openssl libc6-compat WORKDIR /app # Copy dependencies from deps stage COPY --from=deps /app/node_modules ./node_modules COPY --from=deps /app/package.json ./package.json # Copy source code COPY . . # Set environment variables for build ARG NODE_ENV=production ARG NEXT_PUBLIC_APP_URL ARG NEXT_PUBLIC_DOCS_URL ARG API_URL ARG BASEPATH ARG MAPBOX_ACCESS_TOKEN ARG DATABASE_URL ENV NODE_ENV=$NODE_ENV ENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL ENV NEXT_PUBLIC_DOCS_URL=$NEXT_PUBLIC_DOCS_URL ENV API_URL=$API_URL ENV BASEPATH=$BASEPATH ENV MAPBOX_ACCESS_TOKEN=$MAPBOX_ACCESS_TOKEN ENV DATABASE_URL=$DATABASE_URL # Generate Prisma Client and build icons (postinstall script) # These commands need the source code to be present RUN npm run build:icons # Build the application RUN npm run build # Stage 3: Runner FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production ENV PORT=9031 ENV NEXT_TELEMETRY_DISABLED=1 # Install OpenSSL for Prisma runtime RUN apk add --no-cache openssl libc6-compat # Create a non-root user RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs # Copy necessary files from standalone build 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/public ./public USER nextjs EXPOSE 9031 ENV PORT=9031 ENV HOSTNAME="0.0.0.0" CMD ["node", "server.js"]