Docker build'ini optimize et: OOM kökü çözümü + bellek sınırlı builder
All checks were successful
Deploy / deploy (push) Successful in 7m33s
All checks were successful
Deploy / deploy (push) Successful in 7m33s
Prod VPS'te next build sırasında makineyi kilitleyen OOM'un çözümü:
- serverExternalPackages'a @google/genai, @anthropic-ai/sdk, resend eklendi;
Turbopack artık genai'nin protobufjs/google-auth-library/ws zincirini
derlemiyor (c2aba25 sonrası OOM'un tetiği buydu).
- Docker build'inde (BUILD_KAYNAK_KISITLI=1) bellek kısıtları: Turbopack 1.5G
hedefi, statik üretim tek worker × 4 sayfa, prerender source map kapalı.
- Dockerfile: runner'a tam node_modules kopyası kaldırıldı (imaj ~1.9G→966M),
pnpm store + .next/cache BuildKit cache mount'ları, açık COPY listesi,
V8 heap sınırı.
- scripts/standalone-linkleri-onar.sh: Turbopack ESM external'ların kök
node_modules symlink'ini nft trace'ine yazmıyor; eksik linkler build sonrası
tamamlanmazsa runtime MODULE_NOT_FOUND ile düşer.
- ci.yaml: build bellek sınırlı buildx docker-container builder'da (2200m,
max-parallelism 1; BuildKit --memory bayrağını yok sayıyor), deploy
up -d --no-build ile ayrıldı, temizlik if: always() ile her koşuda.
- compose: app'e mem_limit 1g + oom_score_adj -600.
- Kullanılmayan simple-icons ve @react-pdf/renderer kaldırıldı; npm artığı
package-lock.json silindi.
Doğrulama: imaj 2 CPU/2GiB VM'de sıfırdan build edildi, konteynerde ana
sayfa/universite 200 ve üç ESM external import OK.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,44 @@
|
||||
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",
|
||||
serverExternalPackages: ["better-sqlite3", "iyzipay", "@libsql/client"],
|
||||
// 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 [
|
||||
|
||||
Reference in New Issue
Block a user