Mengorganisir proyek ElysiaJS: struktur folder untuk small-medium projects, modularisasi dengan plugin per domain, scaling ke microservices, dan graceful shutdown untuk zero-downtime deployment.

Setelah di episode 17 kita memahami testing, pada episode ini kita akan memahami cara mengorganisir proyek ElysiaJS agar tetap bersih dan scalable saat codebase tumbuh. Struktur yang baik mengurangi complexity dan memudahkan tim untuk berkontribusi.
src/
routes/ # route handlers
plugins/ # custom plugins (auth, db, etc.)
schema/ # TypeBox schemas
services/ # business logic
utils/ # helper functions
index.ts # entry pointimport { Elysia } from 'elysia'
import { cors } from '@elysiajs/cors'
import { dbPlugin } from './plugins/database'
import { authPlugin } from './plugins/auth'
import { userRoutes } from './routes/users'
import { postRoutes } from './routes/posts'
import { authRoutes } from './routes/auth'
const app = new Elysia()
.use(cors())
.use(dbPlugin)
.use(authPlugin)
.use(userRoutes)
.use(postRoutes)
.use(authRoutes)
.listen(3000)import { Elysia, t } from 'elysia'
import { db } from '../plugins/database'
import { users } from '../schema/user'
export const userRoutes = (app: Elysia) =>
app
.get('/users', async () => {
return await db.select().from(users)
})
.post('/users', async ({ body }) => {
const [created] = await db.insert(users).values(body).returning()
return created
}, {
body: t.Object({
name: t.String(),
email: t.String({ format: 'email' }),
})
})Setiap domain bisa menjadi plugin terpisah:
import { userPlugin } from './plugins/users'
import { authPlugin } from './plugins/auth'
import { postPlugin } from './plugins/posts'
const app = new Elysia()
.use(userPlugin)
.use(authPlugin)
.use(postPlugin)Ketika proyek tumbuh, satu Elysia app bisa dipecah menjadi multiple microservices:
Setiap microservice adalah Elysia app terpisah, berkomunikasi via HTTP atau gRPC.
const app = new Elysia()
.onStop(() => {
console.log('Shutting down gracefully...')
db.$client.end() // close database connection
})
.listen(3000)
process.on('SIGTERM', () => app.stop())
process.on('SIGINT', () => app.stop())Graceful shutdown memastikan semua request yang sedang berjalan selesai sebelum server berhenti — zero-downtime deployment.
Note
Mulai dengan struktur sederhana dan refactor saat needed. Jangan over-engineer struktur folder untuk proyek yang masih kecil — biarkan kebutuhan nyata yang mengarahkan.
Pada episode 18 ini, kalian telah memahami cara mengorganisir proyek ElysiaJS agar scalable dan mudah dirawat.
Inti yang harus dibawa pulang:
Di episode 19 selanjutnya kita akan memahami deployment — Docker, Vercel, Cloudflare Workers, dan Railway/Fly.io. Sampai jumpa di episode 19!