diff --git a/.env b/.env index 754484d..51d4bfb 100644 --- a/.env +++ b/.env @@ -5,4 +5,6 @@ NODE_ENV=production DB_URI=mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@mongodb:27017/Infinity?authSource=admin NEXT_PUBLIC_API_URL=http://localhost:3000 ADMIN_USERNAME=admin -ADMIN_PASSWORD=your_secure_admin_password \ No newline at end of file +ADMIN_PASSWORD=your_secure_admin_password + +NEXT_TELEMETRY_DISABLED=1 \ No newline at end of file diff --git a/webapp/Dockerfile b/webapp/Dockerfile index 0aa7b76..127b894 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,55 +1,52 @@ -# Install dependencies only when needed +# Stage 1: Build the application FROM node:18-alpine AS deps +RUN apk add --no-cache libc6-compat WORKDIR /app + +# Install dependencies COPY webapp/package.json webapp/package-lock.json ./ RUN npm ci -# Rebuild the source code only when needed -FROM node:18-alpine AS builder -WORKDIR /app -COPY --from=deps /app/node_modules ./node_modules -COPY webapp . +# Copy the rest of the application +COPY webapp/ . -# Set build-time environment variables with defaults +# Set environment variables for build ARG DB_URI -ENV DB_URI=$DB_URI +ENV DB_URI=${DB_URI:-"mongodb://dummy:password@localhost:27017/dummy"} +ENV NODE_ENV=production -# Next.js collects completely anonymous telemetry data about general usage. -ENV NEXT_TELEMETRY_DISABLED 1 +# Build the application +RUN npm run build -# Disable Next.js static optimization during build -ENV NEXT_TELEMETRY_DISABLED 1 -ENV NEXT_SHARP_PATH /tmp/node_modules/sharp - -# If DB_URI is not set, use a dummy value for build -RUN if [ -z "$DB_URI" ]; then \ - echo "DB_URI not set, using dummy value for build"; \ - export DB_URI="mongodb://dummy:password@localhost:27017/dummy"; \ - fi && \ - npm run build - -# Production image, copy all the files and run next +# Stage 2: Create the runner image FROM node:18-alpine AS runner WORKDIR /app -ENV NODE_ENV production -ENV NEXT_TELEMETRY_DISABLED 1 +# Install dependencies only needed for production +RUN apk add --no-cache dumb-init +# Create a non-root user RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs -COPY --from=builder /app/public ./public +# Copy the built application from the builder stage +COPY --from=deps /app/public ./public # Automatically leverage output traces to reduce image size -COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +COPY --from=deps --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=deps --chown=nextjs:nodejs /app/.next/static ./.next/static +# Set the user to non-root USER nextjs +# Expose the port the app runs on EXPOSE 3000 +# Set the environment variable for the port ENV PORT 3000 -ENV HOSTNAME "0.0.0.0" -# Use the runtime environment variables +# Use dumb-init to handle signals properly +ENTRYPOINT ["/usr/bin/dumb-init", "--"] + +# Start the application CMD ["node", "server.js"] diff --git a/webapp/next.config.js b/webapp/next.config.js index 0a84c38..92ce88a 100644 --- a/webapp/next.config.js +++ b/webapp/next.config.js @@ -3,6 +3,14 @@ const nextConfig = { typescript: { ignoreBuildErrors: true, }, + output: 'standalone', + experimental: { + // This is needed for Docker builds + outputFileTracingRoot: process.env.NODE_ENV === 'production' ? '../' : undefined, + // Disable server-side rendering for API routes during build + // to prevent database connection attempts + serverComponentsExternalPackages: ['mongoose'], + }, async redirects() { return [ { // we redirect '/' to '/dashboard @@ -12,6 +20,10 @@ const nextConfig = { }, ] }, + // Skip type checking during build + eslint: { + ignoreDuringBuilds: true, + }, } module.exports = nextConfig