FROM node:22-slim AS base RUN corepack enable && corepack prepare pnpm@10.28.0 --activate WORKDIR /app # ---- Install dependencies ---- FROM base AS deps COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ # pnpm-workspace.yaml declares patchedDependencies -> patches/, which pnpm # reads during install. It must be in the deps stage or --frozen-lockfile # fails with ENOENT on the patch file (#2118). COPY patches/ patches/ COPY packages/ packages/ COPY templates/ templates/ COPY demos/ demos/ COPY docs/package.json docs/package.json COPY e2e/fixture/package.json e2e/fixture/package.json RUN sed -i '/slidev/d' pnpm-workspace.yaml RUN pnpm install --frozen-lockfile # ---- Build ---- FROM deps AS build COPY . . # The deps stage installs only packages/, templates/ and demos/. COPY . . adds # the rest of the workspace (apps/, fixtures/, i18n, infra/, ...), whose # dependencies were never installed, so pnpm's verifyDepsBeforeRun check would # refuse to run the build. The partial install is intended; drop the check. RUN sed -i '/slidev/d;/verifyDepsBeforeRun/d' pnpm-workspace.yaml RUN sed -i 's|file:./data.db|file:./data/data.db|' templates/blog/astro.config.mjs # Package compilation and the legacy deploy can exceed Node's default heap. ENV NODE_OPTIONS=--max-old-space-size=4096 RUN pnpm build && pnpm --filter @emdash-cms/template-blog build # Bundle the blog template into a standalone deployment RUN pnpm --filter @emdash-cms/template-blog deploy /deploy --prod --legacy # Copy build output and seed data into the deploy directory RUN cp -r /app/templates/blog/dist /deploy/dist RUN cp -r /app/templates/blog/seed /deploy/seed RUN cp /app/templates/blog/astro.config.mjs /deploy/astro.config.mjs # ---- Runtime ---- FROM node:22-slim WORKDIR /app COPY --from=build /deploy . # A site built with postgres() or libsql() imports its driver (pg or # @libsql/kysely-libsql) from the bundled server by bare name, but the legacy # deploy leaves both only under .pnpm/node_modules. RUN mkdir -p data uploads /app/node_modules/@libsql \ && ln -s /app/node_modules/.pnpm/node_modules/kysely /app/node_modules/kysely \ && ln -s /app/node_modules/.pnpm/node_modules/pg /app/node_modules/pg \ && ln -s /app/node_modules/.pnpm/node_modules/@libsql/kysely-libsql /app/node_modules/@libsql/kysely-libsql ENV HOST=0.0.0.0 ENV PORT=4321 EXPOSE 4321 CMD ["node", "./dist/server/entry.mjs"]