# Multi-stage build for SvelteKit app (environment-agnostic) # Stage 1: Build FROM node:24.13.1-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --legacy-peer-deps # Build-time args (for VITE_PUBLIC_* variables - these are public anyway) ARG VITE_PUBLIC_CLOUDINARY_CLOUD_NAME="" ENV VITE_PUBLIC_CLOUDINARY_CLOUD_NAME=${VITE_PUBLIC_CLOUDINARY_CLOUD_NAME} COPY . . RUN npm run build # Stage 2: Production FROM node:24.13.1-alpine WORKDIR /app RUN npm install -g pm2 COPY package*.json ./ RUN npm ci --only=production --legacy-peer-deps && npm cache clean --force COPY --from=builder /app/build ./build COPY --from=builder /app/ecosystem.config.cjs ./ecosystem.config.cjs RUN mkdir -p logs # Default port; override with PORT env in compose or .env ENV NODE_ENV=production ENV HOST=0.0.0.0 ARG PORT=3001 ENV PORT=${PORT} EXPOSE ${PORT} HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD node -e "require('http').get('http://localhost:' + (process.env.PORT || 3001), (r) => { process.exit(r.statusCode === 200 ? 0 : 1); })" CMD ["pm2-runtime", "start", "ecosystem.config.cjs"]