Kenapa aplikasi mati saat terminal ditutup?
Saat kamu mengetik node app.js atau
npm run start, aplikasi berjalan sebagai "anak" dari sesi
terminal kamu. Begitu sesi SSH ditutup, koneksi putus, atau kamu menekan
Ctrl + C, sesi itu berakhir dan aplikasinya ikut
berhenti.
Masalahnya tidak berhenti di situ. Tanpa alat bantu:
- kalau aplikasi crash karena error, tidak ada yang menyalakannya lagi;
- kalau server reboot, kamu harus login dan menjalankannya manual;
- log aplikasi hilang begitu terminal ditutup.
Di sinilah PM2 berguna.
Apa itu PM2?
PM2 adalah process manager untuk Node.js. Sederhananya, PM2 adalah "penjaga" yang menjalankan aplikasi kamu di latar belakang dan memastikan aplikasi itu tetap hidup. Fitur utamanya:
- Berjalan di latar belakang, tidak bergantung pada terminal.
- Restart otomatis saat aplikasi crash.
- Menyala otomatis setelah server reboot.
- Menyimpan log ke file, jadi bisa dibaca kapan saja.
- Mengelola banyak aplikasi sekaligus dari satu perintah.
PM2 bersifat open source dan gratis.
Contoh aplikasi sederhana
Supaya fokus ke PM2, kita pakai aplikasi paling sederhana: web server yang membalas "Halo dari server!". Buat folder project lalu masuk ke dalamnya:
mkdir halo-app
cd halo-app
npm init -y
Buat file app.js:
const http = require('http');
const PORT = process.env.PORT || 3000;
const server = http.createServer((req, res) => {
res.end('Halo dari server!');
});
server.listen(PORT, () => {
console.log(`Server berjalan di port ${PORT}`);
});
Coba jalankan dengan cara biasa:
node app.js
Buka http://IP-SERVER:3000 di browser dan tulisan "Halo dari
server!" akan muncul. Sekarang tekan Ctrl + C:
aplikasinya mati. Ini masalah yang akan kita selesaikan.
Langkah 1: Install PM2
PM2 bisa diinstall di dalam project. Dengan cara ini versinya tercatat di
package.json, sehingga setiap server yang menjalankan
npm install akan memakai versi PM2 yang sama.
npm install pm2
Cek apakah sudah terpasang:
npx pm2 --version
Kenapa pakai npx? Karena PM2 diinstall di
folder node_modules project, bukan di sistem.
npx menjalankan PM2 dari folder project tersebut. Kalau kamu
lebih suka install global (npm install -g pm2), cukup hapus
kata npx dari semua perintah di artikel ini.
Langkah 2: Jalankan aplikasi dengan PM2
Ganti node app.js dengan perintah ini:
npx pm2 start app.js --name halo-app
Opsi --name memberi nama aplikasi, supaya mudah dipanggil
nanti. PM2 akan menampilkan tabel seperti ini:
┌────┬──────────┬─────────┬──────┬────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ memory │
├────┼──────────┼─────────┼──────┼────────┼──────────┤
│ 0 │ halo-app │ fork │ 0 │ online │ 40.1mb │
└────┴──────────┴─────────┴──────┴────────┴──────────┘
Status online berarti aplikasi sudah berjalan di latar
belakang. Sekarang coba tutup terminal SSH, lalu buka lagi
http://IP-SERVER:3000. Aplikasinya tetap hidup.
Langkah 3: Cek status dan log
Untuk melihat daftar aplikasi yang dijaga PM2:
npx pm2 status
Untuk melihat log (output console.log dan error):
npx pm2 logs halo-app
Tekan Ctrl + C untuk keluar dari tampilan log.
Tenang, ini hanya menutup tampilan log, aplikasinya tetap berjalan. Log
juga disimpan ke file di folder ~/.pm2/logs/.
Untuk memantau pemakaian CPU dan memori secara langsung:
npx pm2 monit
Langkah 4: Menyala otomatis setelah server reboot
Sampai di sini aplikasi tetap hidup walaupun terminal ditutup. Tapi kalau server reboot, PM2 sendiri belum ikut menyala. Kita perlu dua perintah.
a. Daftarkan PM2 ke sistem
npx pm2 startup systemd
Kalau kamu login sebagai user biasa (bukan root), PM2 akan menampilkan
satu baris perintah yang diawali sudo env PATH=....
Salin dan jalankan perintah itu. Perintah tersebut
mendaftarkan PM2 sebagai service systemd yang menyala setiap kali server
boot.
b. Simpan daftar aplikasi
npx pm2 save
Perintah ini menyimpan daftar aplikasi yang sedang berjalan saat itu. Setelah reboot, PM2 akan menyalakan kembali semua aplikasi di daftar tersebut.
Penting: setiap kali kamu menambah atau menghapus
aplikasi di PM2, jalankan npx pm2 save lagi. Kalau lupa,
kondisi setelah reboot akan kembali ke daftar lama.
Untuk menguji, reboot server lalu cek lagi:
sudo reboot
# setelah login kembali:
npx pm2 status
Langkah 5 (opsional): File konfigurasi
Mengetik opsi di command line lama-lama merepotkan. PM2 bisa membaca
pengaturan dari file bernama ecosystem.config.js. Buat file
ini di folder project:
module.exports = {
apps: [
{
name: 'halo-app',
script: 'app.js',
env: {
NODE_ENV: 'production',
PORT: 3000,
},
max_memory_restart: '300M', // restart otomatis kalau memori melewati 300 MB
},
],
};
Sekarang cukup jalankan:
npx pm2 start ecosystem.config.js
npx pm2 save
Keuntungannya, pengaturan aplikasi tersimpan di file yang bisa di-commit ke Git, jadi tim kamu menjalankan aplikasi dengan cara yang sama persis.
Kalau package.json project kamu berisi
"type": "module", beri nama file
ecosystem.config.cjs supaya sintaks
module.exports tetap bisa dibaca.
Bagaimana dengan Next.js?
Caranya sama. Bedanya, yang dijalankan adalah server bawaan Next.js. Build dulu aplikasinya:
npm run build
Lalu buat ecosystem.config.js:
module.exports = {
apps: [
{
name: 'web-next',
script: 'node_modules/next/dist/bin/next',
args: 'start -p 3000',
env: { NODE_ENV: 'production' },
},
],
};
Di sini PM2 memanggil binary next langsung, bukan lewat
npm run start. Dengan begitu sinyal stop dan restart dari PM2
diterima langsung oleh Next.js, bukan tertahan di proses npm.
Setiap kali ada perubahan kode:
npm run build && npx pm2 restart web-next
Daftar perintah PM2 yang sering dipakai
| Perintah | Fungsi |
|---|---|
npx pm2 start app.js --name nama |
Menjalankan aplikasi baru |
npx pm2 status |
Melihat semua aplikasi dan statusnya |
npx pm2 logs nama |
Melihat log aplikasi |
npx pm2 restart nama |
Menyalakan ulang aplikasi |
npx pm2 stop nama |
Menghentikan aplikasi (masih ada di daftar) |
npx pm2 delete nama |
Menghapus aplikasi dari daftar PM2 |
npx pm2 monit |
Memantau CPU dan memori secara langsung |
npx pm2 save |
Menyimpan daftar aplikasi untuk dinyalakan setelah reboot |
npx pm2 startup systemd |
Mendaftarkan PM2 agar menyala saat server boot |
npx pm2 unstartup systemd |
Membatalkan pendaftaran saat boot |
Tips keamanan dan kesalahan umum
1. Jangan jalankan aplikasi sebagai root
Buat user khusus untuk aplikasi, lalu jalankan PM2 dari user tersebut. Kalau aplikasi punya celah keamanan, penyerang hanya mendapat hak akses user biasa, bukan seluruh server.
2. Batasi akses port
Jangan biarkan port aplikasi terbuka ke seluruh internet kalau tidak
perlu. Pakai firewall, misalnya ufw, atau taruh aplikasi di
belakang reverse proxy seperti Nginx:
sudo ufw allow from IP-KAMU to any port 3000
3. Lupa menjalankan pm2 save
Ini penyebab paling umum aplikasi "hilang" setelah reboot. Biasakan
menjalankan
npx pm2 save setiap kali daftar aplikasi berubah.
4. Memindahkan folder project
Kalau PM2 diinstall di dalam project, service systemd mencatat lokasi PM2
di folder
node_modules project tersebut. Jika folder project dipindah
atau node_modules dihapus, jalankan ulang
npx pm2 startup systemd.
5. Jangan pakai mode --watch di production
Opsi --watch me-restart aplikasi setiap ada file berubah.
Berguna saat development, tapi di production bisa membuat aplikasi restart
tanpa sengaja, misalnya saat file log atau upload berubah.
FAQ
Apa bedanya PM2 dengan nohup atau screen?
nohup dan screen hanya menjaga proses tetap
hidup setelah terminal ditutup. PM2 juga menyalakan ulang aplikasi saat
crash, menyimpan log, menampilkan status semua aplikasi, dan bisa
menyalakan aplikasi otomatis setelah server reboot.
Apakah PM2 harus diinstall global?
Tidak. PM2 bisa diinstall di dalam project dengan
npm install pm2 lalu dipanggil dengan npx pm2.
Cara ini membuat versi PM2 tercatat di
package.json sehingga sama di setiap server.
Apakah PM2 hanya untuk Node.js?
PM2 paling sering dipakai untuk Node.js, tetapi juga bisa menjalankan script lain seperti Python atau Bash dengan menentukan interpreter-nya.
Kenapa aplikasi tidak menyala lagi setelah server reboot?
Biasanya karena pm2 startup belum dijalankan, atau
pm2 save lupa dijalankan setelah menambah aplikasi baru.
pm2 startup mendaftarkan PM2 ke systemd, sedangkan
pm2 save menyimpan daftar aplikasi yang harus dinyalakan
kembali.
Kesimpulan
Agar aplikasi Node.js tetap berjalan di server, cukup ingat empat langkah ini:
npm install pm2untuk memasang PM2 di project.-
npx pm2 start app.js --name halo-appuntuk menjalankan aplikasi di latar belakang. -
npx pm2 startup systemdagar PM2 ikut menyala saat server boot. npx pm2 saveuntuk menyimpan daftar aplikasi.
Dengan empat langkah itu, aplikasi kamu tidak lagi mati saat terminal ditutup, otomatis bangkit saat crash, dan menyala sendiri setelah server reboot.

Posting Komentar