# Dockerfile for LocalGreenChain # Multi-stage production build with Bun runtime # Agent 4: Production Deployment # ============================================================================= # Stage 1: Dependencies # ============================================================================= FROM oven/bun:1 AS deps WORKDIR /app # Install dependencies only (better caching) COPY package.json bun.lockb* ./ RUN bun install --frozen-lockfile --production=false # ============================================================================= # Stage 2: Builder # ============================================================================= FROM oven/bun:1 AS builder WORKDIR /app # Copy dependencies from deps stage COPY --from=deps /app/node_modules ./node_modules COPY . . # Build arguments for build-time configuration ARG NEXT_PUBLIC_API_URL ARG NEXT_PUBLIC_SENTRY_DSN ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL ENV NEXT_PUBLIC_SENTRY_DSN=$NEXT_PUBLIC_SENTRY_DSN # Disable Next.js telemetry during build ENV NEXT_TELEMETRY_DISABLED=1 # Build Next.js application RUN bun run build # Remove development dependencies RUN bun install --frozen-lockfile --production # ============================================================================= # Stage 3: Production Runner # ============================================================================= FROM oven/bun:1-slim AS production WORKDIR /app # Create non-root user for security RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 nextjs # Copy necessary files from builder COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./package.json COPY --from=builder /app/next.config.js ./next.config.js # Copy Next.js build output with proper ownership COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static # Create data directory with proper permissions RUN mkdir -p /app/data && chown -R nextjs:nodejs /app/data # Set production environment ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV PORT=3001 ENV HOSTNAME="0.0.0.0" # Expose port EXPOSE 3001 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:3001/api/health || exit 1 # Switch to non-root user USER nextjs # Run the application CMD ["bun", "run", "start"]