70 lines
1.7 KiB
Docker
70 lines
1.7 KiB
Docker
# Build stage
|
|
FROM node:22-alpine AS builder
|
|
|
|
WORKDIR /app
|
|
|
|
# Dependencies o'rnatish
|
|
COPY package*.json ./
|
|
RUN npm install --force
|
|
|
|
# Kodlarni nusxalash va build qilish
|
|
COPY . .
|
|
|
|
# Environment variables (agar kerak bo'lsa)
|
|
ENV NEXT_TELEMETRY_DISABLED=1
|
|
|
|
# Next.js static export
|
|
RUN npm run build
|
|
|
|
# Production stage - Nginx
|
|
FROM nginx:alpine
|
|
|
|
# Default html tozalaymiz
|
|
RUN rm -rf /usr/share/nginx/html/*
|
|
|
|
# ❗ MUHIM: Next.js static export - out papka
|
|
COPY --from=builder /app/out /usr/share/nginx/html
|
|
|
|
# Default nginx configni o'chiramiz
|
|
RUN rm /etc/nginx/conf.d/default.conf
|
|
|
|
# nginx.conf ni bevosita Dockerfile ichida yozamiz
|
|
RUN printf '%s\n' \
|
|
'server {' \
|
|
' listen 80;' \
|
|
' server_name _;' \
|
|
'' \
|
|
' root /usr/share/nginx/html;' \
|
|
' index index.html;' \
|
|
'' \
|
|
' # Gzip compression' \
|
|
' gzip on;' \
|
|
' gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;' \
|
|
'' \
|
|
' # Cache static assets' \
|
|
' location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {' \
|
|
' expires 1y;' \
|
|
' add_header Cache-Control "public, immutable";' \
|
|
' }' \
|
|
'' \
|
|
' # Next.js _next static files' \
|
|
' location /_next/static/ {' \
|
|
' expires 1y;' \
|
|
' add_header Cache-Control "public, immutable";' \
|
|
' }' \
|
|
'' \
|
|
' # SPA routing - barcha requestlarni index.html ga yo'\''naltirish' \
|
|
' location / {' \
|
|
' try_files $uri $uri/ $uri.html /index.html;' \
|
|
' }' \
|
|
'' \
|
|
' # Security headers' \
|
|
' add_header X-Frame-Options "SAMEORIGIN" always;' \
|
|
' add_header X-Content-Type-Options "nosniff" always;' \
|
|
' add_header X-XSS-Protection "1; mode=block" always;' \
|
|
'}' \
|
|
> /etc/nginx/conf.d/default.conf
|
|
|
|
EXPOSE 80
|
|
|
|
CMD ["nginx", "-g", "daemon off;"] |