Cara Menjalankan Aplikasi Node.js di VPS dengan PM2
Jalankan aplikasi Node.js di VPS dengan PM2 agar tetap hidup setelah terminal ditutup, otomatis restart saat crash, dan menyala lagi setelah reboot.
Jawaban singkat
PM2 adalah process manager untuk Node.js yang menjaga aplikasi tetap berjalan di VPS. Pasang dengan npm, jalankan aplikasi lewat pm2 start atau file ecosystem, lalu pakai pm2 startup dan pm2 save supaya aplikasi menyala lagi setelah server reboot.
Daftar isi
Situasinya hampir selalu sama. Kamu login ke VPS, menjalankan node server.js, aplikasi terbuka di browser, lalu kamu menutup terminal. Beberapa detik kemudian aplikasinya mati. Atau aplikasi bertahan semalam, lalu crash karena satu error yang tidak tertangkap, dan tidak ada yang menyalakannya lagi sampai pelanggan mengeluh.
PM2 dibuat untuk masalah ini. Ia menjalankan aplikasi Node.js di latar belakang, menyalakannya lagi saat crash, menyimpan log, dan bisa memastikan aplikasi otomatis hidup setelah server reboot. Untuk satu sampai beberapa aplikasi di satu VPS, PM2 adalah cara paling ringkas menuju setup yang layak produksi.
Menyiapkan Node.js di server
Langkah pertama adalah Node.js versi yang tepat. Repositori bawaan Ubuntu sering membawa versi yang tertinggal, jadi kebanyakan orang memasang dari sumber yang disebut di halaman unduhan resmi nodejs.org, misalnya lewat pengelola versi seperti nvm atau repositori paket distribusi. Pilih rilis berstatus LTS, karena itulah yang dirawat dalam jangka panjang. Status tiap versi bisa kamu cek di halaman rilis nodejs.org.
Jalankan aplikasi dengan pengguna biasa, bukan root. Buat pengguna khusus, misalnya app, letakkan kode di /home/app/tokoku, lalu pasang dependensi dengan npm ci --omit=dev. Perintah npm ci memasang persis sesuai package-lock.json, sehingga hasil di server sama dengan yang kamu uji.
Setelah itu, pasang PM2 secara global dengan npm install -g pm2. Bila Node.js dipasang lewat nvm, PM2 terpasang di bawah pengguna tersebut dan tidak butuh sudo.
Bagaimana menjalankan aplikasi dengan PM2?
Cara tercepat adalah satu perintah:
pm2 start server.js --name tokoku
Kalau aplikasimu dijalankan lewat skrip npm (umum di Next.js atau NestJS), bentuknya:
pm2 start npm --name tokoku -- start
Untuk jangka panjang, simpan pengaturan di file ecosystem supaya tidak bergantung pada ingatan. Buat kerangkanya dengan pm2 init simple, lalu sesuaikan ecosystem.config.js:
module.exports = {
apps: [{
name: "tokoku",
script: "./server.js",
cwd: "/home/app/tokoku",
instances: 2,
exec_mode: "cluster",
max_memory_restart: "400M",
env: {
NODE_ENV: "production",
PORT: 3000
}
}]
}
Jalankan dengan pm2 start ecosystem.config.js. Dua opsi di atas layak diperhatikan. exec_mode: "cluster" dengan instances: 2 membuat dua proses yang berbagi port yang sama, sehingga beban terbagi ke dua inti CPU. Isi "max" untuk memakai semua inti. Sementara max_memory_restart menyalakan ulang proses yang pemakaian memorinya melewati batas, berguna untuk aplikasi yang memorinya bocor perlahan.
Mode cluster hanya cocok untuk aplikasi yang tidak menyimpan state di memori proses, seperti sesi login di variabel. Simpan sesi di Redis atau database bila ingin memakai lebih dari satu instance.
Perintah harian yang paling sering dipakai
Setelah aplikasi berjalan, sebagian besar pekerjaan sehari-hari hanya memakai segelintir perintah:
| Perintah | Fungsi |
|---|---|
pm2 list | Melihat semua aplikasi, status, CPU, dan memori |
pm2 logs tokoku | Mengikuti log aplikasi secara langsung |
pm2 monit | Dasbor pemantauan di terminal |
pm2 restart tokoku | Mematikan lalu menyalakan ulang |
pm2 reload tokoku | Memuat ulang tanpa jeda layanan (mode cluster) |
pm2 stop tokoku | Menghentikan aplikasi |
pm2 delete tokoku | Menghapus aplikasi dari daftar PM2 |
Saat deploy versi baru, alurnya cukup git pull, npm ci --omit=dev, build bila perlu, lalu pm2 reload tokoku. Di mode cluster, reload mengganti proses satu per satu sehingga pengunjung tidak melihat aplikasi mati.
Log PM2 disimpan di ~/.pm2/logs/ dan akan terus membesar. Modul pm2-logrotate (dipasang dengan pm2 install pm2-logrotate) memotong dan merotasi file log agar disk tidak penuh diam-diam.
Bagaimana agar aplikasi hidup lagi setelah reboot?
Ini langkah yang paling sering terlupa. Tanpa pengaturan startup, PM2 sendiri tidak ikut menyala ketika VPS dinyalakan ulang.
Jalankan pm2 startup sebagai pengguna aplikasi, tanpa sudo. PM2 mendeteksi sistem init (systemd di Ubuntu dan Debian) lalu mencetak satu perintah berawalan sudo env PATH=.... Salin dan jalankan perintah itu persis seperti yang tertulis. Setelah semua aplikasi berjalan sesuai keinginan, simpan daftarnya dengan pm2 save. Saat reboot, PM2 akan memulihkan daftar yang tersimpan itu.
Dokumentasi PM2 juga mengingatkan satu hal: setelah upgrade Node.js, skrip startup masih menunjuk ke biner lama. Jalankan pm2 unstartup, eksekusi perintah yang dicetaknya, lalu ulangi pm2 startup dan pm2 save. Uji sesekali dengan benar-benar me-reboot server di jam sepi.
Menaruh Nginx di depan aplikasi
Aplikasi Node.js biasanya mendengarkan port seperti 3000. Membuka port itu langsung ke internet bukan kebiasaan yang baik. Lebih rapi bila Nginx menerima trafik di port 80 dan 443, mengurus HTTPS, lalu meneruskan request ke 127.0.0.1:3000. Konsep ini dijelaskan di artikel apa itu reverse proxy.
Bagian inti konfigurasinya:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Dua baris terakhir diperlukan bila aplikasimu memakai WebSocket. Untuk aplikasi yang tidak memakainya, keduanya tetap aman. Setelah itu pasang sertifikat dengan Let's Encrypt dan Certbot, dan pastikan firewall hanya membuka port SSH, 80, dan 443, misalnya dengan UFW di Ubuntu 24.04. Supaya port 3000 benar-benar tertutup dari luar, atur aplikasi agar mendengarkan 127.0.0.1 saja.
Saat PM2 tidak lagi cukup
PM2 nyaman untuk satu server dengan beberapa aplikasi. Bila kamu mulai mengelola banyak server, butuh lingkungan yang identik antara laptop dan produksi, atau ingin rollback berbasis image, container dengan Docker mungkin lebih cocok. Banyak tim juga memakai systemd langsung tanpa PM2. Keduanya sah. PM2 unggul di kemudahan: mode cluster, reload tanpa jeda, dan log yang langsung terbaca dari satu perintah.
Ringkasnya, jalankan aplikasi sebagai pengguna biasa, kelola dengan file ecosystem, aktifkan pm2 startup dan pm2 save, rotasi log, lalu sembunyikan port aplikasi di belakang Nginx dengan HTTPS. Dengan lima kebiasaan itu, aplikasi Node.js di VPS tidak lagi bergantung pada terminal yang terbuka.


