2026-04-15 · 5 min
Cloudflare D1 vs Postgres Hetzner: Pilihan untuk Warung Sederhana
Klien kuliner saya yang punya 3 cabang warung di Tangerang nanya: bisa pindah database ke Cloudflare D1 supaya gak bayar Hetzner $25/bulan?
Saya bilang: bisa, tapi mari kita test dulu. Saya jalankan parallel-running 2 bulan — write ke kedua DB simultan, read dari D1 untuk benchmark. Hasil:
Setup
App: POS kasir warung (web-based) dengan 3 lokasi, ~150 transaksi/hari total. Existing DB: Postgres 17 di Hetzner cx41 ($25/mo). Trial DB: Cloudflare D1 (region: auto, biasanya US karena tidak ada region Indonesia per April 2026).
Latency
Postgres Hetzner (Singapore):
- Read median: 12ms
- Read p95: 35ms
- Write median: 24ms
D1 (US region):
- Read median: 168ms
- Read p95: 412ms
- Write median: 285ms
D1 14x lebih lambat untuk read, 12x untuk write.
Alasan: D1 hosting di US, latency Indonesia → US ~150ms round trip. Tidak ada fix untuk ini sampai Cloudflare buka region Indonesia (rumored Q4 2026).
Throughput
Postgres: ~5000 read/sec sustained, 1000 write/sec. D1: ~50 read/sec sustained, 10 write/sec.
D1 punya rate limit yang strict untuk free tier dan moderate untuk paid tier. Untuk warung dengan 150 transaksi/hari (~0.002 write/sec average): tidak bottleneck. Tapi saat lunch rush (12-13, 20+ transaksi/menit): pernah hit rate limit.
Cost
Postgres Hetzner:
- Server: $25/mo
- Backup (Litestream + R2): $0.50/mo
- Total: $25.50/mo
D1:
- Free tier: 5 million row reads, 100K row writes per day
- Saat data sudah 15 ribu row (2 bulan): saya hit read limit sekitar tanggal 25 every month
- Paid: $0.001 per 1000 read = ~$8/mo untuk warung saya
- Total: $8/mo (paid tier yang fit)
D1 70% lebih murah. Tapi:
Yang D1 tidak kasih
- Full SQL: D1 pakai SQLite syntax. Banyak yang kepake. Tapi:
- Tidak ada
LATERAL JOIN - Tidak ada
CTE recursive(well, ada tapi terbatas) - Tidak ada FULL TEXT SEARCH yang setara dengan Postgres
- Tidak ada
json_agg,array_aggaggregation - Tidak ada timezone-aware timestamp
- Tidak ada
- Connection pooling abstraction: D1 punya request-level connection. Tiap Worker invocation = new connection. Untuk app yang biasa pakai connection pool: pattern berubah.
- Multiple data center: D1 single-region. Postgres bisa replicate cross-region kalau Anda butuh.
- Tooling: pg_dump, pgAdmin, dll. D1 punya wrangler CLI tapi limited.
Yang D1 kasih
- No server management: tidak ada server yang harus saya upgrade Ubuntu LTS, restart, patch security.
- Built-in backup: Cloudflare backup automatic.
- Edge proximity: Worker → D1 path is internal Cloudflare network. Latency dari Worker ke D1 ~10ms (regardless of user location). User-to-Worker yang kena 150ms.
Migration cost
Migrate schema: 30 menit (SQLite-compat schema sudah dibuilt-in saat app pakai pgsql). Migrate data: 2 jam (export Postgres → import D1 via wrangler). Rewrite query yang tidak compat: 8 jam (FULL TEXT SEARCH, complex aggregation). Test parallel: 2 bulan (yang sudah selesai).
Total: ~10 jam engineering time. Untuk biaya saya $100/jam ke klien: Rp 15 juta.
Verdict untuk klien warung
Saya kasih klien rekomendasi: TIDAK migrate.
Reasoning:
- User experience kena: 14x lebih lambat. User kasir di warung akan complain.
- Saving terlalu kecil: $17/month saving × 24 month = $408. Migration cost $1000. Break-even baru 2.5 tahun.
- Risiko terlalu tinggi: D1 region Indonesia masih rumor. Cloudflare bisa raise pricing kapanpun.
Klien setuju. Tetap di Postgres Hetzner.
Kapan D1 make sense (di 2026)
Berdasarkan eksperimen saya:
✅ Edge-hosted SaaS dengan user global (latency averaged). D1 dengan Worker di JKT POP serves Indonesia user OK. ✅ Read-heavy app dengan caching aggressive. Cache hit at Worker level, fall through ke D1 occasionally. ✅ MVP / prototype: zero infra cost, ship fast.
❌ Indonesia-only user dengan low latency requirement (POS, gaming, real-time chat). ❌ Write-heavy OLTP. ❌ App yang heavily query JSON / FTS.
Re-evaluate when
Cloudflare buka D1 region Indonesia: re-test latency dari Jakarta. Kalau median < 30ms, layak revisit.
Sampai itu terjadi: Postgres Hetzner Singapore tetap winner untuk Indonesia SMB.
Ditulis oleh Reza Pradipta