1- # syntax=docker/dockerfile:1.7
21FROM node:22-alpine AS base
32
4- # Setup pnpm package manager with corepack and configure global bin directory for caching
3+ WORKDIR /app
4+ 
5+ ENV TURBO_TELEMETRY_DISABLED=1
56ENV PNPM_HOME="/pnpm"
67ENV PATH="$PNPM_HOME:$PATH"
7- RUN corepack enable
8+ ENV CI=1
9+ 
10+ RUN corepack enable pnpm
11+ 
12+ # =========================================================================== #
813
9- # *****************************************************************************
10- # STAGE 1: Build the project
11- # *****************************************************************************
1214FROM base AS builder
13- RUN apk add --no-cache libc6-compat
14- WORKDIR /app
1515
16- ARG TURBO_VERSION= 2.5.6 
17- RUN corepack enable pnpm && pnpm add -g turbo@${TURBO_VERSION} 
16+ RUN pnpm add -g turbo@ 2.5.8 
17+ 
1818COPY . .
1919
20+ # Create a pruned workspace for just the admin app
2021RUN turbo prune --scope=admin --docker
2122
22- # *****************************************************************************
23- # STAGE 2: Install dependencies & build the project
24- # *****************************************************************************
25- FROM base AS installer
26- 
27- RUN apk add --no-cache libc6-compat
28- WORKDIR /app
23+ # =========================================================================== #
2924
30- COPY .gitignore .gitignore
31- COPY --from=builder /app/out/json/ .
32- COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
33- RUN corepack enable pnpm
34- RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm fetch --store-dir=/pnpm/store
25+ FROM base AS installer
3526
36- COPY --from=builder /app/out/full/ .
37- COPY turbo.json turbo.json
38- RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm install --offline --frozen-lockfile --store-dir=/pnpm/store
27+ # Build in production mode; we still install dev deps explicitly below
28+ ENV NODE_ENV=production
3929
30+ # Public envs required at build time (pick up via process.env)
4031ARG NEXT_PUBLIC_API_BASE_URL=""
4132ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL
33+ ARG NEXT_PUBLIC_API_BASE_PATH="/api"
34+ ENV NEXT_PUBLIC_API_BASE_PATH=$NEXT_PUBLIC_API_BASE_PATH
4235
4336ARG NEXT_PUBLIC_ADMIN_BASE_URL=""
4437ENV NEXT_PUBLIC_ADMIN_BASE_URL=$NEXT_PUBLIC_ADMIN_BASE_URL
45- 
4638ARG NEXT_PUBLIC_ADMIN_BASE_PATH="/god-mode"
4739ENV NEXT_PUBLIC_ADMIN_BASE_PATH=$NEXT_PUBLIC_ADMIN_BASE_PATH
4840
4941ARG NEXT_PUBLIC_SPACE_BASE_URL=""
5042ENV NEXT_PUBLIC_SPACE_BASE_URL=$NEXT_PUBLIC_SPACE_BASE_URL
51- 
5243ARG NEXT_PUBLIC_SPACE_BASE_PATH="/spaces"
5344ENV NEXT_PUBLIC_SPACE_BASE_PATH=$NEXT_PUBLIC_SPACE_BASE_PATH
5445
46+ ARG NEXT_PUBLIC_LIVE_BASE_URL=""
47+ ENV NEXT_PUBLIC_LIVE_BASE_URL=$NEXT_PUBLIC_LIVE_BASE_URL
48+ ARG NEXT_PUBLIC_LIVE_BASE_PATH="/live"
49+ ENV NEXT_PUBLIC_LIVE_BASE_PATH=$NEXT_PUBLIC_LIVE_BASE_PATH
50+ 
5551ARG NEXT_PUBLIC_WEB_BASE_URL=""
5652ENV NEXT_PUBLIC_WEB_BASE_URL=$NEXT_PUBLIC_WEB_BASE_URL
53+ ARG NEXT_PUBLIC_WEB_BASE_PATH=""
54+ ENV NEXT_PUBLIC_WEB_BASE_PATH=$NEXT_PUBLIC_WEB_BASE_PATH
5755
58- ENV NEXT_TELEMETRY_DISABLED=1 
59- ENV TURBO_TELEMETRY_DISABLED=1 
60- 
61- RUN pnpm turbo run build --filter=admin 
56+ ARG NEXT_PUBLIC_WEBSITE_URL="https://plane.so" 
57+ ENV NEXT_PUBLIC_WEBSITE_URL=$NEXT_PUBLIC_WEBSITE_URL 
58+ ARG NEXT_PUBLIC_SUPPORT_EMAIL="[email protected] " 59+ ENV NEXT_PUBLIC_SUPPORT_EMAIL=$NEXT_PUBLIC_SUPPORT_EMAIL 
6260
63- # *****************************************************************************
64- # STAGE 3: Copy the project and start it
65- # *****************************************************************************
66- FROM base AS runner
67- WORKDIR /app
68- 
69- # Don't run production as root
70- RUN addgroup --system --gid 1001 nodejs
71- RUN adduser --system --uid 1001 nextjs
72- USER nextjs
73- 
74- # Automatically leverage output traces to reduce image size
75- # https://nextjs.org/docs/advanced-features/output-file-tracing
76- COPY --from=installer /app/apps/admin/.next/standalone ./
77- COPY --from=installer /app/apps/admin/.next/static ./apps/admin/.next/static
78- COPY --from=installer /app/apps/admin/public ./apps/admin/public
79- 
80- ARG NEXT_PUBLIC_API_BASE_URL=""
81- ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL
82- 
83- ARG NEXT_PUBLIC_ADMIN_BASE_URL=""
84- ENV NEXT_PUBLIC_ADMIN_BASE_URL=$NEXT_PUBLIC_ADMIN_BASE_URL
61+ COPY .gitignore .gitignore
62+ COPY --from=builder /app/out/json/ .
63+ COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
8564
86- ARG NEXT_PUBLIC_ADMIN_BASE_PATH="/god-mode"
87- ENV NEXT_PUBLIC_ADMIN_BASE_PATH=$NEXT_PUBLIC_ADMIN_BASE_PATH
65+ # Fetch dependencies to cache store, then install offline with dev deps
66+ RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm fetch --store-dir=/pnpm/store
67+ COPY --from=builder /app/out/full/ .
68+ COPY turbo.json turbo.json
69+ RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm install --offline --frozen-lockfile --store-dir=/pnpm/store --prod=false
8870
89- ARG NEXT_PUBLIC_SPACE_BASE_URL="" 
90- ENV NEXT_PUBLIC_SPACE_BASE_URL=$NEXT_PUBLIC_SPACE_BASE_URL 
71+ # Build only the admin package 
72+ RUN pnpm turbo run build --filter=admin 
9173
92- ARG NEXT_PUBLIC_SPACE_BASE_PATH="/spaces"
93- ENV NEXT_PUBLIC_SPACE_BASE_PATH=$NEXT_PUBLIC_SPACE_BASE_PATH
74+ # =========================================================================== #
9475
95- ARG NEXT_PUBLIC_WEB_BASE_URL=""
96- ENV NEXT_PUBLIC_WEB_BASE_URL=$NEXT_PUBLIC_WEB_BASE_URL
76+ FROM nginx:1.27-alpine AS production
9777
98- ENV NEXT_TELEMETRY_DISABLED=1 
99- ENV TURBO_TELEMETRY_DISABLED=1 
78+ COPY apps/admin/nginx/nginx.conf /etc/nginx/nginx.conf 
79+ COPY --from=installer /app/apps/admin/build/client /usr/share/nginx/html 
10080
10181EXPOSE 3000
10282
103- CMD ["node", "apps/admin/server.js"]
83+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
84+   CMD curl -fsS http://127.0.0.1:3000/ >/dev/null || exit 1
85+ 
86+ CMD ["nginx", "-g", "daemon off;"]
0 commit comments