Files
whatsapp-inbox-platform/campaign-retry-job.md
Wira Basalamah adde003fba
Some checks failed
CI - Production Readiness / Verify (push) Has been cancelled
chore: initial project import
2026-04-21 09:29:29 +07:00

4.5 KiB

Campaign Retry Background Job (Production)

Endpoint:

  • GET /api/jobs/campaign-retry => status state
  • POST /api/jobs/campaign-retry => run one batch

Security

  • Set CAMPAIGN_RETRY_JOB_TOKEN in 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:
    • 200 jika sehat (status: "ok" / "degraded")
    • 503 jika ada komponen kritikal down (status: "down")
  • Tanpa HEALTHCHECK_TOKEN, endpoint akan menampilkan status ringkas.
  • Jika ingin detail tambahan, set HEALTHCHECK_TOKEN di .env dan kirim header Authorization: Bearer <token> atau query ?token=<token>.
  • Env pendukung:
    • HEALTHCHECK_TOKEN
    • WEBHOOK_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, default true)

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:

  • --once untuk menjalankan sekali lalu keluar
  • --no-jitter untuk menonaktifkan jitter interval acak

Opsional:

  • CAMPAIGN_RETRY_DAEMON_INTERVAL_SECONDS
  • CAMPAIGN_RETRY_DAEMON_TIMEOUT_MS
  • CAMPAIGN_RETRY_TENANT_ID
  • CAMPAIGN_RETRY_CAMPAIGN_ID
  • CAMPAIGN_RETRY_BATCH_SIZE
  • CAMPAIGN_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