- Docker: Multi-stage Dockerfile with security hardening, docker-compose for production and development environments - Environment: Comprehensive .env.example with all config options, lib/config/env.ts for typed environment validation - Logging: Structured JSON logging with request/response middleware - Monitoring: Prometheus metrics endpoint, Grafana dashboard, health checks (liveness/readiness probes) - Security: Security headers, rate limiting, CORS middleware - CI/CD: GitHub Actions workflows for CI, production deploy, and preview deployments - Error tracking: Sentry integration foundation Files created: - Docker: Dockerfile, docker-compose.yml, docker-compose.dev.yml, .dockerignore - Config: lib/config/env.ts, lib/config/index.ts - Logging: lib/logging/logger.ts, lib/logging/middleware.ts - Monitoring: lib/monitoring/sentry.ts, lib/monitoring/metrics.ts, lib/monitoring/health.ts - Security: lib/security/headers.ts, lib/security/rateLimit.ts, lib/security/cors.ts - API: pages/api/health/*, pages/api/metrics.ts - Infra: infra/prometheus/prometheus.yml, infra/grafana/*
82 lines
2.4 KiB
Docker
82 lines
2.4 KiB
Docker
# 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"]
|