# syntax=docker/dockerfile:1
# Linux builds generate their own Prisma clients and native modules.
FROM node:22-bookworm-slim AS dependencies
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED=1
RUN apt-get update && apt-get install -y --no-install-recommends openssl python3 make g++ ca-certificates && rm -rf /var/lib/apt/lists/*
COPY package.json package-lock.json ./
COPY prisma ./prisma
COPY prisma.config.ts prisma.postgresql.config.ts ./
COPY scripts/generate-postgresql-schema.mjs ./scripts/generate-postgresql-schema.mjs
RUN npm ci

FROM dependencies AS tools
COPY scripts ./scripts
COPY data/catalog.seed.json ./data/catalog.seed.json
USER node
CMD ["npx", "prisma", "migrate", "deploy", "--config", "prisma.postgresql.config.ts"]

FROM dependencies AS builder
COPY . .
ARG NEXT_PUBLIC_SITE_URL=http://localhost:8080
ARG MEDIA_CDN_URL=
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
ENV MEDIA_CDN_URL=$MEDIA_CDN_URL
# Only the public catalogue snapshot is used during compilation, never dev.db.
RUN DATABASE_URL=file:./build.db npm run db:local:init
RUN DATABASE_URL=file:./build.db npm run build

FROM node:22-bookworm-slim AS runner
WORKDIR /app
ENV NODE_ENV=production NEXT_TELEMETRY_DISABLED=1 PORT=3000 HOSTNAME=0.0.0.0
RUN apt-get update && apt-get install -y --no-install-recommends openssl ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder --chown=node:node /app/.next/standalone ./
COPY --from=builder --chown=node:node /app/.next/static ./.next/static
COPY --from=builder --chown=node:node /app/public ./public
COPY deploy/healthcheck.mjs ./deploy/healthcheck.mjs
RUN mkdir -p .next/cache public/uploads/admin && chown -R node:node .next/cache public/uploads/admin
USER node
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=6s --start-period=40s --retries=3 CMD ["node", "deploy/healthcheck.mjs"]
CMD ["node", "server.js"]
