Belajar ElysiaJS - Production Checklist & Best Practice
Episode 20 of 21

Belajar ElysiaJS - Production Checklist & Best Practice

Checklist production-grade untuk ElysiaJS: environment variables dengan Bun.env, structured logging, error handling global dengan onError dan notFound, health check endpoint, dan CI/CD pipeline dengan GitHub Actions.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 19 kita memahami deployment, pada episode ini kita akan menutup series dengan production checklist — daftar lengkap yang harus dipenuhi sebelum aplikasi ElysiaJS di-deploy ke production.

Environment Variables

Menggunakan Bun.env

Akses environment variables
const port = Number(Bun.env.PORT) || 3000
const jwtSecret = Bun.env.JWT_SECRET
const databaseUrl = Bun.env.DATABASE_URL

.env untuk Development

Buat file .env untuk local development:

File .env untuk development
PORT=3000
JWT_SECRET=your-secret-key-here
DATABASE_URL=file:local.db
NODE_ENV=development

Secret Manager untuk Production

Jangan pernah hardcode secrets di source code. Gunakan secret manager dari platform deployment:

  • Vercel: Environment Variables di dashboard.
  • Railway: Variables di settings.
  • Cloudflare Workers: Secrets via wrangler secret put.

Logging

Mengapa Console.log Tidak Cukup

console.log tidak punya structured data — sulit difilter dan dianalisis di production. Gunakan structured logging:

Structured logging dengan JSON
function log(level: string, message: string, meta?: Record<string, any>) {
  console.log(JSON.stringify({
    timestamp: new Date().toISOString(),
    level,
    message,
    ...meta,
  }))
}
 
// Penggunaan
log('info', 'User created', { userId: 123, email: 'john@example.com' })
log('error', 'Database error', { error: 'Connection refused', query: 'SELECT...' })

Logger Library

Untuk production, gunakan library logging seperti pino:

Install pino logger
bun add pino
Setup pino logger
import pino from 'pino'
 
const logger = pino({
  level: Bun.env.LOG_LEVEL || 'info',
})
 
app.onBeforeHandle(({ request }) => {
  logger.info({ method: request.method, url: request.url }, 'Incoming request')
})

Error Handling Global

onError Handler

Global error handler
app.onError(({ code, error, set }) => {
  logger.error({ code, error: error.message }, 'Unhandled error')
 
  switch (code) {
    case 'VALIDATION':
      set.status = 422
      return { error: 'Validation failed', details: error.message }
    case 'NOT_FOUND':
      set.status = 404
      return { error: 'Resource not found' }
    default:
      set.status = 500
      return { error: 'Internal server error' }
  }
})

notFound Handler

404 handler
app.notFound(({ set }) => {
  set.status = 404
  return { error: 'Route not found' }
})

Health Check Endpoint

Health check endpoint
app.get('/health', async ({ db }) => {
  try {
    await db.execute('SELECT 1')
    return {
      status: 'ok',
      timestamp: Date.now(),
      uptime: process.uptime(),
    }
  } catch (error) {
    return { status: 'error', message: 'Database unreachable' }
  }
})

Health check penting untuk load balancer dan monitoring system.

CI/CD Pipeline

GitHub Actions

.github/workflows/deploy.yml
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
        run: # deployment command

Pipeline yang Sehat

Pipeline ideal: lint → test → build → deploy. Setiap step harus lolos sebelum step berikutnya dijalankan.

Note

Production readiness bukan sekadar kode yang berfungsi. Logging, error handling, health check, dan CI/CD adalah fondasi yang memastikan aplikasi bisa diandalkan dan dipelihara dalam jangka panjang.

Penutup

Episode 20 adalah episode terakhir dari series Belajar ElysiaJS. Kalian telah menempuh perjalanan lengkap dari pre-requisites hingga production readiness.

Inti yang harus dibawa pulang:

  • Environment variables: Bun.env untuk development, secret manager untuk production.
  • Structured logging untuk observability production.
  • app.onError() dan app.notFound() untuk error handling global.
  • Health check endpoint untuk monitoring.
  • CI/CD pipeline: lint → test → build → deploy.

Selamat! Kalian telah menyelesaikan series Belajar ElysiaJS. Dari episode 0 hingga 20, kalian telah menguasai semua aspek penting untuk membangun API backend performa tinggi dengan ElysiaJS. Teruslah berlatih, bangun proyek nyata, dan jangan ragu untuk menjelajahi ekosistem plugin yang terus berkembang. Semangat!

Belajar ElysiaJS - Production Checklist & Best Practice | Belajar ElysiaJS