diff --git a/nginx.conf b/nginx.conf index ae40c3e..6117ac5 100644 --- a/nginx.conf +++ b/nginx.conf @@ -13,7 +13,12 @@ server { proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; - proxy_read_timeout 60s; + # Belge yükleme: arayüz 10 MB'a izin veriyor, base64 ile ~13,4 MB gövde. + # nginx varsayılanı 1 MB → 1 MB üstü her dosya 413 ile "yüklenemedi" oluyordu. + client_max_body_size 20m; + # Derin şartname analizi 1-2 dk sürebiliyor; 60 sn'de 504 kesiyordu. + proxy_read_timeout 300s; + proxy_send_timeout 300s; proxy_connect_timeout 10s; } diff --git a/server/index.js b/server/index.js index 7fce1d5..d4212f2 100644 --- a/server/index.js +++ b/server/index.js @@ -772,7 +772,7 @@ const server = http.createServer(async (req, res) => { if (req.method === 'POST') { try { - const body = await readBody(req, 12 * 1024 * 1024); // base64 şişmesi payı + const body = await readBody(req, 16 * 1024 * 1024); // 10 MB dosya × 1,34 base64 + JSON payı if (!body.ad || !body.icerikBase64) { return json(res, 400, { success: false, error: 'ad ve icerikBase64 gerekli' }); } diff --git a/src/components/TenderDocuments.jsx b/src/components/TenderDocuments.jsx index bf56e73..6858e08 100644 --- a/src/components/TenderDocuments.jsx +++ b/src/components/TenderDocuments.jsx @@ -34,6 +34,10 @@ export const TenderDocuments = ({ tender }) => { const f = e.target.files?.[0]; e.target.value = ''; if (!f) return; + if (f.size > 10 * 1024 * 1024) { + setError(`Yüklenemedi: ${f.name} ${(f.size / 1048576).toFixed(1)} MB — sınır 10 MB.`); + return; + } setYukleniyor(true); setError(null); try { await uploadDocument(f, 'İhale Dokümanı', ikn); diff --git a/src/services/account.js b/src/services/account.js index 77789c5..8faa0cc 100644 --- a/src/services/account.js +++ b/src/services/account.js @@ -10,7 +10,13 @@ async function iste(url, opts = {}) { const res = await fetch(url, { ...opts, headers: { ...auth(), ...(opts.headers || {}) } }); const d = await res.json().catch(() => ({})); if (!d.success) { - const e = new Error(d.error || `İstek başarısız (HTTP ${res.status})`); + // nginx/proxy hataları JSON değil HTML döner; kullanıcıya anlamlı mesaj ver. + const proxyMesaj = { + 413: 'Dosya sunucunun kabul ettiği boyutu aşıyor (en fazla 10 MB).', + 502: 'Sunucuya ulaşılamadı, biraz sonra tekrar deneyin.', + 504: 'Sunucu zamanında yanıt vermedi; büyük dosyada tekrar deneyin.', + }[res.status]; + const e = new Error(d.error || proxyMesaj || `İstek başarısız (HTTP ${res.status})`); e.kod = d.kod; throw e; } diff --git a/src/services/ai.js b/src/services/ai.js index fa7a9fa..2198d61 100644 --- a/src/services/ai.js +++ b/src/services/ai.js @@ -20,6 +20,12 @@ export async function analyzeSpecText({ text, fileName, tender, chain, mode }) { body: JSON.stringify({ text, fileName, tender, chain, mode }), }); const data = await res.json().catch(() => ({})); - if (!data.success) throw new Error(data.error || `Analiz başarısız (HTTP ${res.status})`); + if (!data.success) { + const proxyMesaj = { + 413: 'Doküman metni sunucu sınırını aşıyor; daha küçük bir dosya veya yalnızca ilgili sayfaları deneyin.', + 504: 'Analiz zaman aşımına uğradı; tekrar deneyin (derin analiz 1-2 dk sürebilir).', + }[res.status]; + throw new Error(data.error || proxyMesaj || `Analiz başarısız (HTTP ${res.status})`); + } return data; }