chore: переход на static export + nginx для деплоя

Конфигурация совместима с Gitea CI/CD инфраструктурой:
- Static export вместо standalone Node.js
- Nginx для раздачи статики
- Docker multi-stage build

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Денис Шкабатур
2026-02-11 13:06:56 +03:00
parent 72e07dad3d
commit fa9de0d94d
4 changed files with 34 additions and 49 deletions

View File

@@ -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

View File

@@ -2,7 +2,5 @@ services:
grib:
build: .
ports:
- "3000:3000"
- "3080:80"
restart: unless-stopped
environment:
- NODE_ENV=production

24
docker/nginx.conf Normal file
View File

@@ -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;
}

View File

@@ -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;