import type { NextConfig } from "next"; // Dockerfile builder katmanı BUILD_KAYNAK_KISITLI=1 verir: imaj build'i prod // VPS'te çalışan uygulamayla aynı makinede koştuğu için bellek/paralellik kısılır. // Lokal build ve dev bu kısıtlardan etkilenmez. const kaynakKisitli = process.env.BUILD_KAYNAK_KISITLI === "1"; const nextConfig: NextConfig = { // PPR: statik kabuk anında servis edilir, dinamik parçalar (UserNav vb.) // Suspense sınırlarının içinde akar. Bkz. docs/cacheComponents.md. cacheComponents: true, output: "standalone", // Server-only paketler bundle dışında tutulur: Turbopack bunları derlemez // (build belleği ciddi düşer), runtime'da native require ile yüklenir ve // standalone trace'i imaja kopyalar. @google/genai tek başına protobufjs + // google-auth-library + ws zincirini sürüklüyordu (c2aba25 sonrası VPS'te // build OOM'unun tetiği buydu). serverExternalPackages: [ "better-sqlite3", "iyzipay", "@libsql/client", "@google/genai", "@anthropic-ai/sdk", "resend", ], ...(kaynakKisitli ? { // cacheComponents açıkken prerender fazında source map üretimi varsayılan // açık; 1900+ statik sayfada ciddi bellek maliyeti var. enablePrerenderSourceMaps: false, experimental: { // Turbopack'ın Rust tarafı NODE_OPTIONS heap sınırını görmez; bellek // hedefi byte cinsinden ayrıca verilir (1.5 GB). turbopackMemoryLimit: 1_610_612_736, // Statik üretim: varsayılan 4 worker × 8 eşzamanlı sayfa yerine tek // worker × 4 sayfa. Her worker ayrı bir Node süreci/heap'idir. cpus: 1, staticGenerationMaxConcurrency: 4, }, } : {}), async redirects() { // Eski akış /sonuc modalına taşındı. /rapor/yazdir korunur (tam eşleşme). return [ { source: "/rapor", destination: "/sonuc", permanent: false }, { source: "/sohbet", destination: "/listem", permanent: false }, // Ayrı robot sayfası kaldırıldı; rehber içi linkler hero formuna düşer. { source: "/tercih-robotu", destination: "/#hero-form", permanent: true }, ]; }, }; export default nextConfig;