FROM node:24-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build FROM nginxinc/nginx-unprivileged:1.29-alpine COPY --from=builder /app/build /usr/share/nginx/html RUN <<'EOF' cat > /etc/nginx/conf.d/default.conf server { listen 8080; server_name _; root /usr/share/nginx/html; index index.html; server_tokens off; location = /healthz { access_log off; default_type text/plain; return 200 "ok\n"; } location ~* \.(?:css|js|woff2|png|jpg|jpeg|gif|svg|webp|ico)$ { try_files $uri =404; expires 1y; add_header Cache-Control "public, max-age=31536000, immutable"; } location / { try_files $uri $uri/ /index.html; add_header Cache-Control "no-cache"; } } EOF EXPOSE 8080 HEALTHCHECK --interval=10s --timeout=3s --start-period=15s --retries=5 \ CMD wget -qO- http://127.0.0.1:8080/healthz || exit 1