import type { NextConfig } from "next"; const nextConfig: NextConfig = { // Verhindert den "X-Powered-By: Next.js"-Response-Header — verrimt keinen // funktionalen Vorteil, gibt Angreifern aber unnoetig Framework-Fingerprinting. poweredByHeader: false, // "standalone" buendelt eine minimale Node-Laufzeit inkl. Dependencies, // wodurch das Docker-Image (siehe Dockerfile) deutlich kleiner bleibt. output: "standalone", // Pakete, die zur Laufzeit eigene Dateien ueber einen __dirname-relativen // Pfad nachladen. Werden sie vom Bundler (Turbopack/Webpack) mitgebuendelt, // zeigt ihr __dirname auf einen virtuellen Bundle-Pfad ("/ROOT/...") statt // auf das echte Verzeichnis in node_modules — der Zugriff schlaegt dann mit // ENOENT fehl. "serverExternalPackages" laesst Next.js sie stattdessen ganz // normal per require() aus node_modules laden. // // - pdfkit: laedt seine Schriftart-Metadaten (.afm-Dateien). // - ffmpeg-static: exportiert den Pfad zur mitgelieferten ffmpeg-Binary // (siehe lib/video-transcode.ts). Gebuendelt lieferte es // "\ROOT\node_modules\...\ffmpeg.exe" -> jeder Video-Upload ohne // System-ffmpeg im PATH (also jede lokale Entwicklungsumgebung unter // Windows/macOS) scheiterte mit "Das Video konnte nicht verarbeitet // werden." serverExternalPackages: ["pdfkit", "ffmpeg-static"], // Turbopacks Dateisystem-Caches (.next/dev/cache & .next/cache/turbopack) // kollidieren in diesem OneDrive-synchronisierten Arbeitsverzeichnis // wiederholt mit der Cloud-Synchronisierung ("Failed to open database" / // mmap-Timeout bei next dev, "Failed to compact database" beim // next-build-Shutdown). Beide Caches werden daher deaktiviert. experimental: { turbopackFileSystemCacheForDev: false, turbopackFileSystemCacheForBuild: false, }, async headers() { // Content-Security-Policy wird bewusst NICHT hier gesetzt: sie braucht // eine pro Request neue Nonce (siehe proxy.ts), was ein statischer // headers()-Eintrag hier nicht kann. return [ { source: "/(.*)", headers: [ { key: "X-Content-Type-Options", value: "nosniff" }, { key: "X-Frame-Options", value: "DENY" }, { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=(), payment=(self)" }, // Wirkt nur ueber HTTPS; im lokalen HTTP-Betrieb ignoriert der Browser den Header. { key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains" }, ], }, ]; }, }; export default nextConfig;