FROM node:24-bookworm-slim AS base LABEL io.entroia.project="waterfall-wiki" ENV NEXT_TELEMETRY_DISABLED=1 WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends ffmpeg ca-certificates chromium fonts-noto-cjk \ && rm -rf /var/lib/apt/lists/* FROM base AS dependencies WORKDIR /repo/apps/waterfall-wiki LABEL io.entroia.wiki.build="true" RUN corepack enable && corepack prepare pnpm@11.25.0 --activate COPY apps/waterfall-wiki/pnpm-lock.yaml ./ COPY pnpm-workspace.yaml /repo/pnpm-workspace.yaml # Download cache depends on lockfile and workspace policy, not package scripts. RUN pnpm fetch --lockfile-dir=/repo/apps/waterfall-wiki --fetch-timeout=300000 --network-concurrency=8 COPY packages/brand/package.json /repo/packages/brand/package.json COPY apps/waterfall-wiki/package.json ./ RUN pnpm --filter @prompt/waterfall-wiki install --offline --frozen-lockfile FROM dependencies AS build # .dockerignore excludes docs and operational notes without extra legacy COPY snapshots. # Brand source changes invalidate compilation, not dependency installation. COPY packages/brand/ /repo/packages/brand/ COPY apps/waterfall-wiki/ . RUN pnpm typecheck && pnpm test && pnpm build && pnpm test:smoke FROM build AS integration ENV VERIFY_CANVAS_UI=1 USER node CMD ["npm", "run", "test:integration"] FROM base AS runtime WORKDIR /app/apps/waterfall-wiki ENV NODE_ENV=production HOSTNAME=0.0.0.0 PORT=3000 \ FFMPEG_PATH=/usr/bin/ffmpeg FFPROBE_PATH=/usr/bin/ffprobe COPY --from=build --chown=node:node /repo/apps/waterfall-wiki/.next/standalone/ /app/ COPY --from=build --chown=node:node /repo/apps/waterfall-wiki/dist/worker.cjs /repo/apps/waterfall-wiki/dist/bootstrap.cjs /repo/apps/waterfall-wiki/dist/publish-learning-series.cjs /repo/apps/waterfall-wiki/dist/auth-cli.cjs ./ COPY --from=build --chown=node:node /repo/apps/waterfall-wiki/db/ ./db/ COPY --chown=node:node apps/waterfall-wiki/scripts/container-health.mjs ./ COPY --chown=node:node apps/waterfall-wiki/scripts/import-character-packs.mjs apps/waterfall-wiki/scripts/verify-character-pack.mjs ./scripts/ COPY --chown=node:node apps/waterfall-wiki/seed/characters/ ./seed/characters/ COPY --chown=node:node apps/waterfall-wiki/src/content/managed-media.json ./src/content/managed-media.json USER node EXPOSE 3000 CMD ["node", "server.js"]