Hono + Drizzle + Neon + Workers: API production ringan
bundle API ringan: Hono + Drizzle + Neon di Cloudflare Workers — setup production
TL;DR
- Hono: satu-satunya pilihan realistis untuk API framework di Cloudflare Workers
- Drizzle: ORM yang bisa jalan di Workers (Prisma tidak bisa)
- Neon: Postgres serverless dengan HTTP driver, cocok untuk Workers
- Bundle ini Recommended untuk tim kecil yang ingin zero-ops API production
Konteks: kenapa bundle ini relevan di 2026
Cloudflare Workers sudah ada sejak 2018 tapi adoption untuk API production baru mainstream 2024-2025. Alasannya: tooling mature, ekosistem TypeScript lebih solid, dan Neon serverless menyelesaikan masalah lama — “bagaimana connect ke Postgres dari V8 isolate yang tidak support TCP native?”
Di 2026, ini adalah bundle yang paling sering dipakai developer Indonesia untuk API ringan tanpa manage server. Bukan karena hype, tapi karena kombinasinya menyelesaikan masalah nyata: deploy cepat, biaya predictable, dan tidak perlu bangun sendiri dari scratch.
Saya sudah pakai bundle ini di tiga project production (SaaS form builder, internal tool SMB, REST API untuk aplikasi mobile). Verdict berbeda per use case — ini yang perlu Anda tahu.
Comparison table
| Aspek | Detail |
|---|---|
| Harga | Workers $5/bulan (10M req), Neon $19/bulan (prod) — total $24/bulan vs VPS $6/bulan (tapi self-manage) |
| DX (Developer Experience) | Hono type-safe, Drizzle schema-first — setup awal 2-3 jam, workflow harian cepat |
| Performance | Cold start Workers ~5ms, Neon HTTP latency ~80-150ms dari Jakarta (region Singapore) |
| Ecosystem | Hono middleware ecosystem luas, Drizzle Kit untuk migration, Neon branching untuk staging |
| Indonesia-specific | Cloudflare punya PoP Jakarta (2024), latency ke user lokal 10-30ms — signifikan improvement dari region US |
| Limitation | Neon free tier: 10 concurrent connections — bukan untuk high-concurrency. Workers CPU limit 50ms per request |
Per-tool breakdown
Hono
Hono adalah web framework untuk edge runtime: Cloudflare Workers, Deno, Bun, dan browser. Zero dependency, Web Standard compliant, bundle size ~15KB.
Yang bikin Hono unggul adalah RPC layer — Anda bisa share type dari server ke client tanpa tRPC. Middleware ecosystem sudah cover kebutuhan umum: CORS, JWT, rate limiting, logger, Zod validator. Untuk Workers, Hono adalah default yang tidak perlu dipertanyakan.
Kelemahannya: community lebih kecil dari Express. Kalau Anda cari solusi untuk masalah edge case, Stack Overflow less helpful — dokumentasi official dan GitHub Discussions adalah sumber utama. Tidak ada “quick answer” via Google untuk mayoritas masalah spesifik.
import { Hono } from 'hono'
import { zValidator } from '@hono/zod-validator'
import { z } from 'zod'
const app = new Hono()
const createUserSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
})
app.post('/users', zValidator('json', createUserSchema), async (c) => {
const body = c.req.valid('json')
// body sudah typed dan validated
return c.json({ success: true, data: body })
})
export default app
Drizzle
Drizzle bukan ORM dalam arti tradisional — lebih ke “type-safe SQL query builder dengan schema definition”. Ini penting dipahami: Drizzle tidak abstract query, Anda masih menulis SQL logic secara explicit.
Yang unggul: tidak ada binary, tidak ada engine — bisa jalan di mana saja ada JavaScript runtime. Ini yang membuatnya menjadi satu-satunya pilihan untuk Workers. Schema definition di TypeScript, migration via drizzle-kit push atau generate + apply, dan query builder fully typed.
Kelemahannya: untuk developer yang biasa Prisma, Drizzle learning curve ada karena paradigmanya berbeda. Prisma lebih “ORM-like” (model-based, auto-relation), Drizzle lebih “SQL-like” (Anda perlu explicit join). Untuk query sederhana tidak ada masalah. Untuk aplikasi dengan banyak relasi complex, Drizzle butuh lebih banyak kode.
// schema.ts
import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core'
export const users = pgTable('users', {
id: uuid('id').primaryKey().defaultRandom(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow(),
})
// query
import { drizzle } from 'drizzle-orm/neon-http'
import { neon } from '@neondatabase/serverless'
const sql = neon(env.DATABASE_URL)
const db = drizzle(sql)
const allUsers = await db.select().from(users)
Neon
Neon adalah managed Postgres dengan model serverless: database bisa “sleep” saat tidak ada traffic (free tier) dan scale otomatis. Yang relevan untuk Workers adalah HTTP driver (@neondatabase/serverless) yang bypass kebutuhan TCP connection — bisa langsung dari V8 isolate.
Fitur yang killer: branching. Setiap branch adalah database snapshot yang independent — Anda bisa buat branch untuk staging, testing, atau PR preview tanpa tambah biaya signifikan. Workflow-nya: neon branch create → drizzle-kit push ke branch baru → test → merge.
Kelemahan utama: latency cold start saat database idle (free tier bisa 2-5 detik untuk query pertama setelah periode tidak aktif). Untuk production paid tier tidak ada issue karena database tidak sleep. Masalah kedua: free tier 10 concurrent connections bisa bottleneck untuk API dengan traffic spike, misalnya saat promosi atau launch. Estimasi safe: free tier untuk dev/staging, paid untuk production.
Cloudflare Workers
Workers adalah V8 isolate environment — bukan Node.js, bukan container. Ini berarti: startup time ~5ms (bukan cold start 500ms+), tapi ada constraint: tidak ada file system, tidak ada binary, tidak ada Node.js built-in modules.
PoP Jakarta tersedia sejak 2024 — ini signifikan untuk developer Indonesia. Request dari user Jakarta ke Workers Jakarta edge: 10-30ms vs sebelumnya routing ke Singapore atau US yang bisa 80-200ms. Untuk API yang di-hit dari mobile app user Indonesia, ini matter.
Constraint yang perlu diketahui: CPU time limit 50ms per request (free) atau 30 detik (paid). Memory limit 128MB. Untuk endpoint yang butuh heavy computation (image processing, PDF generation), Workers bukan tempatnya.
Setup production: step kritis
Setup awal yang sering bikin stuck:
// wrangler.toml
name = "my-api"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[vars]
DATABASE_URL = "" # set via wrangler secret
# wrangler secret put DATABASE_URL
Jangan lupa compatibility_flags kalau pakai Node.js compatibility layer — beberapa Drizzle helper butuh ini untuk environment tertentu.
Verdict
Pakai bundle ini kalau:
- Tim 1-5 developer, tidak ada dedicated DevOps
- API dengan pola CRUD standar, tidak ada heavy computation per request
- Budget $0-30/bulan untuk infrastruktur (bukan enterprise)
- User mayoritas di Indonesia — benefit dari PoP Jakarta
Pakai alternatif kalau:
- Butuh long-running process atau CPU-intensive task → Railway atau Fly.io dengan Node.js
- Already pakai Prisma dan tidak mau rewrite schema → Neon + Prisma di platform yang support Node.js runtime
- Traffic unpredictable dengan spike ekstrem (concurrent connections Neon jadi bottleneck) → Supabase connection pooler + VPS
Bundle ini bukan “best for everything” — ini best untuk tim kecil yang ingin API jalan production minggu ini, bukan bulan depan. Trade-off biaya vs kontrol ada, tapi untuk tahap awal, simplicity menang.
Konteks lokal: kalau bisnis Anda juga butuh local presence online, panduan GBP untuk SMB di Tangerang bisa jadi pelengkap strategi digital.
Ditulis oleh Asti Larasati