# syntax=docker/dockerfile:1 # ---- base: pnpm-enabled Node ---- FROM node:22-alpine AS base ENV PNPM_HOME=/pnpm ENV PATH=$PNPM_HOME:$PATH RUN corepack enable WORKDIR /repo # ---- build: install workspace, bundle backend (+ core) ---- FROM base AS build # Manifests first for better layer caching. COPY pnpm-lock.yaml pnpm-workspace.yaml package.json tsconfig.base.json ./ COPY packages/core/package.json packages/core/package.json COPY packages/backend/package.json packages/backend/package.json RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile # Sources. COPY packages/core packages/core COPY packages/backend packages/backend # Bundle backend + core source into packages/backend/dist. RUN pnpm --filter @altricade/backend build # Produce a pruned, production-only deployment (dist + migrations + prod node_modules). RUN pnpm --filter @altricade/backend deploy --prod /app # ---- dev: hot-reload for local development (used by docker-compose.override.yml) ---- # Inherits the full workspace + dev deps (tsx) from the build stage. Source is # bind-mounted over this at runtime so edits reload live. FROM build AS dev WORKDIR /repo/packages/backend EXPOSE 4000 CMD ["pnpm", "dev"] # ---- runtime: slim, non-root ---- FROM base AS runtime ENV NODE_ENV=production WORKDIR /app COPY --from=build --chown=node:node /app /app USER node EXPOSE 4000 HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD wget -qO- "http://127.0.0.1:${BACKEND_PORT:-4000}/health" || exit 1 CMD ["node", "dist/server.js"]