# Hocuspocus realtime-collaboration server image. # # Built from the monorepo root (build context = repository root) so the # Docker layer cache can reuse pnpm install layers shared with the api / # worker / web images. Final image is `node:20-bookworm-slim` running # `apps/hocuspocus/dist/index.js` on port 1234. FROM --platform=linux/amd64 node:20-bookworm-slim AS base ENV NODE_ENV="production" ENV CI="true" ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN apt-get update \ && apt-get install -y --no-install-recommends openssl curl \ && rm -rf /var/lib/apt/lists/* \ && corepack enable \ && corepack prepare pnpm@10.33.0 --activate FROM base AS deps WORKDIR /myapp ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./ ADD prisma prisma ADD apps apps ADD packages packages RUN pnpm install --frozen-lockfile --prod=false FROM base AS production-deps WORKDIR /myapp COPY --from=deps /myapp/node_modules /myapp/node_modules ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./ ADD apps apps ADD packages packages RUN pnpm prune --prod FROM base AS build WORKDIR /myapp COPY --from=deps /myapp/node_modules /myapp/node_modules COPY --from=deps /myapp/apps /myapp/apps COPY --from=deps /myapp/packages /myapp/packages ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./ ADD prisma prisma ADD prisma.config.ts prisma.config.ts ADD tsconfig.json tsconfig.json ADD packages/db packages/db RUN pnpm exec prisma generate RUN pnpm --filter @toolctrl/db build ADD . . RUN pnpm --filter @toolctrl/hocuspocus build FROM base AS hocuspocus ARG APP_REVISION=unknown ENV NODE_ENV="production" ENV HOCUSPOCUS_PORT="1234" ENV HOCUSPOCUS_HOST="0.0.0.0" ENV APP_REVISION="${APP_REVISION}" LABEL org.opencontainers.image.revision="${APP_REVISION}" EXPOSE 1234 WORKDIR /myapp COPY --from=production-deps /myapp/node_modules /myapp/node_modules COPY --from=build /myapp/package.json /myapp/package.json COPY --from=build /myapp/pnpm-lock.yaml /myapp/pnpm-lock.yaml COPY --from=build /myapp/pnpm-workspace.yaml /myapp/pnpm-workspace.yaml COPY --from=build /myapp/tsconfig.json /myapp/tsconfig.json COPY --from=build /myapp/apps/hocuspocus/package.json /myapp/apps/hocuspocus/package.json COPY --from=deps /myapp/apps/hocuspocus/node_modules /myapp/apps/hocuspocus/node_modules COPY --from=build /myapp/apps/hocuspocus/dist /myapp/apps/hocuspocus/dist COPY --from=build /myapp/packages/db /myapp/packages/db COPY --from=deps /myapp/packages/db/node_modules /myapp/packages/db/node_modules COPY --from=build /myapp/packages/db/generated/prisma/client /myapp/packages/db/generated/prisma/client COPY --from=build /myapp/packages/logger /myapp/packages/logger COPY --from=deps /myapp/packages/logger/node_modules /myapp/packages/logger/node_modules COPY --from=build /myapp/prisma /myapp/prisma COPY --from=build /myapp/prisma.config.ts /myapp/prisma.config.ts USER node HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD node -e "require('net').connect(${HOCUSPOCUS_PORT:-1234}, '127.0.0.1').on('connect', () => process.exit(0)).on('error', () => process.exit(1))" CMD ["node", "apps/hocuspocus/dist/index.js"]