Dilema Migrasi Belasan Web ke VPS: Dari Cloudflare, Trik Docker, hingga Keputusan Rewrite ke Go
Bismillahirrohmaanirrohiim. Alhamdulillahi Robbil 'Alamiin. Allahumma Sholli 'Alaa Sayyidinaa Muhammad.
Beberapa waktu lalu, saya sempat melempar satu twit pendek yang ternyata memicu cukup banyak tanggapan dari kawan-kawan developer:
"Sedang memikirkan cara migrasi banyak web dan aplikasi dari shared hosting ke VPS. 🫩"
Sederhana, tapi ternyata relatable banget. Dari ratusan tanggapan dan ribuan pembaca, saya sadar kalau dilema ini tidak cuma milik saya. Banyak dari kita yang berada di persimpangan jalan serupa: bertahan di shared hosting yang mulai terasa sempit, atau nekat lompat ke VPS demi fleksibilitas penuh.
Tapi, urusan migrasi kali ini jelas bukan cuma soal pindahtangan file via FTP. Pasalnya, "kebun" aplikasi yang harus dipindahkan bentuknya sangat heterogen:
- Website Publik: CodeIgniter 4 Fullstack.
- Semi Microservices: Service CodeIgniter 4 untuk generate XLSX, PDF, temporary CDN, dan charting; serta service NestJS untuk pipeline media (upload, kompresi, lalu meneruskan ke Cloudinary).
- Aplikasi Utama: Dominan Fastify + Vue.js, serta beberapa aplikasi gabungan CI4 + Vue yang memanfaatkan pustaka mihatorikei/codeigniter-vite.
Memindahkan tumpukan stack selengkap ini butuh strategi eksekusi yang rapi dan terukur. Berikut kronologi bagaimana saya mengeksekusi perpindahan besar ini step-by-step.
Langkah 1: Amankan Gerbang (DNS & Cloudflared)
Sebelum menyentuh kode atau server baru, langkah pertama yang saya lakukan adalah memindahkan seluruh DNS Record dari penyedia hosting lama ke Cloudflare.
Agar VPS baru tidak perlu membuka port HTTP/HTTPS secara terbuka ke publik dan tidak pusing mengurus sertifikat SSL satu per satu, saya memanfaatkan cloudflared (Cloudflare Tunnel) langsung di dalam VPS. Dengan begini, seluruh trafik masuk dienkripsi dengan aman melalui tunnel, tanpa perlu mengekspos IP publik server.
Langkah 2: Pindahkan yang Paling Mudah (Aplikasi Vue / SPA)
Strategi terbaik dalam migrasi masif adalah mencari quick win dulu. Aplikasi berbasis Vue.js (SPA) adalah target paling empuk:
- Saya menyiapkan satu container Docker Nginx Alpine tunggal di VPS.
- Hasil build Vue diproses di lokal, lalu dikirim ke VPS menggunakan scp.
- Folder hasil build dan konfigurasi Nginx tinggal di-mount ke dalam container Nginx tunggal tersebut.
Langkah ini cepat, rapi, dan tidak membebani server karena Nginx Alpine sangat ringan dalam melayani static files.
Langkah 3: Strategi Duplikasi Service (Auth & PDF)
Problem terbesar saat migrasi bertahap adalah ketergantungan antar-aplikasi. Agar tidak ada aplikasi yang pingsan saat masa transisi, saya menerapkan teknik duplikasi service:
- Service Autentikasi: Saya membuat duplikat aplikasi autentikasi (Fastify + Vue) di server VPS baru. Jadi selama proses berjalan, ada dua server auth yang aktif. Aplikasi yang sudah berhasil migrasi ke VPS diarahkan untuk memakai autentikasi di VPS, sementara yang belum tetap memakai server lama.
- Service PDF: Hal yang sama saya terapkan pada service pencetak PDF berbasis CI4. Duplikasi ini memastikan fungsi-fungsi vital bisnis tidak terputus di tengah jalan.
Langkah 4: Realitas Pahit RAM Meluap & Keputusan Rewrite ke Go
Momen krusial terjadi saat saya mulai memindahkan aplikasi utama yang berbasis Fastify + Vue satu per satu.
Awalnya, beberapa service Fastify ini berjalan di atas runtime Bun untuk mengejar kecepatan. Namun, begitu beberapa service Node.js/Bun, PHP-FPM, dan database berkumpul di satu VPS dengan spesifikasi terbatas, RAM server langsung menjerit.
Di sinilah keputusan radikal terpaksa diambil: Rewrite beberapa backend Fastify ke Golang.
Proses rewrite ini memang menambah beban kerja migrasi secara signifikan, tapi hasilnya sangat instan. Aplikasi web hasil kompilasi Go (single binary) berjalan dengan footprint RAM yang luar biasa hemat dan penggunaan CPU yang sangat minim. Ini jadi kompromi terbaik agar seluruh ekosistem tetap muat di VPS tanpa harus force upgrade langganan server.
Langkah 5: Menjinakkan CI4 + Vue & Service Lainnya
Setelah krisis RAM teratasi lewat Go, saatnya membereskan sisa aplikasi PHP (CodeIgniter 4).
Di tahap ini, saya sempat bereksperimen dengan FrankenPHP dalam container Docker untuk satu-dua aplikasi. Performa dan kecepatannya memang tidak perlu diragukan lagi—terasa kencang sekali. Namun, masalahnya kembali ke keterbatasan infrastruktur: FrankenPHP meminta alokasi RAM yang lumayan besar sejak awal (reserved memory at start). Di VPS berspesifikasi hemat, ini kurang ideal.
Akhirnya saya balik ke opsi yang lebih ramah konsumsi memori: 1 container Nginx tunggal + 1 container PHP-FPM (Bitnami). Nginx bertindak sebagai entrypoint, lalu meneruskan eksekusi skrip PHP ke container FPM. Model ini terbukti jauh lebih hemat RAM dan sangat stabil untuk menangani beberapa aplikasi CI4 + Vue (codeigniter-vite) sekaligus.
Catatan Akhir: Musuh Terakhir Bernama Database
Meski aplikasi frontend sudah enteng dan backend sudah dirampingkan ke Go, perjuangan menghemat RAM sebenarnya belum sepenuhnya usai.
Komponen yang pada akhirnya masih "makan tempat" lumayan besar di memori VPS adalah container MariaDB. Karena setelan bawaan (default configuration) MariaDB/MySQL memang rakus RAM jika tidak ditangani, saya terpaksa melakukan sedikit tweak pada konfigurasi innodb_buffer_pool_size dan beberapa alokasi memory limit-nya agar ramah untuk VPS mungil ini.
Detail tweak konfigurasi MariaDB hemat RAM ini bakal saya ulas khusus di postingan terpisah.
Pelajaran Berharga
Migrasi bertahap dari shared hosting ke VPS dengan stack yang warna-warni ini mengajarkan saya banyak hal:
- Jalan Bertahap Lebih Aman daripada Big Bang: Mengisolasi komponen (frontend dulu, duplikasi auth, baru backend) menekan risiko downtime total.
- Docker Tidak Harus 1 Container 1 App: Teknik sharing container (seperti 1 Nginx Alpine untuk banyak build Vue, atau 1 PHP-FPM untuk CI4) sangat ampuh menghemat alokasi RAM.
- Bahasa Pemrograman Adalah Alat: Jangan ragu melakukan rewrite ke bahasa yang lebih efisien seperti Go jika batas infrastruktur memang menuntutnya.
Bagaimana dengan kawan-kawan? Pernah punya pengalaman "kepepet" sampai harus rewrite ulang aplikasi atau memeras habis konfigurasi database demi bisa muat di server yang ada?
Wallahul muwaafiq ilaa aqwaamith thooriq.
Foto oleh Margo Evadson: https://www.pexels.com/id-id/foto/37581727/





Komentar
Posting Komentar