|
1 | 1 | # syntax=docker/dockerfile:1.6 |
2 | | -# This Dockerfile runs the realtime service. |
3 | | -# It uses the same pattern as the working migrate container. |
4 | | -FROM node:22.17.0-alpine |
| 2 | +# Multi-stage build for the realtime Socket.IO service |
5 | 3 |
|
6 | | -# Set working directory |
| 4 | +# Stage 1: Install dependencies and build |
| 5 | +FROM node:22.17.0-alpine AS builder |
7 | 6 | WORKDIR /app |
8 | 7 |
|
9 | | -# Install basic tools and configure npm |
10 | | -RUN apk add --no-cache git && \ |
11 | | - npm config set fetch-timeout 300000 && \ |
12 | | - npm config set fetch-retry-maxtimeout 120000 && \ |
13 | | - npm config set fetch-retry-mintimeout 10000 |
14 | | - |
15 | | -# Enable corepack and prepare specific pnpm version |
16 | 8 | RUN corepack enable && \ |
17 | 9 | (corepack prepare pnpm@10.13.1 --activate || corepack prepare pnpm@10.13.1 --activate || corepack prepare pnpm@10.13.1 --activate) |
18 | 10 |
|
19 | | -# Copy package files first for better Docker layer caching |
20 | 11 | COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ |
21 | 12 | COPY packages/db/package.json ./packages/db/ |
22 | 13 | COPY packages/lib/package.json ./packages/lib/ |
23 | 14 | COPY apps/web/package.json ./apps/web/ |
24 | 15 | COPY apps/realtime/package.json ./apps/realtime/ |
25 | 16 |
|
26 | | -# Install ALL dependencies for the entire monorepo |
27 | 17 | RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm config set store-dir /pnpm/store && pnpm install --frozen-lockfile --prod=false |
28 | 18 |
|
29 | | -# Copy only the source code needed (avoid copying node_modules) |
30 | | -COPY packages ./packages |
31 | | -COPY apps ./apps |
| 19 | +COPY types ./types |
| 20 | +COPY packages/db ./packages/db |
| 21 | +COPY packages/lib ./packages/lib |
| 22 | +COPY apps/realtime ./apps/realtime |
32 | 23 | COPY tsconfig.json ./ |
33 | 24 |
|
34 | | -# Copy .env file for environment variables |
35 | | -COPY .env ./ |
| 25 | +# Build shared packages and the realtime service |
| 26 | +RUN pnpm --filter @pagespace/db build && \ |
| 27 | + pnpm --filter @pagespace/lib build && \ |
| 28 | + pnpm --filter realtime build |
| 29 | + |
| 30 | +# Stage 2: Production runner |
| 31 | +FROM node:22.17.0-alpine AS runner |
| 32 | +WORKDIR /app |
| 33 | + |
| 34 | +RUN corepack enable && \ |
| 35 | + (corepack prepare pnpm@10.13.1 --activate || corepack prepare pnpm@10.13.1 --activate || corepack prepare pnpm@10.13.1 --activate) |
| 36 | + |
| 37 | +# Copy manifests and lockfile for production install |
| 38 | +COPY --from=builder /app/package.json /app/pnpm-lock.yaml /app/pnpm-workspace.yaml ./ |
| 39 | +COPY --from=builder /app/packages/db/package.json ./packages/db/ |
| 40 | +COPY --from=builder /app/packages/lib/package.json ./packages/lib/ |
| 41 | +COPY --from=builder /app/apps/web/package.json ./apps/web/ |
| 42 | +COPY --from=builder /app/apps/realtime/package.json ./apps/realtime/ |
| 43 | + |
| 44 | +# Install production-only dependencies |
| 45 | +RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm config set store-dir /pnpm/store && pnpm install --frozen-lockfile --prod |
| 46 | + |
| 47 | +# Copy only compiled runtime artifacts from builder |
| 48 | +COPY --from=builder /app/packages/db/dist ./packages/db/dist |
| 49 | +COPY --from=builder /app/packages/lib/dist ./packages/lib/dist |
| 50 | +COPY --from=builder /app/apps/realtime/dist ./apps/realtime/dist |
| 51 | + |
| 52 | +ENV NODE_ENV=production |
| 53 | + |
| 54 | +USER node |
36 | 55 |
|
37 | 56 | EXPOSE 3001 |
38 | 57 |
|
39 | | -# Run the realtime service with tsx |
40 | | -CMD ["pnpm", "--filter", "realtime", "start"] |
| 58 | +CMD ["node", "apps/realtime/dist/index.js"] |
0 commit comments