Cara Menjalankan Aplikasi Node.js Terus-Menerus di Server dengan PM2

Cara Menjalankan Aplikasi Node.js Terus-Menerus di Server dengan PM2

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}`);
});
app.js - web server minimal tanpa library tambahan

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
    },
  ],
};
ecosystem.config.js - semua pengaturan aplikasi di satu tempat

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:

  1. npm install pm2 untuk memasang PM2 di project.
  2. npx pm2 start app.js --name halo-app untuk menjalankan aplikasi di latar belakang.
  3. npx pm2 startup systemd agar PM2 ikut menyala saat server boot.
  4. npx pm2 save untuk 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.

0/Post a Comment/Comments

Lebih baru Lebih lama