# syntax=docker/dockerfile:1
FROM node:24-bookworm-slim AS dependencies
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED=1
RUN npm install --global pnpm@11.10.0
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN --mount=type=cache,id=overwatch-pnpm,target=/pnpm/store \
    pnpm install --frozen-lockfile --store-dir=/pnpm/store

FROM dependencies AS builder
ARG NEXT_PUBLIC_SITE_URL
ARG NEXT_PUBLIC_SUPABASE_URL
ARG NEXT_PUBLIC_SUPABASE_ANON_KEY
ARG NEXT_PUBLIC_DEMO_ENABLED=0
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL \
    NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL \
    NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY \
    NEXT_PUBLIC_DEMO_ENABLED=$NEXT_PUBLIC_DEMO_ENABLED \
    NODE_OPTIONS=--max-old-space-size=4096
COPY . .
RUN pnpm build --webpack && node scripts/package-source.mjs

FROM node:24-bookworm-slim AS runner
WORKDIR /app
ENV NODE_ENV=production \
    NEXT_TELEMETRY_DISABLED=1 \
    HOSTNAME=0.0.0.0 \
    PORT=3000
RUN groupadd --gid 1001 overwatch && useradd --uid 1001 --gid overwatch --no-create-home overwatch
COPY --from=builder --chown=overwatch:overwatch /app/.next/standalone ./
COPY --from=builder --chown=overwatch:overwatch /app/.next/static ./.next/static
COPY --from=builder --chown=overwatch:overwatch /app/public ./public
COPY --from=builder --chown=overwatch:overwatch /app/source ./source
# These files are used by runtime docs search and the social image renderer.
COPY --from=builder --chown=overwatch:overwatch /app/content ./content
COPY --from=builder --chown=overwatch:overwatch /app/src/app/fonts ./src/app/fonts
COPY --from=builder --chown=overwatch:overwatch /app/LICENSE /app/NOTICE /app/README.md ./
USER overwatch
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s --start-period=45s --retries=3 \
    CMD node -e "fetch('http://127.0.0.1:3000/login',{redirect:'manual'}).then(r=>{if(r.status!==200)process.exit(1)}).catch(()=>process.exit(1))"
CMD ["node", "server.js"]
