Checklist production-grade untuk Hono: environment variables dengan c.env, structured logging, error handling global dengan onError dan notFound, health check endpoint, CI/CD pipeline, dan monitoring dengan Cloudflare Analytics.

Setelah di episode 19 kita memahami deployment, pada episode ini kita akan menutup series dengan production checklist — daftar lengkap yang harus dipenuhi sebelum aplikasi Hono di-deploy ke production.
app.get('/config', (c) => {
const dbUrl = c.env.DATABASE_URL
const apiKey = c.env.API_KEY
return c.json({ dbUrl, apiKey })
})const port = Number(process.env.PORT) || 3000
const jwtSecret = process.env.JWT_SECRETJangan pernah hardcode secrets. Gunakan:
wrangler secret put SECRET_NAMEfunction log(level: string, message: string, meta?: Record<string, any>) {
console.log(JSON.stringify({
timestamp: new Date().toISOString(),
level,
message,
...meta,
}))
}
// Penggunaan
app.use('*', async (c, next) => {
const start = Date.now()
await next()
const duration = Date.now() - start
log('info', 'Request processed', {
method: c.req.method,
path: c.req.path,
status: c.res.status,
duration,
})
})import pino from 'pino'
const logger = pino({
level: 'info',
transport: process.env.NODE_ENV === 'development'
? { target: 'pino-pretty' }
: undefined,
})app.onError((err, c) => {
console.error(`Error: ${err.message}`)
if (err.message.includes('validation')) {
return c.json({ error: 'Validation failed' }, 400)
}
return c.json({ error: 'Internal server error' }, 500)
})app.notFound((c) => {
return c.json({ error: 'Route not found' }, 404)
})app.get('/health', (c) => {
return c.json({
status: 'ok',
timestamp: Date.now(),
version: '1.0.0',
})
})Untuk Workers dengan D1:
app.get('/health', async (c) => {
try {
await c.env.DB.prepare('SELECT 1').run()
return c.json({ status: 'ok', database: 'connected' })
} catch {
return c.json({ status: 'error', database: 'disconnected' }, 503)
}
})name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- run: bun install --frozen-lockfile
- run: bun run lint
- run: bun test
- run: bun run build
- name: Deploy to Cloudflare
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CF_API_TOKEN }}
command: deployCloudflare Workers mendukung preview deployment per-branch — setiap push ke branch non-main menghasilkan preview URL otomatis.
Cloudflare dashboard menyediakan:
app.use('*', async (c, next) => {
const start = performance.now()
await next()
const duration = performance.now() - start
// Kirim metrics ke monitoring service
if (duration > 100) {
console.warn(`Slow request: ${c.req.method} ${c.req.path} ${duration}ms`)
}
})Note
Production readiness bukan sekadar kode yang berfungsi. Logging, error handling, health check, monitoring, dan CI/CD adalah fondasi yang memastikan aplikasi bisa diandalkan dan dipelihara dalam jangka panjang.
Episode 20 adalah episode terakhir dari series Belajar HonoJS. Kalian telah menempuh perjalanan lengkap dari pre-requisites hingga production readiness.
Inti yang harus dibawa pulang:
c.env untuk Workers, process.env untuk Node.js/Bun.app.onError() dan app.notFound() untuk error handling global.Selamat! Kalian telah menyelesaikan series Belajar HonoJS. Dari episode 0 hingga 20, kalian telah menguasai semua aspek penting untuk membangun API ultra-fast yang berjalan di semua JavaScript runtime. Hono adalah framework yang sangat powerful untuk era edge computing — teruslah berlatih, bangun proyek nyata, dan manfaatkan ekosistem yang terus berkembang. Semangat!