# Build context: repository root (docker build -f web/Dockerfile .) FROM node:22-alpine AS build WORKDIR /repo COPY package.json package-lock.json ./ COPY shared/package.json shared/ COPY backend/package.json backend/ COPY web/package.json web/ COPY tools/simulator/package.json tools/simulator/ RUN npm ci --workspace web --include-workspace-root COPY tsconfig.base.json ./ COPY shared shared COPY web web ENV NEXT_TELEMETRY_DISABLED=1 # Rewrites are resolved at build time; inside Compose the API is reachable as "api". ARG API_INTERNAL_URL=http://api:3001 ENV API_INTERNAL_URL=$API_INTERNAL_URL RUN npm run build -w web FROM node:22-alpine ENV NODE_ENV=production NEXT_TELEMETRY_DISABLED=1 PORT=3000 HOSTNAME=0.0.0.0 API_INTERNAL_URL=http://api:3001 WORKDIR /app # Standalone output mirrors the monorepo layout: server.js lives in web/. COPY --from=build --chown=node:node /repo/web/.next/standalone ./ COPY --from=build --chown=node:node /repo/web/.next/static ./web/.next/static USER node EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=5s --start-period=20s CMD wget -qO- http://127.0.0.1:3000/ >/dev/null || exit 1 CMD ["node", "web/server.js"]