Files

84 lines
2.4 KiB
Docker
Raw Permalink Normal View History

# --- Stage 1: Dependencies ---
FROM node:22-alpine AS deps
RUN apk add --no-cache openssl python3 make g++
RUN corepack enable && corepack prepare pnpm@10.32.0 --activate
WORKDIR /app
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
COPY packages/api/package.json packages/api/
COPY packages/shared/package.json packages/shared/
COPY packages/web/package.json packages/web/
RUN pnpm install --frozen-lockfile
# --- Stage 2: Build API ---
FROM deps AS api-builder
WORKDIR /app
COPY tsconfig.base.json ./
COPY packages/shared/ packages/shared/
RUN pnpm --filter @davinci/shared build
COPY packages/api/tsconfig.json packages/api/tsconfig.build.json packages/api/nest-cli.json packages/api/prisma.config.ts packages/api/
COPY packages/api/prisma/ packages/api/prisma/
COPY packages/api/src/ packages/api/src/
RUN pnpm --filter @davinci/api prisma:generate
RUN pnpm --filter @davinci/api build
# --- Stage 3: Build Web ---
FROM deps AS web-builder
WORKDIR /app
COPY tsconfig.base.json ./
COPY packages/shared/ packages/shared/
RUN pnpm --filter @davinci/shared build
COPY packages/web/ packages/web/
RUN pnpm --filter @davinci/web build
# --- Stage 4: Runner ---
FROM node:22-alpine AS runner
RUN apk add --no-cache openssl nginx
WORKDIR /app
ENV NODE_ENV=production
# Non-root user
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 appuser
# Copy nginx config
COPY nginx.conf /etc/nginx/http.d/default.conf
# Copy API build
COPY --from=api-builder /app/packages/api/dist packages/api/dist
COPY --from=api-builder /app/packages/api/prisma packages/api/prisma
COPY --from=api-builder /app/packages/api/node_modules packages/api/node_modules
COPY --from=api-builder /app/packages/api/package.json packages/api/
COPY --from=api-builder /app/node_modules ./node_modules
COPY --from=api-builder /app/package.json ./
# Copy Web standalone build
COPY --from=web-builder /app/packages/web/.next/standalone packages/web/standalone
COPY --from=web-builder /app/packages/web/.next/static packages/web/standalone/packages/web/.next/static
COPY --from=web-builder /app/packages/web/public packages/web/standalone/packages/web/public
# Copy entrypoint
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh
# nginx needs write access to certain dirs
RUN mkdir -p /run/nginx && chown -R appuser:nodejs /run/nginx
RUN chown -R appuser:nodejs /var/log/nginx /var/lib/nginx
EXPOSE 80
USER appuser
ENTRYPOINT ["/app/entrypoint.sh"]