Problema: - Cron jobs do Convex criam registros em _scheduled_job_logs - Convex self-hosted carrega TODAS as versoes em memoria - 1488 execucoes/dia = ~45k registros/mes acumulando - Uso de memoria chegando a 19GB, causando 12 OOM kills/dia Solucao: - Criar endpoints HTTP em /api/cron/* para substituir crons - Desabilitar crons no Convex (comentados em crons.ts) - Chamar endpoints via crontab do Linux Novos arquivos: - src/app/api/cron/chat-cleanup/route.ts - src/app/api/cron/usb-cleanup/route.ts - scripts-static/* (copiado da VPS para versionamento) Documentacao: - docs/OPERATIONS.md secao 12 com instrucoes do crontab 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
59 lines
1.9 KiB
TypeScript
59 lines
1.9 KiB
TypeScript
import { cronJobs } from "convex/server"
|
|
import { api } from "./_generated/api"
|
|
|
|
const crons = cronJobs()
|
|
|
|
// =============================================================================
|
|
// CRON JOBS DESABILITADOS PARA REDUZIR USO DE MEMORIA
|
|
// =============================================================================
|
|
// Os cron jobs do Convex criam registros em _scheduled_job_logs que acumulam
|
|
// versoes em memoria (o Convex self-hosted carrega TODAS as versoes em RAM).
|
|
//
|
|
// Esses jobs foram movidos para endpoints HTTP em /api/cron/* e devem ser
|
|
// chamados via N8N ou outro scheduler externo:
|
|
//
|
|
// - POST /api/cron/chat-cleanup (substitui auto-end-inactive-chat-sessions)
|
|
// - POST /api/cron/usb-cleanup (substitui cleanup-stale-usb-policies)
|
|
//
|
|
// Autenticacao: Bearer token no header Authorization (usar CRON_SECRET ou REPORTS_CRON_SECRET)
|
|
// =============================================================================
|
|
|
|
// Flags to keep heavy jobs disabled until the Convex backend stabilizes.
|
|
const reportsCronEnabled = process.env.REPORTS_CRON_ENABLED === "true"
|
|
const autoPauseCronEnabled = process.env.AUTO_PAUSE_ENABLED === "true"
|
|
|
|
if (reportsCronEnabled) {
|
|
crons.interval(
|
|
"report-export-runner",
|
|
{ minutes: 15 },
|
|
api.reports.triggerScheduledExports,
|
|
{}
|
|
)
|
|
}
|
|
|
|
if (autoPauseCronEnabled) {
|
|
crons.daily(
|
|
"auto-pause-internal-lunch",
|
|
{ hourUTC: 15, minuteUTC: 0 },
|
|
api.tickets.pauseInternalSessionsForLunch,
|
|
{}
|
|
)
|
|
}
|
|
|
|
// DESABILITADO - Movido para /api/cron/usb-cleanup (chamado via N8N)
|
|
// crons.interval(
|
|
// "cleanup-stale-usb-policies",
|
|
// { minutes: 30 },
|
|
// api.usbPolicy.cleanupStalePendingPolicies,
|
|
// {}
|
|
// )
|
|
|
|
// DESABILITADO - Movido para /api/cron/chat-cleanup (chamado via N8N)
|
|
// crons.interval(
|
|
// "auto-end-inactive-chat-sessions",
|
|
// { minutes: 1 },
|
|
// api.liveChat.autoEndInactiveSessions,
|
|
// {}
|
|
// )
|
|
|
|
export default crons
|