4.5 KiB
4.5 KiB
Campaign Retry Background Job (Production)
Endpoint:
GET /api/jobs/campaign-retry=> status statePOST /api/jobs/campaign-retry=> run one batch
Security
- Set
CAMPAIGN_RETRY_JOB_TOKENin production. - Header yang diterima:
Authorization: Bearer <token>x-cron-token: <token>
- Saat
NODE_ENV=production, jika token tidak di-set maka request akan ditolak.
Health Check
- Endpoint umum:
GET /api/health - Return:
200jika sehat (status: "ok"/"degraded")503jika ada komponen kritikal down (status: "down")
- Tanpa
HEALTHCHECK_TOKEN, endpoint akan menampilkan status ringkas. - Jika ingin detail tambahan, set
HEALTHCHECK_TOKENdi.envdan kirim headerAuthorization: Bearer <token>atau query?token=<token>. - Env pendukung:
HEALTHCHECK_TOKENWEBHOOK_FAILURE_RATE_THRESHOLD_PER_HOUR(default:20)RETRY_WORKER_STALE_MINUTES(default:30)
Runtime Env
CAMPAIGN_RETRY_BATCH_SIZE(default:100)CAMPAIGN_RETRY_MAX_CAMPAIGNS(default:20)CAMPAIGN_RETRY_JOB_LOCK_TTL_SECONDS(default:300)CAMPAIGN_RETRY_DAEMON_INTERVAL_SECONDS(default:300)CAMPAIGN_RETRY_DAEMON_TIMEOUT_MS(default:30000)CAMPAIGN_RETRY_ALERT_WEBHOOK_URL(optional, webhook/Slack endpoint)CAMPAIGN_RETRY_ALERT_ON_FAILURE(true/false, defaulttrue)
Menjalankan Manual
npm run job:campaign-retry
Atau:
CAMPAIGN_RETRY_JOB_URL=https://app.example.com \
CAMPAIGN_RETRY_JOB_TOKEN=token-anda \
node scripts/campaign-retry-job.mjs
Jalankan Daemon (otomatis)
npm run job:campaign-retry:daemon
Opsi tambahan:
--onceuntuk menjalankan sekali lalu keluar--no-jitteruntuk menonaktifkan jitter interval acak
Opsional:
CAMPAIGN_RETRY_DAEMON_INTERVAL_SECONDSCAMPAIGN_RETRY_DAEMON_TIMEOUT_MSCAMPAIGN_RETRY_TENANT_IDCAMPAIGN_RETRY_CAMPAIGN_IDCAMPAIGN_RETRY_BATCH_SIZECAMPAIGN_RETRY_MAX_CAMPAIGNS
Contoh (daemon):
CAMPAIGN_RETRY_JOB_URL=https://app.example.com \
CAMPAIGN_RETRY_JOB_TOKEN=token-anda \
CAMPAIGN_RETRY_DAEMON_INTERVAL_SECONDS=300 \
npm run job:campaign-retry:daemon
Menjadikan otomatis (cron)
Linux / VM (one-shot cron)
*/5 * * * * cd /path/to/project && CAMPAIGN_RETRY_JOB_TOKEN=token-anda CAMPAIGN_RETRY_JOB_URL=https://app.example.com npm run job:campaign-retry >> /var/log/campaign-retry.log 2>&1
Alternatif untuk host Anda: jalankan npm run job:campaign-retry:daemon sebagai service terpisah dan atur CAMPAIGN_RETRY_DAEMON_INTERVAL_SECONDS sesuai kebutuhan.
Vercel Cron (opsional)
Tambah cron di vercel.json dengan query token:
{
"crons": [
{
"path": "/api/jobs/campaign-retry?token=your-token-here",
"schedule": "*/5 * * * *"
}
]
}
Pastikan token disiapkan via Environment Variable Vercel CAMPAIGN_RETRY_JOB_TOKEN.
Ops Healthcheck
Jalankan pemeriksaan cepat lingkungan produksi:
OPS_BASE_URL=https://app.example.com \
HEALTHCHECK_TOKEN=your-health-token \
CAMPAIGN_RETRY_JOB_TOKEN=your-cron-token \
npm run ops:healthcheck
Command ini memeriksa:
- halaman root aplikasi (
/) - status
GET /api/health - status state
GET /api/jobs/campaign-retry
Ops Readiness
Jalankan preflight lengkap sebelum release:
npm run ops:readiness
Perintah ini memeriksa:
- variabel environment penting
- status migration Prisma
- health endpoint
- endpoint state campaign retry (jika token tersedia)
Catatan: jalankan saat aplikasi sudah aktif (dev/prod running) agar pemeriksaan endpoint tidak false positive.
Operations Playbook
Linux service (daemon mode)
Jika ingin retry berjalan nonstop tanpa cron external, gunakan mode daemon sebagai service:
[Unit]
Description=WhatsApp campaign retry worker
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/project
Environment=CAMPAIGN_RETRY_JOB_URL=https://app.example.com
Environment=CAMPAIGN_RETRY_JOB_TOKEN=token-anda
Environment=CAMPAIGN_RETRY_DAEMON_INTERVAL_SECONDS=300
Environment=CAMPAIGN_RETRY_DAEMON_TIMEOUT_MS=30000
Environment=CAMPAIGN_RETRY_BATCH_SIZE=100
Environment=CAMPAIGN_RETRY_MAX_CAMPAIGNS=20
ExecStart=/usr/bin/npm run job:campaign-retry:daemon
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Jalankan service:
sudo systemctl start whatsapp-campaign-retry
sudo systemctl enable whatsapp-campaign-retry
sudo journalctl -u whatsapp-campaign-retry -f