sistema-de-chamados/convex/crons.ts
rever-tecnologia 178c7d7341 fix(convex): mover cron jobs para API HTTP + crontab do Linux
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>
2025-12-10 08:51:32 -03:00

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