Cara Menginstal Node.js dan PM2 di Ubuntu: Panduan Produksi Lengkap
Node.js adalah runtime JavaScript asinkron berbasis event yang dibangun di atas mesin V8 Chrome, dirancang untuk mengeksekusi kode JavaScript di sisi server dengan throughput tinggi. PM2 adalah process manager tingkat produksi untuk aplikasi Node.js yang menyediakan daemonisasi, pemulihan crash otomatis, agregasi log, load balancing mode cluster, dan pembuatan skrip startup — semuanya dari satu antarmuka CLI.
Panduan ini mencakup setiap metode instalasi, opsi konfigurasi, dan pola operasional yang Anda butuhkan untuk menjalankan aplikasi Node.js secara andal di Ubuntu 20.04, 22.04, atau 24.04 LTS dalam lingkungan produksi.
Prasyarat
Sebelum melanjutkan, konfirmasi hal-hal berikut:
- Sistem operasi: Ubuntu 20.04, 22.04, atau 24.04 LTS (server atau desktop)
- Hak pengguna: `sudo` atau akses root
- Akses jaringan: HTTPS keluar untuk mengunduh paket dan skrip
- curl terinstal: Jalankan `sudo apt install curl -y` jika belum ada
Jika Anda menjalankan ini di server cloud, lingkungan VPS Hosting adalah target deployment paling umum untuk beban kerja Node.js, dan semua yang ada dalam panduan ini berlaku secara langsung.
Langkah 1: Perbarui Paket Sistem
Selalu sinkronkan indeks paket Anda dan terapkan pembaruan yang tertunda sebelum menginstal perangkat lunak baru. Metadata paket yang usang adalah sumber umum konflik dependensi.
“`bash
sudo apt update
sudo apt upgrade -y
“`
Setelah pembaruan selesai, reboot jika kernel diperbarui:
“`bash
sudo reboot
“`
Langkah 2: Instal Node.js — Memilih Metode yang Tepat
Ada tiga metode instalasi utama untuk Node.js di Ubuntu. Masing-masing memiliki trade-off yang berbeda dalam hal kontrol versi, isolasi, dan ketersediaan di seluruh sistem.
Perbandingan Metode
| Fitur | NodeSource (apt) | NVM | System apt (universe) |
|---|
| — | — | — | — |
|---|
| Kontrol versi | Satu versi major yang dipinned | Beberapa versi per pengguna | Biasanya LTS yang sudah usang |
|---|
| Instalasi seluruh sistem | Ya | Tidak (per-pengguna secara default) | Ya |
|---|
| Pergantian versi | Perlu menjalankan ulang skrip setup | `nvm use <version>` | Tidak didukung |
|---|
| Terbaik untuk | CI/CD, server satu versi | Pengembangan, multi-proyek | Pengujian cepat saja |
|---|
| sudo diperlukan untuk npm globals | Ya | Tidak | Ya |
|---|
| Kesesuaian produksi | Tinggi | Sedang | Rendah |
|---|
Metode 1: Instal Node.js via NodeSource (Direkomendasikan untuk Server)
NodeSource memelihara repositori Debian/Ubuntu yang selalu diperbarui untuk setiap lini rilis Node.js yang aktif. Ini adalah pendekatan yang disukai untuk server produksi di mana satu versi yang stabil diperlukan di seluruh sistem.
Tambahkan repositori NodeSource untuk rilis LTS saat ini:
“`bash
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash –
“`
Skrip ini melakukan beberapa tindakan: mendeteksi versi Ubuntu Anda, menambahkan repositori apt NodeSource yang sesuai, mengimpor kunci penandatanganan GPG, dan menjalankan `apt-get update`. Flag `-E` mempertahankan variabel lingkungan Anda saat eskalasi ke sudo, yang penting jika Anda memiliki pengaturan proxy yang dikonfigurasi.
Instal Node.js dan npm:
“`bash
sudo apt install nodejs -y
“`
Paket NodeSource menggabungkan `node` dan `npm` dalam satu paket `nodejs`. Tidak seperti paket universe Ubuntu, keduanya tidak dipisahkan.
Verifikasi instalasi:
“`bash
node -v
npm -v
“`
Contoh output yang diharapkan:
“`
v20.14.0
10.7.0
“`
Pinning ke versi major tertentu: Jika Anda membutuhkan Node.js 18 alih-alih LTS saat ini, ganti `setup_lts.x` dengan `setup_18.x` dalam perintah curl. Stream yang tersedia meliputi `setup_18.x`, `setup_20.x`, dan `setup_22.x`.
Metode 2: Instal Node.js via NVM (Direkomendasikan untuk Pengembangan dan Lingkungan Multi-Versi)
NVM (Node Version Manager) menginstal Node.js ke direktori home Anda, tidak memerlukan hak root untuk Node.js itu sendiri maupun paket npm yang diinstal secara global. Ini menghilangkan masalah izin yang umum terjadi saat menjalankan `npm install -g` pada Node.js yang diinstal di sistem.
Instal NVM:
“`bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
“`
Periksa repositori NVM resmi untuk tag rilis terbaru sebelum menjalankan perintah ini — nomor versi dalam URL berubah setiap rilis.
Muat ulang lingkungan shell Anda:
“`bash
source ~/.bashrc
“`
Jika Anda menggunakan Zsh, source `~/.zshrc` sebagai gantinya. Installer NVM menambahkan blok inisialisasinya ke file konfigurasi shell mana pun yang terdeteksi.
Instal versi LTS terbaru dari Node.js:
“`bash
nvm install –lts
“`
Instal versi tertentu bersamaan dengan LTS:
“`bash
nvm install 18
nvm install 20
“`
Beralih antara versi yang terinstal:
“`bash
nvm use 20
nvm alias default 20
“`
Perintah `alias default` menetapkan versi yang aktif di sesi shell baru, yang sangat penting untuk skrip dan cron job yang tidak men-source profil shell interaktif Anda.
Verifikasi:
“`bash
node -v
npm -v
“`
Jebakan kritis NVM untuk produksi: Karena NVM bersifat per-pengguna, skrip startup PM2 dan unit systemd tidak akan memiliki akses ke binary Node.js yang dikelola NVM kecuali Anda mengonfigurasi path secara eksplisit. Lihat Langkah 5 untuk cara menangani ini dengan benar.
Langkah 3: Instal PM2
PM2 didistribusikan sebagai paket npm dan harus diinstal secara global agar CLI-nya tersedia di seluruh sistem.
Instal PM2:
“`bash
sudo npm install -g pm2
“`
Jika Anda menginstal Node.js via NVM, hilangkan `sudo`:
“`bash
npm install -g pm2
“`
Verifikasi instalasi:
“`bash
pm2 -v
“`
Instal versi PM2 tertentu (berguna saat melakukan pinning infrastruktur):
“`bash
sudo npm install -g pm2@5.3.1
“`
PM2 versi 5.x adalah lini stabil saat ini. Versi ini memperkenalkan peningkatan signifikan pada dasbor web (pm2 plus), rotasi log, dan sistem modul dibandingkan v4.
Langkah 4: Mengelola Aplikasi Node.js dengan PM2
Memulai Aplikasi
Navigasikan ke direktori aplikasi Anda dan mulai:
“`bash
cd /var/www/my-app
pm2 start app.js –name "my-app"
“`
Selalu tetapkan flag `–name`. Tanpanya, PM2 menggunakan nama file sebagai nama proses, yang menjadi ambigu ketika Anda memiliki beberapa layanan.
Memulai dengan opsi tambahan:
“`bash
pm2 start app.js –name "my-app" –watch –max-memory-restart 300M
“`
- `–watch`: Memulai ulang proses ketika file sumber berubah (berguna di staging, tidak direkomendasikan di produksi)
- `–max-memory-restart 300M`: Secara otomatis memulai ulang proses jika melebihi 300 MB memori RSS — perlindungan penting terhadap kebocoran memori
Melihat Proses yang Berjalan
“`bash
pm2 list
“`
Ini menampilkan tabel yang menunjukkan ID proses, nama, mode (fork/cluster), PID, status, penggunaan CPU, konsumsi memori, dan jumlah restart.
Untuk dasbor real-time:
“`bash
pm2 monit
“`
Mengontrol Proses
“`bash
pm2 restart my-app # Graceful restart
pm2 reload my-app # Zero-downtime reload (cluster mode only)
pm2 stop my-app # Stop without removing from process list
pm2 delete my-app # Stop and remove from process list
“`
Perbedaan antara `restart` dan `reload`: `restart` mematikan proses dan memulai yang baru, menyebabkan downtime singkat. `reload` (hanya tersedia dalam mode cluster) menggilir worker satu per satu, mempertahankan ketersediaan sepanjang proses. Selalu gunakan `reload` dalam deployment cluster produksi.
Manajemen Log
“`bash
pm2 logs # Stream logs from all processes
pm2 logs my-app # Stream logs for a specific process
pm2 logs my-app –lines 200 # Show last 200 lines
pm2 flush # Clear all log files
“`
PM2 menyimpan log di `~/.pm2/logs/` secara default. Untuk server produksi, instal modul rotasi log untuk mencegah kehabisan disk:
“`bash
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 10
pm2 set pm2-logrotate:compress true
“`
Ini merotasi log ketika mencapai 50 MB, menyimpan 10 arsip terkompresi, dan mencegah pertumbuhan log yang tidak terkendali — masalah umum pada server yang berjalan lama yang sering diabaikan hingga ruang disk habis.
Langkah 5: Konfigurasi PM2 untuk Mulai saat Boot Sistem
PM2 harus dikonfigurasi agar tetap berjalan setelah server reboot. Ini ditangani melalui unit layanan systemd yang dihasilkan oleh PM2 itu sendiri.
Hasilkan perintah startup:
“`bash
pm2 startup
“`
PM2 akan menampilkan perintah yang disesuaikan dengan sistem init dan pengguna saat ini. Tampilannya seperti ini:
“`
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu –hp /home/ubuntu
“`
Salin dan jalankan perintah tersebut persis seperti adanya. Jangan modifikasi — path ke binary PM2 dan direktori home harus sesuai dengan konfigurasi sistem Anda.
Konfigurasi startup khusus NVM: Jika Anda menginstal Node.js via NVM, path dalam perintah yang dihasilkan akan menunjuk ke binary yang dikelola NVM. Ini sudah benar, tetapi Anda harus memastikan versi NVM ditetapkan sebagai default sebelum menjalankan `pm2 startup`:
“`bash
nvm alias default 20
pm2 startup
“`
Simpan daftar proses saat ini:
“`bash
pm2 save
“`
Ini menulis daftar proses ke `~/.pm2/dump.pm2`. Saat reboot, unit systemd membaca file ini dan memulihkan semua proses yang tersimpan. Jika Anda menambah atau menghapus aplikasi nanti, jalankan `pm2 save` lagi untuk memperbarui snapshot.
Verifikasi unit systemd aktif:
“`bash
systemctl status pm2-ubuntu
“`
Ganti `ubuntu` dengan nama pengguna Anda yang sebenarnya.
Langkah 6: Deployment Produksi dengan File Ekosistem PM2
Untuk aplikasi yang lebih dari sekadar skrip tunggal, gunakan file konfigurasi ekosistem PM2. File ini menyediakan definisi proses yang dapat direproduksi dan dikontrol versinya, serta menghilangkan kebutuhan untuk mengingat flag CLI yang panjang.
Membuat File Ekosistem
“`bash
pm2 ecosystem
“`
Ini membuat `ecosystem.config.js` di direktori saat ini.
Konfigurasi Ekosistem Siap Produksi
“`javascript
module.exports = {
apps: [
{
name: 'api-server',
script: './src/server.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
max_memory_restart: '500M',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
error_file: '/var/log/pm2/api-server-error.log',
out_file: '/var/log/pm2/api-server-out.log',
merge_logs: true,
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 8080
}
},
{
name: 'worker',
script: './src/worker.js',
instances: 2,
exec_mode: 'fork',
cron_restart: '0 2 * * *',
env_production: {
NODE_ENV: 'production'
}
}
]
};
“`
Penjelasan keputusan konfigurasi utama:
- `instances: 'max'`: PM2 secara otomatis menelurkan satu worker per core CPU logis. Pada server 4-core, ini membuat 4 proses Node.js, memanfaatkan hardware sepenuhnya.
- `exec_mode: 'cluster'`: Menggunakan modul cluster bawaan Node.js. Semua instance berbagi port yang sama melalui load balancing socket sistem operasi.
- `exec_mode: 'fork'`: Menjalankan proses sebagai child process mandiri. Diperlukan untuk aplikasi yang bukan server HTTP (queue worker, scheduled job, server WebSocket dengan sticky session).
- `merge_logs: true`: Menggabungkan stdout dari semua instance cluster ke dalam satu file log, membuat analisis log jauh lebih mudah.
- `cron_restart`: Menjadwalkan restart otomatis menggunakan sintaks cron. Berguna untuk worker yang mengakumulasi state atau untuk menerapkan perubahan konfigurasi malam hari.
Memulai dengan File Ekosistem
“`bash
pm2 start ecosystem.config.js –env production
pm2 save
“`
Alur Kerja Deployment Zero-Downtime
Saat men-deploy versi baru aplikasi Anda:
“`bash
git pull origin main
npm install –production
pm2 reload ecosystem.config.js –env production
“`
`pm2 reload` mengirim `SIGINT` ke setiap worker satu per satu, menunggu worker baru siap, lalu mengakhiri yang lama. Aplikasi Anda harus menangani `SIGINT` dengan baik dan memberi sinyal kesiapan menggunakan `process.send('ready')` agar ini berfungsi dengan benar.
Handler graceful shutdown dalam aplikasi Anda:
“`javascript
process.on('SIGINT', () => {
server.close(() => {
console.log('HTTP server closed');
process.exit(0);
});
});
“`
Langkah 7: Monitoring dan Observabilitas PM2
Monitoring Bawaan
“`bash
pm2 monit
“`
Menampilkan grafik CPU dan memori real-time untuk setiap proses di terminal.
Informasi Proses
“`bash
pm2 show my-app
“`
Menampilkan metadata terperinci: uptime, jumlah restart, versioning, path interpreter, variabel lingkungan, dan lokasi file log.
Dasbor Web PM2 (PM2 Plus)
PM2 menawarkan dasbor monitoring yang dihosting di pm2.io. Hubungkan server Anda:
“`bash
pm2 link <secret_key> <public_key>
“`
Ini menyediakan metrik historis, peringatan, dan manajemen proses jarak jauh — sangat berharga saat mengelola beberapa server atau ketika Anda membutuhkan visibilitas tanpa akses SSH.
Langkah 8: Memperbarui Node.js dan PM2
Memperbarui PM2
“`bash
sudo npm install -g pm2@latest
pm2 update
“`
`pm2 update` sangat penting setelah memperbarui binary PM2 — ini memperbarui daemon PM2 dalam memori tanpa mengganggu proses yang sedang berjalan.
Memperbarui Node.js via NodeSource
Jalankan ulang skrip setup untuk versi major baru:
“`bash
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash –
sudo apt install nodejs -y
“`
Setelah memperbarui Node.js, restart PM2 untuk memastikan menggunakan binary baru:
“`bash
pm2 restart all
“`
Memperbarui Node.js via NVM
“`bash
nvm install 22
nvm alias default 22
nvm use 22
pm2 restart all
“`
Jika Anda mengubah versi default NVM, buat ulang skrip startup PM2 untuk memperbarui path binary dalam unit systemd:
“`bash
pm2 unstartup
pm2 startup
pm2 save
“`
Pertimbangan Penguatan Keamanan
Menjalankan aplikasi Node.js dalam produksi memerlukan perhatian di luar manajemen proses:
- Jalankan sebagai pengguna non-root: Jangan pernah menjalankan PM2 atau Node.js sebagai root. Buat pengguna sistem khusus (`adduser –system –group nodeapp`) dan jalankan PM2 di bawah akun tersebut.
- Manajemen variabel lingkungan: Jangan hardcode rahasia dalam `ecosystem.config.js`. Gunakan file `.env` yang dimuat via `dotenv`, atau injeksikan rahasia melalui pipeline deployment Anda. File ekosistem biasanya di-commit ke version control.
- Reverse proxy: Tempatkan Nginx atau Caddy di depan aplikasi Node.js Anda. Ini menangani terminasi TLS, penyajian file statis, rate limiting, dan buffering permintaan. Padukan ini dengan solusi SSL Certificates untuk menegakkan HTTPS.
- Aturan firewall: Blokir akses langsung ke port Node.js Anda (misalnya, 3000, 8080) dari internet publik. Hanya reverse proxy yang boleh berkomunikasi dengan Node.js.
- Batas sumber daya: Tetapkan `max_memory_restart` di PM2 dan konfigurasikan nilai `ulimit` di tingkat sistem untuk mencegah satu proses yang tidak terkendali mendestabilisasi server.
Untuk deployment produksi dengan lalu lintas tinggi di mana isolasi sumber daya sangat penting, lingkungan Dedicated Servers memberikan kontrol hardware penuh dan menghilangkan masalah noisy-neighbor yang melekat pada infrastruktur bersama.
Memilih Lingkungan Hosting yang Tepat untuk Node.js
| Beban Kerja | Lingkungan yang Direkomendasikan | Alasan |
|---|
| — | — | — |
|---|
| Proyek pribadi, staging | [VPS Hosting](https://alexhost.com/id/vps/) | Hemat biaya, akses root penuh, skalabel |
|---|
| API lalu lintas tinggi | [Dedicated Servers](https://alexhost.com/id/dedicated-servers/) | Performa yang dapat diprediksi, tanpa persaingan sumber daya |
|---|
| Inferensi ML + Node.js | [GPU Hosting](https://alexhost.com/id/gpu-hosting/) | Alihkan tugas komputasi intensif ke GPU worker |
|---|
| Panel kontrol terkelola | [VPS with cPanel](https://alexhost.com/id/vps/control-panels/cpanel-vps/) | Manajemen proses dan file berbasis GUI |
|---|
Daftar Periksa Keputusan Teknis
Gunakan daftar periksa ini sebelum men-deploy Node.js dan PM2 ke produksi:
- [ ] Node.js diinstal via NodeSource (server) atau NVM (pengembangan) — bukan paket universe Ubuntu
- [ ] PM2 diinstal secara global dengan izin yang benar untuk metode instalasi Anda
- [ ] Aplikasi dimulai dengan flag `–name` dan ambang batas `–max-memory-restart` yang ditentukan
- [ ] Mode cluster diaktifkan untuk server HTTP; mode fork digunakan untuk background worker
- [ ] `pm2 startup` dijalankan dan perintah yang dihasilkan dijalankan dengan sudo
- [ ] `pm2 save` dijalankan setelah semua proses dikonfigurasi
- [ ] Modul rotasi log diinstal dan dikonfigurasi
- [ ] Nginx atau Caddy dikonfigurasi sebagai reverse proxy dengan TLS
- [ ] Aplikasi menangani `SIGINT` dengan baik untuk reload zero-downtime
- [ ] Rahasia dikelola di luar `ecosystem.config.js`
- [ ] Unit systemd PM2 diverifikasi dengan `systemctl status pm2-<username>`
- [ ] Firewall memblokir akses langsung ke port Node.js dari internet publik
FAQ
Apa perbedaan antara mode fork dan mode cluster PM2?
Mode fork menelurkan aplikasi sebagai satu child process — satu instance, satu core CPU yang digunakan. Mode cluster menggunakan modul cluster native Node.js untuk menelurkan beberapa proses worker yang semuanya berbagi port TCP yang sama, memungkinkan pemanfaatan multi-core yang sesungguhnya dan reload zero-downtime. Gunakan mode cluster untuk server HTTP/HTTPS dan mode fork untuk worker, cron job, atau aplikasi yang mempertahankan state internal yang tidak kompatibel dengan berbagi multi-proses.
Mengapa PM2 tidak restart setelah reboot server meskipun saya sudah menjalankan `pm2 startup`?
Penyebab paling umum adalah `pm2 save` tidak dijalankan setelah mengonfigurasi proses, sehingga file dump kosong atau tidak ada. Penyebab paling umum kedua adalah ketidakcocokan path NVM: jika versi default NVM diubah setelah membuat skrip startup, unit systemd menunjuk ke binary yang tidak ada. Selesaikan ini dengan menjalankan `pm2 unstartup`, menetapkan default NVM yang benar, lalu menjalankan ulang `pm2 startup` dan `pm2 save`.
Bisakah PM2 mengelola proses non-Node.js?
Ya. PM2 dapat mengelola executable apa pun dengan menentukan interpreter. Misalnya: `pm2 start script.py –interpreter python3`. Ini membuat PM2 berguna sebagai process supervisor tujuan umum untuk arsitektur microservice multi-bahasa.
Bagaimana cara menjalankan beberapa aplikasi Node.js di port berbeda di belakang satu server?
Definisikan setiap aplikasi sebagai entri terpisah dalam `ecosystem.config.js` dengan variabel lingkungan `PORT` yang berbeda. Konfigurasikan Nginx sebagai reverse proxy dengan blok `server` terpisah atau direktif `location` yang merutekan ke setiap port. Semua aplikasi berbagi daemon PM2 yang sama dan dikelola melalui satu tampilan `pm2 list`.
Haruskah saya menggunakan NVM atau NodeSource untuk VPS produksi?
NodeSource umumnya lebih disukai untuk server produksi. NodeSource menginstal Node.js sebagai paket sistem, membuatnya tersedia untuk semua pengguna dan layanan sistem tanpa dependensi inisialisasi shell. Model aktivasi per-pengguna dan per-shell NVM memperkenalkan mode kegagalan yang halus dalam unit systemd, cron job, dan pipeline CI/CD yang berjalan di luar sesi shell interaktif. Simpan NVM untuk mesin pengembangan lokal di mana mengelola beberapa versi Node.js secara bersamaan adalah kebutuhan nyata.
