# ============================================= # Stage 1: Dependencies # ============================================= FROM node:20-slim AS deps RUN corepack enable && corepack prepare pnpm@9.12.0 --activate # Install OpenSSL for Prisma RUN apt-get update && apt-get install -y openssl ca-certificates && rm -rf /var/lib/apt/lists/* 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-slim AS builder RUN corepack enable && corepack prepare pnpm@9.12.0 --activate # Install OpenSSL for Prisma RUN apt-get update && apt-get install -y openssl ca-certificates && rm -rf /var/lib/apt/lists/* 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 for Alpine Linux RUN pnpm --filter @innungsapp/shared prisma:generate # Build the admin app ENV NEXT_TELEMETRY_DISABLED=1 ENV DOCKER_BUILD=1 RUN pnpm --filter @innungsapp/admin build # ============================================= # Stage 3: Production Runner # ============================================= FROM node:20-slim AS runner RUN corepack enable && corepack prepare pnpm@9.12.0 --activate # Install OpenSSL for Prisma RUN apt-get update && apt-get install -y openssl ca-certificates wget && rm -rf /var/lib/apt/lists/* 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 (standalone includes all necessary node_modules) 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 Prisma Engine binaries directly to .next/server (where Next.js looks for them) COPY --from=builder /app/node_modules/.pnpm/@prisma+client@5.22.0_prisma@5.22.0/node_modules/.prisma/client/libquery_engine-debian-openssl-3.0.x.so.node /app/apps/admin/.next/server/ COPY --from=builder /app/node_modules/.pnpm/@prisma+client@5.22.0_prisma@5.22.0/node_modules/.prisma/client/schema.prisma /app/apps/admin/.next/server/ # Install Prisma CLI globally for runtime migrations RUN npm install -g prisma@5.22.0 # 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"]