diff --git a/Dockerfile b/Dockerfile index a8f0762..c452598 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,44 +1,11 @@ -FROM node:20-alpine AS base - -# Install dependencies only when needed -FROM base AS deps +FROM node:22-alpine AS build WORKDIR /app - COPY package.json package-lock.json ./ -RUN npm ci --only=production - -# Rebuild the source code only when needed -FROM base AS builder -WORKDIR /app -COPY --from=deps /app/node_modules ./node_modules +RUN npm ci COPY . . - RUN npm run build -# Production image, copy all the files and run next -FROM base AS runner -WORKDIR /app - -ENV NODE_ENV=production - -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs - -COPY --from=builder /app/public ./public - -# Set the correct permission for prerender cache -RUN mkdir .next -RUN chown nextjs:nodejs .next - -# 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 - -USER nextjs - -EXPOSE 3000 - -ENV PORT=3000 -ENV HOSTNAME="0.0.0.0" - -CMD ["node", "server.js"] +FROM nginx:alpine +COPY docker/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /app/out /usr/share/nginx/html +EXPOSE 80 diff --git a/docker-compose.yml b/docker-compose.yml index 937f9d4..765033a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,5 @@ services: grib: build: . ports: - - "3000:3000" + - "3080:80" restart: unless-stopped - environment: - - NODE_ENV=production diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 0000000..75670a8 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,24 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # SPA fallback — all routes to index.html + location / { + try_files $uri $uri/ /index.html; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # Gzip + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; +} diff --git a/next.config.ts b/next.config.ts index ce28622..e9daf20 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,15 +1,11 @@ import type { NextConfig } from 'next'; const nextConfig: NextConfig = { - output: 'standalone', + output: 'export', images: { - remotePatterns: [ - { - protocol: 'https', - hostname: 'images.unsplash.com', - }, - ], + unoptimized: true, }, + trailingSlash: true, }; export default nextConfig;