espace-paie-odentas/next.config.mjs
odentas ccc0f34b03 feat: Add Docker support for Coolify deployment
- Add Dockerfile with multi-stage build
- Add .dockerignore for optimized builds
- Enable standalone output in next.config.mjs
- Optimized for production deployment
2025-12-27 14:13:13 +01:00

141 lines
4.1 KiB
JavaScript

/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
// Mode standalone pour Docker/Coolify
output: 'standalone',
experimental: {
missingSuspenseWithCSRBailout: false
},
// Ignorer les warnings ESLint durant le build
eslint: {
ignoreDuringBuilds: true,
},
// 🔒 SÉCURITÉ : Headers de sécurité avec CSP en mode Report-Only
async headers() {
return [
{
source: '/:path*',
headers: [
{
key: 'Content-Security-Policy-Report-Only',
value: [
// Scripts JavaScript
"default-src 'self'",
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://eu-assets.i.posthog.com https://eu.i.posthog.com",
// Styles CSS
"style-src 'self' 'unsafe-inline'",
// Images
"img-src 'self' data: blob: https: https://*.s3.eu-west-3.amazonaws.com",
// Fonts
"font-src 'self' data:",
// Connexions réseau (API, WebSocket, etc.)
"connect-src 'self' " +
"https://eu.i.posthog.com " +
"https://eu-assets.i.posthog.com " +
"https://*.supabase.co " +
"wss://*.supabase.co " +
"https://*.s3.eu-west-3.amazonaws.com " +
"https://*.lambda-url.eu-west-3.on.aws " +
"https://api.pdfmonkey.io " +
"https://api.docuseal.com " +
"https://api.docuseal.eu",
// Frames (iframes)
"frame-ancestors 'none'",
"frame-src 'self' blob:",
// Base URI
"base-uri 'self'",
// Formulaires
"form-action 'self'",
// Media
"media-src 'self' blob:",
// Workers
"worker-src 'self' blob:",
// Objects (Flash, Java, etc.)
"object-src 'none'",
// Rapport des violations
"report-uri /api/csp-report",
// Forcer HTTPS
"upgrade-insecure-requests"
].join('; ')
},
{
key: 'X-Frame-Options',
value: 'SAMEORIGIN'
},
{
key: 'X-Content-Type-Options',
value: 'nosniff'
},
{
key: 'Referrer-Policy',
value: 'strict-origin-when-cross-origin'
},
{
key: 'Permissions-Policy',
value: 'geolocation=(), microphone=(), camera=(), payment=()'
},
{
key: 'X-XSS-Protection',
value: '1; mode=block'
}
]
}
]
},
// Configuration pour optimiser les chunks et éviter les erreurs de modules Supabase
webpack: (config, { dev, isServer }) => {
if (!isServer) {
// Ignorer le module 'canvas' côté client (optionnel pour pdfjs-dist)
config.resolve.fallback = {
...config.resolve.fallback,
canvas: false,
};
// Optimiser les chunks pour éviter les problèmes avec Supabase
config.optimization.splitChunks = {
...config.optimization.splitChunks,
cacheGroups: {
...config.optimization.splitChunks.cacheGroups,
supabase: {
test: /[\\/]node_modules[\\/]@supabase[\\/]/,
name: 'supabase',
chunks: 'all',
priority: 30,
},
},
};
}
return config;
},
// Rewrites pour proxier les requêtes PostHog
async rewrites() {
return [
{
source: '/ingest/static/:path*',
destination: 'https://eu-assets.i.posthog.com/static/:path*',
},
{
source: '/ingest/:path*',
destination: 'https://eu.i.posthog.com/:path*',
},
];
},
// Nécessaire pour supporter les requêtes API PostHog avec slash final
skipTrailingSlashRedirect: true,
};
export default nextConfig;