# syntax=docker/dockerfile:1.7

ARG NODE_IMAGE=node:24.18.0-bookworm-slim@sha256:6f7b03f7c2c8e2e784dcf9295400527b9b1270fd37b7e9a7285cf83b6951452d
ARG POSTGRES_IMAGE=postgres:17.9-bookworm@sha256:47f917f7409eacd22fc5dfb1dee634e1b55cf0c01d1a7eb701be2227a03e0641

FROM ${NODE_IMAGE} AS base
ENV PNPM_HOME=/pnpm \
    PATH=/pnpm:$PATH \
    NEXT_TELEMETRY_DISABLED=1
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@10.33.0 --activate

FROM base AS development
COPY . .
RUN pnpm install --frozen-lockfile

FROM development AS build
ENV NODE_ENV=production
RUN pnpm build

FROM build AS worker-bundle
RUN mkdir -p /out/worker/dist \
    && cp -a /app/apps/worker/dist/. /out/worker/dist/

FROM base AS migrate
ENV NODE_ENV=production
COPY --from=build --chown=node:node /app /app
USER node
CMD ["./packages/db/node_modules/.bin/tsx", "packages/db/src/migrate.ts"]

FROM ${NODE_IMAGE} AS web
ENV NODE_ENV=production \
    NEXT_TELEMETRY_DISABLED=1 \
    HOSTNAME=0.0.0.0 \
    PORT=3000 \
    CONTENT_ROOT=/content \
    ARTIFACT_ROOT=/artifacts
WORKDIR /app
RUN rm -rf /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/corepack /opt/yarn-v1.22.22 \
    && rm -f /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack /usr/local/bin/yarn /usr/local/bin/yarnpkg \
    && mkdir -p /content/playbooks /content/catalog /artifacts \
    && chown -R node:node /app /content /artifacts
COPY --from=build --chown=node:node /app/apps/web/.next/standalone ./
COPY --from=build --chown=node:node /app/apps/web/.next/static ./apps/web/.next/static
COPY --from=build --chown=node:node /app/content/playbooks /content/playbooks
COPY --from=build --chown=node:node /app/catalog/seed-catalog.yaml /content/catalog/seed-catalog.yaml
USER node
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
  CMD ["node", "-e", "fetch('http://127.0.0.1:3000/health/live').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
CMD ["node", "apps/web/server.js"]

FROM ${NODE_IMAGE} AS worker
ENV NODE_ENV=production \
    CONTENT_ROOT=/content \
    ARTIFACT_ROOT=/artifacts
WORKDIR /app
RUN rm -rf /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/corepack /opt/yarn-v1.22.22 \
    && rm -f /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack /usr/local/bin/yarn /usr/local/bin/yarnpkg \
    && mkdir -p /content/playbooks /content/catalog /artifacts \
    && chown -R node:node /app /content /artifacts
COPY --from=worker-bundle --chown=node:node /out/worker ./
COPY --from=build --chown=node:node /app/content/playbooks /content/playbooks
COPY --from=build --chown=node:node /app/catalog/seed-catalog.yaml /content/catalog/seed-catalog.yaml
USER node
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
  CMD ["node", "-e", "try{process.kill(1,0)}catch{process.exit(1)}"]
CMD ["node", "dist/index.js"]

FROM ${POSTGRES_IMAGE} AS all-in-one
ENV NODE_ENV=production \
    NEXT_TELEMETRY_DISABLED=1 \
    HOSTNAME=0.0.0.0 \
    PORT=3000 \
    PGDATA=/config/postgres \
    CONTENT_ROOT=/content \
    ARTIFACT_ROOT=/config/artifacts
WORKDIR /app
COPY --from=base /usr/local/bin/node /usr/local/bin/node
COPY --from=build /app /app
COPY --from=build /app/apps/web/.next/static /app/apps/web/.next/standalone/apps/web/.next/static
COPY --from=build /app/content/playbooks /content/playbooks
COPY --from=build /app/catalog/seed-catalog.yaml /content/catalog/seed-catalog.yaml
COPY docker/all-in-one-entrypoint.sh /usr/local/bin/devrunbook-all-in-one
RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid 1000 --create-home --shell /usr/sbin/nologin node \
    && mkdir -p /config/postgres /config/artifacts /config/operator-content /content/playbooks /content/catalog \
    && chown -R node:node /app /content \
    && chown -R postgres:postgres /config/postgres \
    && chown -R node:node /config/artifacts /config/operator-content \
    && chmod 0755 /usr/local/bin/devrunbook-all-in-one
EXPOSE 3000
VOLUME ["/config"]
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
  CMD ["node", "-e", "fetch('http://127.0.0.1:3000/health/ready').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
ENTRYPOINT ["/usr/local/bin/devrunbook-all-in-one"]
