69 lines
2.6 KiB
JavaScript
69 lines
2.6 KiB
JavaScript
import cron from 'node-cron'
|
|
import { prisma } from './db.js'
|
|
import mysql from 'mysql2/promise'
|
|
import { fetchNewsList, persistNews } from '../scripts/fetchers/news.fetcher.js'
|
|
import { checkAfterRefresh } from './alert-engine.js'
|
|
|
|
function parseUrl(url) {
|
|
const u = new URL(url)
|
|
return { host: u.hostname, port: Number(u.port) || 3306, user: decodeURIComponent(u.username), password: decodeURIComponent(u.password), database: u.pathname.replace(/^\//, '') }
|
|
}
|
|
|
|
async function openConn() {
|
|
return mysql.createConnection(parseUrl(process.env.DATABASE_URL))
|
|
}
|
|
|
|
// 每天凌晨 3:00 (本地时间) 拉取新闻 + 跑跨源对比
|
|
function scheduleNews() {
|
|
cron.schedule('0 3 * * *', async () => {
|
|
console.log('[cron] 3:00 触发')
|
|
try {
|
|
const list = await fetchNewsList()
|
|
const r = await persistNews(list)
|
|
console.log('[cron] 新闻入库: 新增 ' + r.inserted + ' / 跳过 ' + r.skipped)
|
|
const conn = await openConn()
|
|
try {
|
|
const a = await checkAfterRefresh(conn)
|
|
console.log('[cron] 报警检测: 新增 ' + a.inserted + ' 条 (扫描 ' + a.scanned + ')')
|
|
} finally { await conn.end() }
|
|
} catch (e) {
|
|
console.error('[cron] 任务失败:', e.message)
|
|
}
|
|
})
|
|
console.log('[cron] 已注册: 每天 03:00 拉取新闻 + 跨源报警检测')
|
|
}
|
|
|
|
// 每 2 分钟: 拉取 komari 节点 + 服务自检
|
|
function scheduleMonitors() {
|
|
cron.schedule('*/2 * * * *', async () => {
|
|
try {
|
|
const k = require('./komari-monitor.cjs')
|
|
const r = await k.runOnce()
|
|
console.log('[cron] komari: nodes=' + r.nodes + ' snapshots=' + r.snapshots + ' history=' + r.history + ' failed=' + r.failed)
|
|
} catch (e) { console.error('[cron] komari 任务失败:', e.message) }
|
|
try {
|
|
const h = require('./health-check.cjs')
|
|
const arr = await h.runOnce()
|
|
const down = arr.filter(x => x.status !== 'up').map(x => x.name)
|
|
console.log('[cron] health: ' + arr.length + ' 项, down=' + (down.length ? down.join(',') : '无'))
|
|
} catch (e) { console.error('[cron] health 任务失败:', e.message) }
|
|
})
|
|
console.log('[cron] 已注册: 每 2 分钟 komari + 服务自检')
|
|
}
|
|
|
|
// 每小时: 清理 24h 前的 komari 历史
|
|
function scheduleMonitorCleanup() {
|
|
cron.schedule('0 * * * *', async () => {
|
|
try {
|
|
const k = require('./komari-monitor.cjs')
|
|
const n = await k.cleanupOld()
|
|
console.log('[cron] 监控历史清理: 删除 ' + n + ' 条')
|
|
} catch (e) { console.error('[cron] 监控清理失败:', e.message) }
|
|
})
|
|
console.log('[cron] 已注册: 每小时清理 24h 前监控历史')
|
|
}
|
|
|
|
scheduleNews()
|
|
scheduleMonitors()
|
|
scheduleMonitorCleanup()
|