# Monaco USA Portal - SvelteKit Application # Multi-stage build for optimized production image # ============================================ # Stage 1: Dependencies # ============================================ FROM node:20-alpine AS deps WORKDIR /app # Copy package files COPY package.json package-lock.json* ./ # Install dependencies RUN npm ci # ============================================ # Stage 2: Builder # ============================================ FROM node:20-alpine AS builder WORKDIR /app # Copy package files first COPY package.json package-lock.json* ./ # Install dependencies - use npm install instead of npm ci to properly # resolve platform-specific optional dependencies (rollup binaries) RUN rm -rf node_modules && npm install --legacy-peer-deps # Copy source files COPY . . # Build arguments for environment variables ARG PUBLIC_SUPABASE_URL ARG PUBLIC_SUPABASE_ANON_KEY ARG SUPABASE_SERVICE_ROLE_KEY # Set environment variables for build ENV PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL ENV PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY ENV SUPABASE_SERVICE_ROLE_KEY=$SUPABASE_SERVICE_ROLE_KEY # Build the application RUN npm run build # Prune dev dependencies RUN npm prune --production # ============================================ # Stage 3: Runner (Production) # ============================================ FROM node:20-alpine AS runner WORKDIR /app # Set production environment ENV NODE_ENV=production # Create non-root user for security RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 sveltekit # Copy built application COPY --from=builder --chown=sveltekit:nodejs /app/build ./build COPY --from=builder --chown=sveltekit:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=sveltekit:nodejs /app/package.json ./package.json # Switch to non-root user USER sveltekit # Expose port EXPOSE 3000 # Set runtime environment variables ENV HOST=0.0.0.0 ENV PORT=3000 # Start the application CMD ["node", "build"]