feat: zamanlayıcı teşhis ucu + geniş arşiv dolumu
- /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)
This commit is contained in:
+4
-1
@@ -22,7 +22,7 @@ import { aiConfigured, availableProviders, analyzeSpec } from './ai.mjs';
|
|||||||
import { billingConfigured, planCatalog, createCheckoutSession } from './billing.mjs';
|
import { billingConfigured, planCatalog, createCheckoutSession } from './billing.mjs';
|
||||||
import { searchTed } from './ted.mjs';
|
import { searchTed } from './ted.mjs';
|
||||||
import { readHistory, historyStats } from './history-store.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 { searchKik, kararMetni } from './kik.mjs';
|
||||||
import { documentUrl, ilanMetni, documentText, browserAvailable } from './documents.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') 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' });
|
return json(res, 404, { success: false, error: 'not found' });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
+23
-2
@@ -23,10 +23,10 @@ let calisiyor = false;
|
|||||||
function tarataParams() {
|
function tarataParams() {
|
||||||
const s = historyStats();
|
const s = historyStats();
|
||||||
const mevcut = s.available ? (s.toplam || 0) : 0;
|
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) {
|
if (mevcut < esik) {
|
||||||
return {
|
return {
|
||||||
gun: process.env.SCAN_BACKFILL_GUN || '180',
|
gun: process.env.SCAN_BACKFILL_GUN || '365',
|
||||||
limit: process.env.SCAN_BACKFILL_LIMIT || '1500',
|
limit: process.env.SCAN_BACKFILL_LIMIT || '1500',
|
||||||
tip: `geçmiş dolumu (arşivde ${mevcut} kayıt)`,
|
tip: `geçmiş dolumu (arşivde ${mevcut} kayıt)`,
|
||||||
};
|
};
|
||||||
@@ -76,6 +76,8 @@ function kalemDoldur() {
|
|||||||
|
|
||||||
// --- Doğrudan temin (Playwright/Chromium gerektirir) ---
|
// --- Doğrudan temin (Playwright/Chromium gerektirir) ---
|
||||||
let dtCalisiyor = false;
|
let dtCalisiyor = false;
|
||||||
|
let dtSonTur = null; // { baslangic, bitis, kod, hata }
|
||||||
|
let dtSonrakiMs = null;
|
||||||
|
|
||||||
// Chromium ~350MB RSS kullanabilir; sunucu darsa DT'yi atla ve uyar.
|
// Chromium ~350MB RSS kullanabilir; sunucu darsa DT'yi atla ve uyar.
|
||||||
function bellekYeterliMi() {
|
function bellekYeterliMi() {
|
||||||
@@ -96,6 +98,7 @@ function dtTara() {
|
|||||||
}
|
}
|
||||||
if (!bellekYeterliMi()) return;
|
if (!bellekYeterliMi()) return;
|
||||||
dtCalisiyor = true;
|
dtCalisiyor = true;
|
||||||
|
dtSonTur = { baslangic: new Date().toISOString() };
|
||||||
const pages = process.env.DT_PAGES || '5';
|
const pages = process.env.DT_PAGES || '5';
|
||||||
const details = process.env.DT_DETAILS || '30';
|
const details = process.env.DT_DETAILS || '30';
|
||||||
console.log(`[scheduler] doğrudan temin taraması başlıyor (${pages} sayfa, ${details} detay)`);
|
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.stderr.on('data', (d) => process.stderr.write(String(d)));
|
||||||
p.on('close', (code) => {
|
p.on('close', (code) => {
|
||||||
dtCalisiyor = false;
|
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.`);
|
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');
|
else console.log('[scheduler] DT taraması bitti');
|
||||||
});
|
});
|
||||||
p.on('error', (e) => {
|
p.on('error', (e) => {
|
||||||
dtCalisiyor = false;
|
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.');
|
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() {
|
export function startScheduler() {
|
||||||
if (process.env.SCAN_ENABLED === '0') {
|
if (process.env.SCAN_ENABLED === '0') {
|
||||||
console.log('[scheduler] devre dışı (SCAN_ENABLED=0)');
|
console.log('[scheduler] devre dışı (SCAN_ENABLED=0)');
|
||||||
|
|||||||
Reference in New Issue
Block a user