# ---- Build Stage ---- FROM node:20-alpine AS build WORKDIR /app ARG VITE_GA_MEASUREMENT_ID ARG VITE_PLAUSIBLE_DOMAIN ARG VITE_PLAUSIBLE_SRC ARG VITE_GOOGLE_SITE_VERIFICATION ARG VITE_ADSENSE_CLIENT_ID ARG VITE_ADSENSE_SLOT_HOME_TOP ARG VITE_ADSENSE_SLOT_HOME_BOTTOM ARG VITE_ADSENSE_SLOT_TOP_BANNER ARG VITE_ADSENSE_SLOT_BOTTOM_BANNER ARG VITE_FEATURE_EDITOR ARG VITE_FEATURE_OCR ARG VITE_FEATURE_REMOVEBG ARG VITE_SITE_DOMAIN ARG VITE_SENTRY_DSN ARG VITE_CLARITY_PROJECT_ID ARG INDEXNOW_KEY ARG INDEXNOW_ENDPOINT ARG INDEXNOW_STRICT ENV VITE_GA_MEASUREMENT_ID=$VITE_GA_MEASUREMENT_ID \ VITE_PLAUSIBLE_DOMAIN=$VITE_PLAUSIBLE_DOMAIN \ VITE_PLAUSIBLE_SRC=$VITE_PLAUSIBLE_SRC \ VITE_GOOGLE_SITE_VERIFICATION=$VITE_GOOGLE_SITE_VERIFICATION \ VITE_ADSENSE_CLIENT_ID=$VITE_ADSENSE_CLIENT_ID \ VITE_ADSENSE_SLOT_HOME_TOP=$VITE_ADSENSE_SLOT_HOME_TOP \ VITE_ADSENSE_SLOT_HOME_BOTTOM=$VITE_ADSENSE_SLOT_HOME_BOTTOM \ VITE_ADSENSE_SLOT_TOP_BANNER=$VITE_ADSENSE_SLOT_TOP_BANNER \ VITE_ADSENSE_SLOT_BOTTOM_BANNER=$VITE_ADSENSE_SLOT_BOTTOM_BANNER \ VITE_FEATURE_EDITOR=$VITE_FEATURE_EDITOR \ VITE_FEATURE_OCR=$VITE_FEATURE_OCR \ VITE_FEATURE_REMOVEBG=$VITE_FEATURE_REMOVEBG \ VITE_SITE_DOMAIN=$VITE_SITE_DOMAIN \ VITE_SENTRY_DSN=$VITE_SENTRY_DSN \ VITE_CLARITY_PROJECT_ID=$VITE_CLARITY_PROJECT_ID \ INDEXNOW_KEY=$INDEXNOW_KEY \ INDEXNOW_ENDPOINT=$INDEXNOW_ENDPOINT \ INDEXNOW_STRICT=$INDEXNOW_STRICT # Install dependencies COPY package.json ./ RUN npm install # Copy source code COPY . . # Build for production RUN npm run build # ---- Production Stage ---- FROM nginx:alpine AS production # Copy built assets COPY --from=build /app/dist /usr/share/nginx/html # Copy nginx config for SPA routing COPY nginx-frontend.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] # ---- Development Stage ---- FROM node:20-alpine AS development WORKDIR /app COPY package.json ./ RUN npm install COPY . . EXPOSE 5173 CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]