karawaci.kode

2026-06-04 · 6 min

Bun 1.3 di Production: 4 Bulan Migrasi Payment Gateway

Empat bulan lalu, saya migrasi payment gateway untuk klien warung kuliner Tangerang dari Node 22 + Express ke Bun 1.3 + Hono. Hari ini, saya kasih angka real.

Setup

Project: middleware payment gateway untuk warung dengan ~3000 transaksi/hari. Stack lama: Node 22 + Express + Postgres 16 + Redis 7. Stack baru: Bun 1.3 + Hono + Postgres 16 + Redis 7. Same DB, same Redis, same nginx reverse proxy.

Hosted di VPS Hetzner 4 CPU / 8GB. Tidak migrasi infrastructure.

Latency

P50 sebelum: 47ms. P50 sesudah: 33ms. ~30% improvement. P95 sebelum: 142ms. P95 sesudah: 89ms. ~37% improvement. P99 sebelum: 280ms. P99 sesudah: 178ms. ~36% improvement.

Source latency: Bun’s faster HTTP server + faster JSON parsing. Tidak ada perubahan di logic atau DB query. Bukan magic.

Memory

RSS Node 22 setelah running 24 jam: ~480MB stable. RSS Bun 1.3 setelah running 24 jam: ~290MB stable.

Sekitar 40% reduction. Bun’s runtime indeed lebih kecil. Tapi: ini setelah saya nonaktifkan some Node-specific instrumentation yang Bun belum support optimal.

Yang break

  1. pg native module: Bun tidak well-tested dengan pg extension yang pakai libpq native. Switch ke postgres.js (zero-dep). Migrasi 2 jam. Compatible.

  2. bcryptjs performance regression: bcryptjs di Bun 1.3 sekitar 2x lebih lambat dari Node 22. Switch ke Bun-native Bun.password.hash. Hashing time turun lebih dari Node baseline.

  3. Sentry SDK: Sentry’s @sentry/node v8 belum officially support Bun. Saya pakai @sentry/bun (community fork). Compatible tapi missing some features (no automatic instrumentation untuk fetch).

  4. jsonwebtoken: Works fine, tapi tidak sefast Node. Migrasi ke jose (modern JOSE library). Faster + standards-compliant.

Yang DOWNTIME

Satu kali. Hari ke-23 production. Native module argon2 yang dipakai untuk verify password old user, crash dengan SIGSEGV di Bun 1.3.245. Postmortem: bug di N-API compat layer di Bun runtime.

Quick fix: rollback to Node 22 selama 4 jam. Lapor bug ke GitHub Bun. Patch keluar di 1.3.247 dua hari kemudian. Saya tunggu satu minggu observasi di staging, lalu re-migrate.

Total downtime: 4 jam dalam 4 bulan. Acceptable untuk SMB use case ini. Untuk fintech atau healthcare yang butuh five nines: belum cukup matang.

Build & deploy

# Old: Node 22
npm install --omit=dev
node --enable-source-maps server.js

# New: Bun 1.3
bun install --production
bun --smol server.ts

--smol flag turn-off some JIT optimizations, lebih hemat memory tanpa banyak penalty di throughput. Cocok untuk container ber-budget.

Kapan saya rekomendasi Bun 1.3 production

  • ✅ SMB / mid-size service dengan throughput < 10k req/min
  • ✅ Greenfield project yang bisa pakai modern dependencies
  • ✅ Edge function di Cloudflare Workers (Bun compat dengan WinterCG)

Kapan saya BELUM rekomendasi

  • ❌ Mission-critical fintech yang butuh full audit dependency chain
  • ❌ Project yang heavily dependen native modules (canvas, sharp, image-processing)
  • ❌ Tim yang ngga ada bandwidth handle library compatibility issues

Bun bagus, sudah cukup matang untuk most use case. Tapi bukan magic bullet.

Ditulis oleh Reza Pradipta