# ============================================= # Stage 1: Dependencies # ============================================= FROM node:20-alpine AS deps RUN corepack enable && corepack prepare pnpm@9.12.0 --activate WORKDIR /app # Copy workspace config files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./ COPY apps/admin/package.json ./apps/admin/ COPY packages/shared/package.json ./packages/shared/ # Install all dependencies RUN pnpm install --frozen-lockfile # ============================================= # Stage 2: Build # ============================================= FROM node:20-alpine AS builder RUN corepack enable && corepack prepare pnpm@9.12.0 --activate WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY --from=deps /app/apps/admin/node_modules ./apps/admin/node_modules COPY --from=deps /app/packages/shared/node_modules ./packages/shared/node_modules COPY . . # Generate Prisma client RUN pnpm --filter @innungsapp/shared prisma:generate # Build the admin app ENV NEXT_TELEMETRY_DISABLED=1 RUN pnpm --filter @innungsapp/admin build # ============================================= # Stage 3: Production Runner # ============================================= FROM node:20-alpine AS runner RUN corepack enable && corepack prepare pnpm@9.12.0 --activate WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Create non-root user RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 nextjs # Copy built output COPY --from=builder /app/apps/admin/.next/standalone ./ COPY --from=builder /app/apps/admin/.next/static ./apps/admin/.next/static COPY --from=builder /app/apps/admin/public ./apps/admin/public # Copy Prisma schema + migrations for runtime migrations COPY --from=builder /app/packages/shared/prisma ./packages/shared/prisma COPY --from=builder /app/node_modules/.pnpm ./node_modules/.pnpm COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma COPY --from=builder /app/node_modules/prisma ./node_modules/prisma COPY --from=builder /app/node_modules/.bin/prisma ./node_modules/.bin/prisma # Create uploads directory RUN mkdir -p /app/uploads && chown nextjs:nodejs /app/uploads # Create SQLite data directory RUN mkdir -p /app/data && chown nextjs:nodejs /app/data # Copy entrypoint COPY --from=builder /app/apps/admin/docker-entrypoint.sh ./docker-entrypoint.sh RUN chmod +x ./docker-entrypoint.sh USER nextjs EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" ENTRYPOINT ["./docker-entrypoint.sh"]