Tampilan
Background Jobs & Cron
Arsitektur queue
Sistem tidak memakai Bull/Redis (meskipun bull ada di package.json). Pekerjaan asinkron memakai DB-backed queue (tabel Jobs) + child process lewat job-runner.js. Tidak ada backpressure — job di-spawn fire-and-forget.
Mekanisme job-runner.js
job-runner.js adalah loader skrip dinamis (bukan daemon worker yang berjalan terus):
bash
node job-runner <scriptName> [arg]
# resolve: require(`${__dirname}/cron/${scriptName}`)argv[2]= path di bawahcron/(dengan/tanpa.js).- Skrip yang di-require langsung berjalan saat dimuat (kebanyakan memanggil
runProcess()). - Argumen tambahan diteruskan via
process.argv[3+].
Pola pemanggilan:
bash
# via npm
npm run cron:jobs:reset-sending-quota # -> node job-runner job-reset-quota-mail
# langsung
node job-runner invoices/recurring-invoice/job-recurring-invoice
# dengan job ID (arg ke-4)
node job-runner.js job-send-mail-daily-report 123Pola producer → consumer
- Producer menulis baris
Jobs(statuson-queue) viarepositories/job.repository.js, lalu men-spawn consumer viahelpers/cp.helper.js. - Consumer (
cron/job-*.js) mem-pollJobsberdasarkanjobType+status: 'on-queue', setprocessing, proses, laludone/error.
Lifecycle API (repositories/job.repository.js)
| Fungsi | Aksi |
|---|---|
register() | Buat job on-queue |
getByType() / getAllByTypeLike() | Dequeue FIFO |
jobProcessing() | Set processing |
jobDone(id, isDone, error) | Set done/error + params3 |
deleteOlderThan() | Housekeeping |
Scheduler: eksternal, bukan in-process
server.jsmemanggilcron.runnerJob()saat startup, tetapicron/scheduledFunctions/runnerJob.jsadalah stub kosong (semuaCronJob.scheduledi-comment).- Semua penjadwalan dilakukan eksternal (crontab di VPS menjalankan
npm run cron:*).
Implikasi handover
Jadwal cron tidak ada di repo. Saat handover, periksa crontab/scheduler di server production untuk mengetahui job apa yang berjalan dan pada jam berapa. PM2 hanya mengawasi server HTTP — kegagalan cron tidak muncul di log PM2.
Daftar cron (npm scripts)
Jadwal di bawah berasal dari komentar di file (perkiraan konfigurasi ops), bukan definisi live.
| npm script | Jadwal (perkiraan) | Tujuan | File |
|---|---|---|---|
cron:invoices:recurring | 0 0 * * * | Cari invoice jatuh tempo 14 hari; buat invoice/subscription berikutnya; enqueue email | cron/invoices/recurring-invoice/job-recurring-invoice.js |
cron:invoices:recurring:notif-user | 0 8 * * * | Kirim email PDF estimate Zoho | .../job-recurring-invoice__notif-user.js |
cron:invoices:recurring:notif-user--reminder | 0 8 * * * | Register reminder H-1/3/5/0 & H+1..3 | .../job-recurring-invoice__notif-user-reminder.js |
cron:invoices:recurring:notif-user--reminder:sender | setelah reminder | Kirim email reminder | .../job-recurring-invoice__notif-user-reminder__sender.js |
cron:invoices:recurring:checker-daily-mail:sender | setelah recurring | Email checker admin | .../job-recurring-invoice__checker-daily-mail__sender.js |
cron:invoices:paid-over-periode | harian | Expire trial/sub; tandai invoice overdue/cancelled; suspend relay | .../paid-over-periode-invoice/job-paid-over-periode-invoice.js |
cron:invoices:paid-over-periode:expired-trial:sender | poll | Kirim email trial expired | .../job-trial-package-is-expired__sender.js |
cron:jobs:reset-sending-quota | 58 23 * * * | Reset kuota bulanan; enqueue over-quota billing | cron/job-reset-quota-mail.js |
cron:jobs:delete | periodik | Hapus job done >7 hari | cron/job-delete-three-days-old-jobs.js |
cron:jobs:relay-housekeeping | periodik | Hapus relay Zimbra suspended >1 bulan | cron/job-relay-account-housekeeping.js |
cron:jobs:reminder-locked-relay | 30 * * * * | Email reminder relay terkunci spam | cron/job-reminder-locked-relay-account.js |
cron:sync-attachment-zmta | periodik | Sinkron batas attachment per domain ke ZMTA | cron/sync-domain-zmta.js |
cron:jobs:daily-reports | 15 0 * * * | Build CSV harian dari ES, upload S3, kirim email | cron/scheduledFunctions/jobs/generateCSVScheduledJob.js |
cron:jobs:daily-failed | 45 17 * * * | Digest delivery gagal, kirim email | cron/scheduledFunctions/jobs/dailyFailedReport.js |
cron:auth-zoho | sebelum token expiry | Refresh OAuth token Zoho ke DB config | cron/job-update-access-token-zoho.js |
cron:add-detail-report | harian | Agregasi pemakaian mail ES → tView | cron/job-add-detail-reports.js |
cron:quota-checker | periodik | Cari kuota ≥80/90/100%; enqueue notif | cron/job-notif-quota-checker.js |
cron:overquota:reminder | 1 0 * * * | Register reminder/suspend invoice over-quota | cron/overquota/job-overquota-reminder-invoice.js |
cron:overquota:reminder-sender | 1 8 * * * | Kirim email reminder over-quota | cron/overquota/job-overquota-reminder-invoice-sender.js |
cron:overquota:generate-billing | 0 0 * * * | Proses job; buat billing Zoho/Xendit | cron/overquota/job-overquota-generate-billing.js |
cron:overquota:send-billing | 0 8 * * * | Email proforma over-quota | cron/overquota/job-overquota-send-billing.js |
Cron tambahan (tidak di package.json, mungkin dijadwalkan manual)
| Tujuan | File |
|---|---|
| Register notif suspend customer recurring | cron/job-notif-suspend.js → job-notif-suspend-sender.js |
| Tandai invoice overdue | cron/set-overdue-package.js |
| Bersihkan JWT blacklist kedaluwarsa | cron/remove-blacklist-token.js |
| Token Zoho via browser (legacy) | cron/generate-token-zoho.js |
| Email konfirmasi pembayaran over-quota | cron/overquota/job-overquota-send-invoice.js |
| Registrasi kontak MailWizz | cron/mailwizz/job-register-contact-mailwizz.js |
Worker event-driven (di-spawn dari handler HTTP)
| Worker | Dipicu dari | File |
|---|---|---|
job-send-mail-invoice | Callback Xendit, manual payment, recurring | cron/job-send-mail-invoice.js |
job-send-mail-signup | Sign-up | cron/job-send-mail-signup.js |
job-send-mail-add-domain | Setup domain | cron/job-send-mail-add-domain.js |
job-notif-quota | Quota checker cron | cron/job-notif-quota.js |
job-update-file-cf | Package CRUD | cron/job-update-file-cf.js |
sync-domain-zmta | Callback Xendit | cron/sync-domain-zmta.js |
/automation/
Folder automation/ berisi satu TestCafe spec (zoho-auth.testcafe-spec.js) untuk otomasi login/consent OAuth Zoho (legacy). Bukan bagian infrastruktur job production. Dijalankan via npm run test:cafe / test:cafe:headless.