Lewati ke konten
Backend Performance DevOps

Membawa Elysia.js + Bun ke Produksi: Yang Tidak Tertulis di Docs

Catatan praktis dari menjalankan Elysia.js di Bun untuk service produksi: PM2, observability, dan pola error yang harus diwaspadai.

Wafik Ulinnuha

Backend Developer

1 menit baca

Bun memberikan startup time yang cepat dan throughput yang impresif. Elysia.js menambahkan ergonomi tipe yang setara Hono atau Fastify. Kombinasi ini sangat menggoda. Tapi seperti runtime baru lainnya, banyak detail produksi yang harus diisi sendiri.

Process supervisor

Bun belum punya equivalent dari cluster di Node yang matang. Saya memakai dua pendekatan, tergantung beban:

  • PM2 dengan mode fork dan beberapa instance. Cocok untuk service yang stateless.
  • systemd unit dengan Restart=always untuk service kritikal. Lebih sederhana, satu binary bun, dan log langsung ke journald.
[Service]
Type=simple
User=app
ExecStart=/usr/local/bin/bun run /var/www/app/src/index.ts
Restart=always
RestartSec=2
LimitNOFILE=65536
Environment=NODE_ENV=production

Reverse proxy yang benar

Selalu letakkan Nginx di depan. Bukan karena Bun lemah meng-handle TLS, tapi agar konfigurasi rate-limit, header keamanan, dan koneksi keep-alive bisa diatur di satu tempat.

location /api/ {
  proxy_pass http://127.0.0.1:3000;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header X-Real-IP $remote_addr;
  proxy_read_timeout 60s;
}

Observability minimal

Tanpa instrumentasi, performa Bun sulit ditelusuri. Saya selalu memasang:

  • Endpoint /healthz dan /readyz sederhana.
  • Logger berbasis pino dengan output JSON, di-pipe ke Loki via Vector.
  • Histogram durasi handler menggunakan prom-client; Elysia menyediakan onAfterHandle yang ideal untuk ini.

Pola error yang harus diwaspadai

Beberapa hal yang bikin saya kena di awal:

  1. Top-level await yang tertahan saat boot — service ikut pending hingga timeout.
  2. Body parsing untuk multipart di Bun pernah inkompatibel dengan beberapa client; selalu test dengan klien Android sebenarnya.
  3. Date timezone di build Linux Alpine: pastikan tzdata ter-install jika kamu menggunakan Date dengan timezone lokal.

Apakah saya menyesal pindah ke Bun?

Tidak. Latency p95 untuk Gatsu turun ~32% dibanding versi Node sebelumnya, dan startup container jadi sub-detik. Tapi saya berhati-hati: untuk service mission-critical yang tidak butuh innovation cycle baru, Node.js LTS masih pilihan yang sangat bisa dipertanggungjawabkan.

Topik

#Backend #Performance #DevOps

Bagikan

Kembali ke daftar blog

Bacaan lanjutan

Bacaan lanjutan