import type { NextConfig } from "next"; import dotenv from "dotenv"; import path from "path"; // Lade die .env Datei aus dem Arbeitsverzeichnis dotenv.config({ path: path.resolve(__dirname, '.env') }); const nextConfig: NextConfig = { // Enable standalone output for Docker output: 'standalone', outputFileTracingRoot: path.join(__dirname, '../../'), // Ensure proper server configuration serverRuntimeConfig: { // Will only be available on the server side }, // Optimize for production compress: true, poweredByHeader: false, // Disable ESLint during build for Docker eslint: { ignoreDuringBuilds: process.env.NODE_ENV === 'production', }, // Environment variables env: { NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL }, // Performance optimizations experimental: { optimizePackageImports: ['lucide-react', 'framer-motion'], }, // Image optimization images: { formats: ['image/webp', 'image/avif'], minimumCacheTTL: 60, }, // Dynamic routes are handled automatically by Next.js // Security and cache headers async headers() { return [ { source: '/(.*)', headers: [ { key: 'X-DNS-Prefetch-Control', value: 'on', }, { key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload', }, { key: 'X-Frame-Options', value: 'DENY', }, { key: 'X-Content-Type-Options', value: 'nosniff', }, { key: 'X-XSS-Protection', value: '1; mode=block', }, { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin', }, { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()', }, { key: 'Content-Security-Policy', value: "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://analytics.dk0.dev; script-src-elem 'self' 'unsafe-inline' https://analytics.dk0.dev; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://analytics.dk0.dev; frame-ancestors 'none'; base-uri 'self'; form-action 'self';", }, ], }, { source: '/api/(.*)', headers: [ { key: 'Cache-Control', value: 'no-store, no-cache, must-revalidate, proxy-revalidate', }, ], }, { source: '/_next/static/(.*)', headers: [ { key: 'Cache-Control', value: 'public, max-age=31536000, immutable', }, ], }, ]; }, }; import bundleAnalyzer from "@next/bundle-analyzer"; const withBundleAnalyzer = bundleAnalyzer({ enabled: process.env.ANALYZE === "true", }); module.exports = withBundleAnalyzer(nextConfig);