Files
btpxpress-frontend/Dockerfile.prod
2025-10-13 05:29:32 +02:00

149 lines
3.6 KiB
Docker

# Multi-stage build pour BTP Xpress Client avec optimisations
FROM node:18-alpine AS deps
# Installer les dépendances système nécessaires
RUN apk add --no-cache libc6-compat
WORKDIR /app
# Copier les fichiers de dépendances
COPY package.json package-lock.json* ./
# Installer les dépendances
RUN npm ci --only=production && npm cache clean --force
# Builder stage
FROM node:18-alpine AS builder
WORKDIR /app
# Copier les dépendances depuis deps
COPY --from=deps /app/node_modules ./node_modules
# Copier le code source
COPY . .
# Variables d'environnement pour le build de production
ENV NEXT_TELEMETRY_DISABLED 1
ENV NODE_ENV production
# Construire l'application
RUN npm run build
# Image de production avec Nginx
FROM nginx:alpine AS runner
# Installer Node.js pour servir l'application Next.js
RUN apk add --no-cache nodejs npm curl
# Créer un utilisateur non-root
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001 -G nodejs
WORKDIR /app
# Copier les fichiers construits depuis le builder
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
# Configuration Nginx optimisée
COPY <<EOF /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Optimisations
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# Security headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
upstream nextjs {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name btpxpress.lions.dev;
# Static files
location /_next/static/ {
alias /app/.next/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
location /public/ {
alias /app/public/;
expires 1y;
add_header Cache-Control "public, immutable";
}
# Proxy to Next.js
location / {
proxy_pass http://nextjs;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_cache_bypass \$http_upgrade;
}
}
}
EOF
# Script de démarrage
COPY <<EOF /start.sh
#!/bin/sh
# Démarrer Next.js en arrière-plan
su nextjs -c "cd /app && node server.js" &
# Démarrer Nginx
nginx -g "daemon off;"
EOF
RUN chmod +x /start.sh
# Exposer le port
EXPOSE 80
# Variables d'environnement
ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME="127.0.0.1"
ENV NEXT_TELEMETRY_DISABLED=1
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD curl -f http://localhost/ || exit 1
# Commande de démarrage
CMD ["/start.sh"]