Remake Personal Website dari Rails ke Padrino
Saya termenung saat menatap layar laptop yang menampilkan output dari perintah docker stats di server mungil yang saya sewa di salah satu provider lokal. Hanya sebuah personal blog, ditambah fitur jual produk digital. Yang ada di dalam pikiran saya: aplikasi ini harusnya tidak memakan RAM server terlalu banyak, karena memang tidak terlalu kompleks. Tapi yang saya dapatkan adalah memory usage sebesar 600 MB!
Secara teknis sebenarnya tidak ada masalah. Server mungil ini memiliki usable RAM sebesar 1.8 GB, jadi masih tersisa sekitar 1.2 GB. Tapi entah kenapa selalu saja ada pikiran seperti "harusnya tidak sebesar ini". Maksud saya, ini hanyalah website untuk personal blog dan jualan produk digital. Apakah memang harus selalu menghabiskan memori sebesar itu?
Website tersebut dibuat menggunakan Ruby on Rails, dengan Solid Queue sebagai adapter background job. Saya pakai Rails karena itu tech stack yang paling saya kuasai. Semua yang diperlukan untuk membangun web app sudah tersedia di Rails. Sebagai gantinya, satu proses web di Rails minimal menghabiskan RAM sekitar 110 MB sampai dengan 120 MB. Angka yang bagi saya cukup tinggi untuk aplikasi sederhana.
Tapi di tahun serba AI ini, membuat sesuatu yang baru menggunakan tech stack yang kita kurang kuasai biayanya jauh lebih rendah. Kualitas LLM sudah meningkat secara signifikan dari tahun-tahun sebelumnya. Meskipun begitu, saya tidak ingin sampai mengganti bahasa. Saya suka Ruby karena sintaksnya yang ekspresif dan elegan. Jadi, saya hanya perlu mencari framework lain yang lebih ringan daripada Rails.
Hampir Membuat Framework Sendiri
Opsi pertama yang terpikirkan oleh saya adalah Hanami. Tapi, setelah melihat hasil kode buatan AI, saya urung menggunakannya karena hasilnya kurang memuaskan. Sepertinya dataset project Hanami yang dipakai untuk training sangat sedikit.
Di sisi lain, saya pernah membuat beberapa proyek menggunakan Sinatra. Sebagai konteks, Sinatra itu bisa dibilang ExpressJS-nya Ruby. Untuk proyek skala kecil seperti SimpleBlog dan SimpleStats, saya merasa bahwa Sinatra sudah sangat cukup.
Tapi, proyek blog dan toko produk digital ini tidak bisa dibilang kecil juga. Ada integrasi dengan pihak ketiga. Ada mekanisme pembelian produk digital. Ada halaman front page dan admin-nya juga. Jadi kalau semua kode disimpan di dalam file app.rb, kodenya akan sangat sulit untuk diurus. Oleh karena itu, saya terpikir untuk membuat framework sendiri yang struktur codebase-nya sama dengan Rails, tapi pakai Sinatra.
Padrino
Framework buatan saya sudah bisa dibilang berjalan sebagaimana mestinya, thanks to Pi dan Deepseek. Di tengah pengembangan itu, saya tiba-tiba ingat sebuah kata, yaitu Padrino. Di pikiran saya, Padrino itu semacam deployment tool dari Ruby. Rupanya saya salah besar! Padrino itu ternyata web framework juga, yang basisnya itu... Sinatra.
Berarti, secara tidak langsung, saya sedang membuat klon dari Padrino, hahaha.
Saat tahu Padrino adalah web framework, saya langsung berhenti prompting dan meminta Deepseek untuk memortir semua kode yang sudah dibuat ke proyek Padrino. Surprisingly, kode yang dibuat oleh AI di project Padrino lebih bagus ketimbang project Hanami, jadi proses portingnya ini berjalan cukup cepat.
Semua yang saya butuhkan sudah tersedia di Padrino, kecuali background job dan recurring job. Background job diperlukan untuk mengirim email notifikasi ke pembeli dan ke saya sendiri saat ada transaksi penjualan. Recurring job diperlukan untuk melakukan database backup. Setelah diskusi dengan AI, pilihan saya jatuh pada sucker_punch dan rufus-scheduler.
Sehingga, berikut adalah tech stack keseluruhan di project Padrino kali ini:
- Web framework: Padrino
- Web server: Puma
- CSS: Sass
- JavaScript: Vanilla JavaScript
- Database: SQLite with WAL mode enabled
- ORM: Sequel
- Background Job:
sucker_punch - Recurring Job:
rufus-scheduler - Testing: Minitest
Hasilnya, aplikasi Padrino hanya menggunakan memori sekitar 80 MB, lebih hemat 86,67% dibandingkan dengan aplikasi Rails! 80 MB itu sudah termasuk background job dan recurring job!
Kenapa Saya Melakukan Ini?
Selain alasan memory usage yang saya sebutkan di awal, alasan lainnya adalah saya ingin punya tech stack alternatif untuk project-project skala kecil-menengah, namun tetap menggunakan bahasa pemrograman favorit saya, yaitu Ruby. Selama ini saya selalu menggunakan Rails untuk semua proyek, tanpa mempertimbangkan alternatif lain yang mungkin lebih pas dengan skala proyek yang sedang dikerjakan. Thanks to AI, berkatnya, cost dan barrier to entry untuk mencoba tech stack baru jadi sangat rendah.
Alasan lainnya adalah… saya ingin menjual kodenya. Untuk menjalankan aplikasi Rails, diperlukan minimal RAM 2 GB dan 1 vCPU supaya aplikasi berjalan dengan baik. Bagi sebagian orang yang baru merintis, menyisihkan uang sekitar 80 sampai 100 ribu per bulan untuk sewa server masih terasa terlalu berat. Jika saya "keukeuh" menggunakan Rails, saya akan kehilangan pasar di segmen ini. Saya menargetkan supaya website ini bisa dijalankan di server dengan RAM 1 GB atau bahkan 512 MB.
Apakah Saya Meninggalkan Rails?
Tentu saja tidak. Saya hanya menambah tech stack baru untuk project skala kecil-menengah, yang fokus kepada konsumsi memory yang kecil. Saya akan tetap menggunakan Rails di project yang cukup kompleks dan konsumsi memory tidak terlalu menjadi pertimbangan, alias klien berkenan untuk menghabiskan budget lebih untuk sewa server yang lebih gahar.
Kalau kamu tertarik untuk punya blog sekaligus toko produk digitalmu sendiri, kamu bisa beli di sini.