# Nyx ADR control plane — multi-stage build to a lean standalone Next.js runtime.
#
# BUILD CONTEXT MUST BE THE REPO ROOT — the postinstall vendor step
# (scripts/vendor-packages.mjs) builds the @nyx/* workspace packages and copies
# their dist into node_modules/@nyx (Turbopack won't resolve out-of-root packages),
# so packages/ has to be in the context. The monorepo layout is preserved in the
# image (/repo/products/adr/control-plane + /repo/packages) so `../../../packages`
# resolves exactly as it does locally.
#
#   docker build -f products/adr/control-plane/Dockerfile -t nyx-control-plane .
#   (or via the root docker-compose.dev.yml)

# --- deps: install + vendor @nyx/* (needs packages/ in context) --------------
FROM node:22-alpine AS deps
WORKDIR /repo
COPY packages ./packages
COPY products/adr/control-plane/package.json products/adr/control-plane/package-lock.json ./products/adr/control-plane/
COPY products/adr/control-plane/scripts/vendor-packages.mjs ./products/adr/control-plane/scripts/vendor-packages.mjs
WORKDIR /repo/products/adr/control-plane
# postinstall -> vendor-packages.mjs: builds @nyx/{tenancy,graph} and copies their
# dist into node_modules/@nyx as a physical package Turbopack can bundle.
RUN npm ci

# --- build: produce .next/standalone ---------------------------------------
FROM node:22-alpine AS builder
WORKDIR /repo/products/adr/control-plane
COPY --from=deps /repo/products/adr/control-plane/node_modules ./node_modules
COPY products/adr/control-plane/ ./
ENV NEXT_TELEMETRY_DISABLED=1
RUN npm run build

# --- runtime: minimal, non-root --------------------------------------------
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=3200
ENV HOSTNAME=0.0.0.0
COPY --from=builder /repo/products/adr/control-plane/public ./public
COPY --from=builder /repo/products/adr/control-plane/.next/standalone ./
COPY --from=builder /repo/products/adr/control-plane/.next/static ./.next/static
USER node
EXPOSE 3200
CMD ["node", "server.js"]
