11# =============================================================================
2- # STAGE 1: Dependencies - Install workspace dependencies
2+ # STAGE 1: Dependencies - Install only what the API needs
33# =============================================================================
44FROM oven/bun:1.2.8 AS deps
55
@@ -8,7 +8,16 @@ WORKDIR /app
88# Copy root workspace config
99COPY package.json bun.lock ./
1010
11- # Copy all workspace package.json files
11+ # Strip root package.json to only keep workspaces config.
12+ # The root has frontend deps (design-system, react-dnd, sharp, semantic-release, etc.)
13+ # that the API doesn't need. Removing them cuts ~800 packages from the install.
14+ RUN cat package.json | bun -e " \
15+ const pkg = JSON.parse(await Bun.stdin.text()); \
16+ delete pkg.dependencies; delete pkg.devDependencies; delete pkg.scripts; \
17+ console.log(JSON.stringify(pkg, null, 2));" > package.min.json \
18+ && mv package.min.json package.json
19+
20+ # Copy only the workspace package.json files the API depends on
1221COPY packages/auth/package.json ./packages/auth/
1322COPY packages/db/package.json ./packages/db/
1423COPY packages/utils/package.json ./packages/utils/
@@ -20,16 +29,23 @@ COPY packages/company/package.json ./packages/company/
2029# Copy API package.json
2130COPY apps/api/package.json ./apps/api/
2231
23- # Install all dependencies (including workspace deps )
24- RUN bun install
32+ # Install dependencies — skip lifecycle scripts (husky, etc. not needed in Docker )
33+ RUN bun install --ignore-scripts
2534
2635# =============================================================================
2736# STAGE 2: Builder - Build workspace packages and NestJS app
2837# =============================================================================
29- FROM deps AS builder
38+ FROM oven/bun:1.2.8 AS builder
3039
3140WORKDIR /app
3241
42+ # Copy node_modules first (from deps stage), then source on top.
43+ # This avoids conflicts between workspace symlinks and local node_modules
44+ # that get included from the build context.
45+ COPY --from=deps /app/node_modules ./node_modules
46+ COPY --from=deps /app/package.json ./package.json
47+ COPY --from=deps /app/bun.lock ./bun.lock
48+
3349# Copy workspace packages source
3450COPY packages/auth ./packages/auth
3551COPY packages/db ./packages/db
@@ -42,66 +58,59 @@ COPY packages/company ./packages/company
4258# Copy API source
4359COPY apps/api ./apps/api
4460
45- # Bring in node_modules from deps stage
46- COPY --from=deps /app/node_modules ./node_modules
47-
48- # Build workspace packages
49- RUN cd packages/auth && bun run build && cd ../..
50- RUN cd packages/db && bun run build && cd ../..
51- RUN cd packages/integration-platform && bun run build && cd ../..
52- RUN cd packages/email && bun run build && cd ../..
53- RUN cd packages/company && bun run build && cd ../..
61+ # Build db first — generates Prisma client needed by other packages
62+ RUN cd packages/db && bun run build
5463
55- # Generate Prisma client for API (copy schema and generate)
56- RUN cd packages/db && node scripts/combine-schemas.js && cd ../..
57- RUN cp packages/db/dist/schema.prisma apps/api/prisma/schema.prisma
58- RUN cd apps/api && bunx prisma generate
64+ # Build remaining workspace packages
65+ RUN cd packages/auth && bun run build \
66+ && cd ../integration-platform && bun run build \
67+ && cd ../email && bun run build \
68+ && cd ../company && bun run build
5969
60- # Build NestJS application (skip prebuild since we already generated Prisma)
61- RUN cd apps/api && bunx nest build
70+ # Generate Prisma schema for API and build NestJS app
71+ RUN cd packages/db && node scripts/combine-schemas.js \
72+ && cp /app/packages/db/dist/schema.prisma /app/apps/api/prisma/schema.prisma \
73+ && cd /app/apps/api && bunx prisma generate && bunx nest build
6274
6375# =============================================================================
6476# STAGE 3: Production Runtime
6577# =============================================================================
6678FROM node:20-slim AS production
6779
80+ # Create non-root user before copying files so COPY --chown can use it
81+ RUN groupadd --system nestjs && useradd --system --gid nestjs --create-home nestjs
82+
6883WORKDIR /app
84+ RUN chown nestjs:nestjs /app
6985
7086# Install runtime dependencies
7187RUN apt-get update && apt-get install -y --no-install-recommends wget openssl && rm -rf /var/lib/apt/lists/*
7288
7389# Copy built NestJS app
74- COPY --from=builder /app/apps/api/dist ./dist
90+ COPY --from=builder --chown=nestjs:nestjs /app/apps/api/dist ./dist
7591
76- # Copy prisma files
77- COPY --from=builder /app/apps/api/prisma ./prisma
92+ # Copy prisma schema (for reference only — client is already generated in node_modules)
93+ COPY --from=builder --chown=nestjs:nestjs /app/apps/api/prisma ./prisma
7894
7995# Copy package.json (for any runtime needs)
80- COPY --from=builder /app/apps/api/package.json ./package.json
96+ COPY --from=builder --chown=nestjs:nestjs /app/apps/api/package.json ./package.json
8197
8298# Copy workspace packages that are referenced by node_modules symlinks
83- COPY --from=builder /app/packages/auth ./packages/auth
84- COPY --from=builder /app/packages/db ./packages/db
85- COPY --from=builder /app/packages/utils ./packages/utils
86- COPY --from=builder /app/packages/integration-platform ./packages/integration-platform
87- COPY --from=builder /app/packages/tsconfig ./packages/tsconfig
88- COPY --from=builder /app/packages/email ./packages/email
89- COPY --from=builder /app/packages/company ./packages/company
99+ COPY --from=builder --chown=nestjs:nestjs /app/packages/auth ./packages/auth
100+ COPY --from=builder --chown=nestjs:nestjs /app/packages/db ./packages/db
101+ COPY --from=builder --chown=nestjs:nestjs /app/packages/utils ./packages/utils
102+ COPY --from=builder --chown=nestjs:nestjs /app/packages/integration-platform ./packages/integration-platform
103+ COPY --from=builder --chown=nestjs:nestjs /app/packages/tsconfig ./packages/tsconfig
104+ COPY --from=builder --chown=nestjs:nestjs /app/packages/email ./packages/email
105+ COPY --from=builder --chown=nestjs:nestjs /app/packages/company ./packages/company
90106
91- # Copy production node_modules (includes symlinks to workspace packages above )
92- COPY --from=builder /app/node_modules ./node_modules
107+ # Copy production node_modules (includes Prisma client already generated for linux/amd64 )
108+ COPY --from=builder --chown=nestjs:nestjs /app/node_modules ./node_modules
93109
94110# Set production environment
95111ENV NODE_ENV=production
96112ENV PORT=3333
97113
98- # Regenerate Prisma client for this runtime environment
99- RUN npx prisma generate --schema=./prisma/schema.prisma
100-
101- # Create non-root user
102- RUN groupadd --system nestjs && useradd --system --gid nestjs nestjs \
103- && chown -R nestjs:nestjs /app
104-
105114USER nestjs
106115
107116EXPOSE 3333
0 commit comments