# apps/backend/Dockerfile FROM node:24-alpine AS base RUN npm install -g pnpm@8 FROM base AS dependencies WORKDIR /app # Copy workspace configuration COPY pnpm-workspace.yaml package.json ./ COPY apps/backend/package.json ./apps/backend/ COPY packages/shared/package.json ./packages/shared/ # Install dependencies RUN pnpm install --frozen-lockfile FROM base AS build WORKDIR /app COPY --from=dependencies /app/node_modules ./node_modules COPY --from=dependencies /app/apps/backend/node_modules ./apps/backend/node_modules COPY --from=dependencies /app/packages/shared/node_modules ./packages/shared/node_modules # Copy source code COPY packages/shared ./packages/shared COPY apps/backend ./apps/backend COPY prisma ./prisma # Build shared packages first RUN pnpm --filter @dreamchat/shared build # Generate Prisma client RUN pnpm db:generate # Build backend RUN pnpm --filter @dreamchat/backend build FROM base AS production WORKDIR /app # Copy only production dependencies COPY --from=dependencies /app/node_modules ./node_modules COPY --from=dependencies /app/apps/backend/node_modules ./apps/backend/node_modules COPY --from=build /app/apps/backend/dist ./dist COPY --from=build /app/packages/shared/dist ./node_modules/@dreamchat/shared/dist COPY --from=build /app/node_modules/.pnpm/@prisma+client* ./node_modules/.pnpm/ COPY --from=build /app/node_modules/@prisma ./node_modules/@prisma # Create logs directory RUN mkdir -p /app/logs # Non-root user RUN addgroup -g 1001 -S nodejs RUN adduser -S nodejs -u 1001 USER nodejs EXPOSE 3000 CMD ["node", "dist/main.js"]