From 5282543471a36dc1b3850fa03c9c27ff1a1079bf Mon Sep 17 00:00:00 2001 From: ht Date: Fri, 28 Aug 2026 22:37:11 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20zamanlay=C4=B1c=C4=B1=20te=C5=9Fhis=20u?= =?UTF-8?q?cu=20+=20geni=C5=9F=20ar=C5=9Fiv=20dolumu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /api/health/scheduler: DT/sonuç taraması durumu, son DT turu, boş bellek, Chromium varlığı — uzaktan teşhis için - Dolum eşiği 2.000 → 25.000, pencere 180 → 365 gün (arşiv 6 aylık havuzun %7'sinde erken duruyordu) --- server/index.js | 5 ++++- server/scheduler.mjs | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/server/index.js b/server/index.js index 3323ce3..7aa12b6 100644 --- a/server/index.js +++ b/server/index.js @@ -22,7 +22,7 @@ import { aiConfigured, availableProviders, analyzeSpec } from './ai.mjs'; import { billingConfigured, planCatalog, createCheckoutSession } from './billing.mjs'; import { searchTed } from './ted.mjs'; import { readHistory, historyStats } from './history-store.mjs'; -import { startScheduler } from './scheduler.mjs'; +import { startScheduler, schedulerStatus } from './scheduler.mjs'; import { searchKik, kararMetni } from './kik.mjs'; import { documentUrl, ilanMetni, documentText, browserAvailable } from './documents.mjs'; @@ -577,6 +577,9 @@ const server = http.createServer(async (req, res) => { } if (url.pathname === '/api/health') return json(res, 200, { ok: true }); + if (url.pathname === '/api/health/scheduler') { + return json(res, 200, { success: true, tarayiciVar: await browserAvailable(), ...schedulerStatus() }); + } return json(res, 404, { success: false, error: 'not found' }); } catch (err) { diff --git a/server/scheduler.mjs b/server/scheduler.mjs index 519f608..7a5d299 100644 --- a/server/scheduler.mjs +++ b/server/scheduler.mjs @@ -23,10 +23,10 @@ let calisiyor = false; function tarataParams() { const s = historyStats(); const mevcut = s.available ? (s.toplam || 0) : 0; - const esik = Number(process.env.SCAN_BACKFILL_ESIK || 2000); + const esik = Number(process.env.SCAN_BACKFILL_ESIK || 25000); if (mevcut < esik) { return { - gun: process.env.SCAN_BACKFILL_GUN || '180', + gun: process.env.SCAN_BACKFILL_GUN || '365', limit: process.env.SCAN_BACKFILL_LIMIT || '1500', tip: `geçmiş dolumu (arşivde ${mevcut} kayıt)`, }; @@ -76,6 +76,8 @@ function kalemDoldur() { // --- Doğrudan temin (Playwright/Chromium gerektirir) --- let dtCalisiyor = false; +let dtSonTur = null; // { baslangic, bitis, kod, hata } +let dtSonrakiMs = null; // Chromium ~350MB RSS kullanabilir; sunucu darsa DT'yi atla ve uyar. function bellekYeterliMi() { @@ -96,6 +98,7 @@ function dtTara() { } if (!bellekYeterliMi()) return; dtCalisiyor = true; + dtSonTur = { baslangic: new Date().toISOString() }; const pages = process.env.DT_PAGES || '5'; const details = process.env.DT_DETAILS || '30'; console.log(`[scheduler] doğrudan temin taraması başlıyor (${pages} sayfa, ${details} detay)`); @@ -107,15 +110,33 @@ function dtTara() { p.stderr.on('data', (d) => process.stderr.write(String(d))); p.on('close', (code) => { dtCalisiyor = false; + dtSonTur = { ...(dtSonTur || {}), bitis: new Date().toISOString(), kod: code }; if (code !== 0) console.warn(`[scheduler] ⚠ DT taraması ${code} koduyla bitti — Chromium kurulu mu / bellek yeterli mi kontrol edin.`); else console.log('[scheduler] DT taraması bitti'); }); p.on('error', (e) => { dtCalisiyor = false; + dtSonTur = { ...(dtSonTur || {}), bitis: new Date().toISOString(), hata: e.message }; console.warn('[scheduler] ⚠ DT worker başlatılamadı:', e.message, '— Chromium yoksa DT_ENABLED=0 yapın.'); }); } +export function schedulerStatus() { + const bosMB = Math.round(os.freemem() / 1024 / 1024); + return { + sonucTaramasi: { aktif: process.env.SCAN_ENABLED !== '0', calisiyor: calisiyor, aralikSaat: Number(process.env.SCAN_INTERVAL_SAAT || 6) }, + dogrudanTemin: { + aktif: process.env.DT_ENABLED !== '0', + calisiyor: dtCalisiyor, + aralikSaat: Number(process.env.DT_INTERVAL_SAAT || 4), + sonTur: dtSonTur, + bellekEsigiMB: Number(process.env.DT_MIN_BOS_MB || 600), + }, + bosBellekMB: bosMB, + toplamBellekMB: Math.round(os.totalmem() / 1024 / 1024), + }; +} + export function startScheduler() { if (process.env.SCAN_ENABLED === '0') { console.log('[scheduler] devre dışı (SCAN_ENABLED=0)');