# syntax=docker/dockerfile:1 # ============================================================================= # OmniOil Workspace - Unified Frontend Build Pipeline # ============================================================================= # --- Stage 1: Install workspace dependencies --- FROM node:22-alpine AS deps RUN corepack enable && corepack prepare pnpm@9.0.0 --activate WORKDIR /app # Copy workspace configurations and manifests COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY services/landing/package.json ./services/landing/ COPY services/frontend-admin/package.json ./services/frontend-admin/ COPY services/frontend-console/package.json ./services/frontend-console/ COPY services/frontend-pwa/package.json ./services/frontend-pwa/ # Run installation utilizing pnpm cache mount RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile --store-dir /pnpm/store # --- Stage 2: Base builder --- FROM deps AS builder_base # --- Stage 3: Landing build --- FROM builder_base AS builder-landing COPY services/landing services/landing ARG NEXT_PUBLIC_TURNSTILE_SITE_KEY ENV NEXT_TELEMETRY_DISABLED=1 ENV NEXT_PUBLIC_TURNSTILE_SITE_KEY=$NEXT_PUBLIC_TURNSTILE_SITE_KEY RUN pnpm --filter landing build # --- Stage 4: Admin build --- FROM builder_base AS builder-admin COPY services/frontend-admin services/frontend-admin ARG VITE_API_BASE ARG VITE_ADMIN_APP_ORIGIN ARG VITE_MOBILE_APP_ORIGIN ARG VITE_API_URL ARG VITE_TURNSTILE_SITE_KEY ARG VITE_LANDING_APP_ORIGIN ENV VITE_API_BASE=$VITE_API_BASE ENV VITE_ADMIN_APP_ORIGIN=$VITE_ADMIN_APP_ORIGIN ENV VITE_MOBILE_APP_ORIGIN=$VITE_MOBILE_APP_ORIGIN ENV VITE_API_URL=$VITE_API_URL ENV VITE_TURNSTILE_SITE_KEY=$VITE_TURNSTILE_SITE_KEY ENV VITE_LANDING_APP_ORIGIN=$VITE_LANDING_APP_ORIGIN RUN pnpm --filter frontend-admin build # --- Stage 5: Console build --- FROM builder_base AS builder-console COPY services/frontend-console services/frontend-console ARG VITE_API_BASE ARG VITE_CONSOLE_APP_ORIGIN ARG VITE_ACCESS_REQUEST_REVIEWER_EMAILS ENV VITE_API_BASE=$VITE_API_BASE ENV VITE_CONSOLE_APP_ORIGIN=$VITE_CONSOLE_APP_ORIGIN ENV VITE_ACCESS_REQUEST_REVIEWER_EMAILS=$VITE_ACCESS_REQUEST_REVIEWER_EMAILS RUN pnpm --filter frontend-console build # --- Stage 6: PWA build --- FROM builder_base AS builder-pwa COPY services/frontend-pwa services/frontend-pwa ARG VITE_API_BASE ARG VITE_ADMIN_APP_ORIGIN ARG VITE_MOBILE_APP_ORIGIN ARG VITE_API_URL ENV VITE_API_BASE=$VITE_API_BASE ENV VITE_ADMIN_APP_ORIGIN=$VITE_ADMIN_APP_ORIGIN ENV VITE_MOBILE_APP_ORIGIN=$VITE_MOBILE_APP_ORIGIN ENV VITE_API_URL=$VITE_API_URL RUN pnpm --filter frontend-pwa build # ============================================================================= # RUNTIME IMAGES # ============================================================================= # --- LANDING RUNTIME (Next.js Standalone Mode in Monorepo) --- FROM node:22-alpine AS landing WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV HOSTNAME=0.0.0.0 ENV PORT=80 ENV LANDING_API_PROXY_TARGET=http://backend-api:8000 COPY --from=builder-landing /app/services/landing/public ./services/landing/public COPY --from=builder-landing /app/services/landing/.next/standalone ./ COPY --from=builder-landing /app/services/landing/.next/static ./services/landing/.next/static EXPOSE 80 CMD ["node", "services/landing/server.js"] # --- ADMIN RUNTIME (Nginx SPA) --- FROM nginx:alpine AS frontend-admin COPY --from=builder-admin /app/services/frontend-admin/dist /usr/share/nginx/html COPY services/frontend-admin/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] # --- CONSOLE RUNTIME (Nginx SPA) --- FROM nginx:alpine AS frontend-console COPY --from=builder-console /app/services/frontend-console/dist /usr/share/nginx/html COPY services/frontend-console/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] # --- PWA RUNTIME (Nginx SPA) --- FROM nginx:alpine AS frontend-pwa COPY --from=builder-pwa /app/services/frontend-pwa/dist /usr/share/nginx/html COPY services/frontend-pwa/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]