Cara Menginstal NVM untuk Node.js di Ubuntu: Panduan Teknis Lengkap
NVM (Node Version Manager) adalah skrip shell yang sesuai dengan POSIX yang menginstal dan mengelola beberapa lingkungan runtime Node.js yang terisolasi pada satu mesin, tanpa memerlukan hak akses root atau memodifikasi jalur sistem secara keseluruhan. Setiap versi Node.js berada di direktorinya sendiri di bawah `~/.nvm/versions/node/`, memberikan isolasi yang lengkap dan bebas konflik antar proyek.
Panduan ini memandu melalui instalasi NVM tingkat produksi di Ubuntu (20.04, 22.04, dan 24.04), mencakup tidak hanya perintah dasar tetapi juga kasus tepi file profil shell, otomatisasi alur kerja `.nvmrc`, migrasi paket global, dan kendala khusus server yang sering diabaikan oleh sebagian besar tutorial.
Mengapa NVM Daripada Package Manager Sistem
Menginstal Node.js melalui `apt` menempatkan satu biner sistem secara keseluruhan di `/usr/bin/node`. Memperbaruinya memengaruhi setiap aplikasi di host secara bersamaan. Pada mesin pengembangan bersama atau VPS yang menjalankan beberapa proyek Node.js, hal ini menciptakan lingkungan yang rapuh dan sulit direproduksi.
NVM mengatasi hal ini dengan menginstal setiap versi Node.js ke dalam direktori ruang pengguna dan memanipulasi `PATH` di tingkat shell. Hasilnya adalah kontrol versi per pengguna, per proyek tanpa dampak pada status paket sistem operasi.
NVM vs. Manajer Versi Node.js Lainnya
| Fitur | NVM | fnm | Volta | n |
|---|
| — | — | — | — | — |
|---|
| Bahasa | Shell (Bash/Zsh) | Rust | Rust | Shell |
|---|
| Kecepatan | Sedang | Sangat cepat | Sangat cepat | Cepat |
|---|
| Dukungan `.nvmrc` | Ya | Ya | Sebagian | Tidak |
|---|
| Penentuan per proyek | Ya | Ya | Ya | Tidak |
|---|
| Dukungan Windows | Tidak (hanya WSL) | Ya | Ya | Tidak |
|---|
| Isolasi paket global | Ya | Ya | Ya | Tidak |
|---|
| Overhead startup shell | ~70ms | ~5ms | ~5ms | Minimal |
|---|
| Kematangan / ekosistem | Tertinggi | Tinggi | Sedang | Tinggi |
|---|
NVM tetap menjadi pilihan yang paling banyak didokumentasikan dan didukung ekosistemnya, menjadikannya pilihan default yang paling aman untuk tim dan lingkungan server di mana reproduktibilitas lebih penting daripada kecepatan startup mentah.
Prasyarat
- Ubuntu 20.04, 22.04, atau 24.04 (desktop atau server)
- Akun pengguna non-root dengan hak akses `sudo`
- `curl` atau `wget` terinstal (keduanya tersedia secara default di sebagian besar image Ubuntu)
- Familiar dasar dengan Bash atau Zsh
Untuk mengonfirmasi shell dan versi Ubuntu Anda sebelum memulai:
“`bash
echo $SHELL
lsb_release -a
“`
Langkah 1: Perbarui Indeks Paket Sistem
Segarkan daftar paket APT untuk memastikan dependensi apa pun yang diselesaikan selama sesi ini sudah terkini:
“`bash
sudo apt-get update && sudo apt-get upgrade -y
“`
Juga konfirmasi bahwa `curl` tersedia:
“`bash
curl –version || sudo apt-get install -y curl
“`
Langkah 2: Unduh dan Jalankan Skrip Instalasi NVM
Penginstal NVM resmi dihosting di GitHub. Ini mengkloning repositori NVM ke dalam `~/.nvm` dan menambahkan blok inisialisasi shell yang diperlukan ke file profil Anda.
Opsi A — Menggunakan curl (direkomendasikan):
“`bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
“`
Opsi B — Menggunakan wget:
“`bash
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
“`
Selalu verifikasi tag rilis terbaru di halaman rilis GitHub NVM sebelum menjalankan. Ganti `v0.40.1` dengan tag stabil saat ini jika versi yang lebih baru telah diterbitkan.
Apa yang sebenarnya dilakukan penginstal:
- Mengkloning repositori NVM ke `~/.nvm`
- Mendeteksi shell aktif Anda (`bash`, `zsh`, `ksh`, atau `fish`)
- Menambahkan blok inisialisasi berikut ke file profil yang sesuai (`~/.bashrc`, `~/.zshrc`, `~/.profile`, atau `~/.bash_profile`)
“`bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
“`
Catatan keamanan: Menyalurkan skrip jarak jauh langsung ke `bash` adalah pola umum tetapi membawa risiko yang melekat. Untuk server produksi atau lingkungan dedicated server, unduh skrip terlebih dahulu, periksa, lalu jalankan:
“`bash
curl -o install_nvm.sh https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh
cat install_nvm.sh # review before running
bash install_nvm.sh
“`
Langkah 3: Aktifkan NVM di Sesi Shell Saat Ini
Penginstal memodifikasi profil Anda, tetapi perubahan tersebut hanya berlaku dalam sesi shell baru. Untuk mengaktifkan NVM segera tanpa membuka terminal baru:
Untuk Bash:
“`bash
source ~/.bashrc
“`
Untuk Zsh:
“`bash
source ~/.zshrc
“`
Sourcing manual (berfungsi di shell mana pun):
“`bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
“`
Kendala Umum: File Profil Tidak Di-source di Shell Non-Interaktif
Di Ubuntu, `~/.bashrc` hanya di-source untuk shell non-login interaktif. Jika Anda terhubung melalui SSH (shell login), Bash membaca `~/.bash_profile` atau `~/.profile` sebagai gantinya. Jika NVM tidak ditemukan setelah login SSH, tambahkan blok sourcing ke `~/.bash_profile`:
“`bash
echo 'source ~/.bashrc' >> ~/.bash_profile
source ~/.bash_profile
“`
Ini adalah salah satu masalah yang paling sering ditemui saat mengonfigurasi NVM di server jarak jauh.
Langkah 4: Verifikasi Instalasi NVM
“`bash
nvm –version
“`
Output yang diharapkan (nomor versi akan bervariasi):
“`
0.40.1
“`
Jika perintah mengembalikan `nvm: command not found`, profil shell tidak di-source dengan benar. Jalankan ulang perintah sourcing dari Langkah 3 dan verifikasi bahwa blok inisialisasi ada di file profil Anda:
“`bash
grep -n 'NVM_DIR' ~/.bashrc
“`
Langkah 5: Instal Node.js Menggunakan NVM
Instal Rilis LTS Terbaru (Direkomendasikan untuk Produksi)
“`bash
nvm install –lts
“`
Flag `–lts` menginstal rilis Long-Term Support terbaru, yang menerima patch keamanan selama 30 bulan. Untuk beban kerja produksi di VPS dengan cPanel atau lingkungan server mana pun, LTS sangat diutamakan daripada rilis saat ini.
Instal Rilis Terbaru Mutlak
“`bash
nvm install node
“`
Instal Versi Tertentu
“`bash
nvm install 20.14.0
“`
Daftar Semua Versi Remote yang Tersedia
“`bash
nvm ls-remote
“`
Untuk memfilter hanya versi LTS:
“`bash
nvm ls-remote –lts
“`
Langkah 6: Verifikasi Versi Node.js dan npm yang Aktif
“`bash
node -v
npm -v
“`
Juga konfirmasi jalur biner untuk memastikan Anda tidak secara tidak sengaja menggunakan instalasi Node.js sistem secara keseluruhan:
“`bash
which node
Expected: /home/<username>/.nvm/versions/node/v20.14.0/bin/node
“`
Langkah 7: Kelola Beberapa Versi Node.js
Daftar Semua Versi yang Terinstal Secara Lokal
“`bash
nvm ls
“`
Contoh output:
“`
-> v20.14.0
v18.20.3
v16.20.2
default -> lts/* (-> v20.14.0)
node -> stable (-> v20.14.0) (default)
lts/* -> lts/iron (-> v20.14.0)
“`
Beralih Antar Versi
“`bash
nvm use 18.20.3
“`
Perubahan ini hanya berlaku untuk sesi terminal saat ini. Membuka terminal baru akan kembali ke alias default.
Periksa Versi yang Sedang Aktif
“`bash
nvm current
“`
Langkah 8: Tetapkan Versi Node.js Default yang Persisten
Untuk menjadikan versi tertentu sebagai default untuk semua sesi shell baru:
“`bash
nvm alias default 20.14.0
“`
Anda juga dapat membuat alias ke lini rilis daripada versi patch tertentu, yang secara otomatis melacak pembaruan dalam lini tersebut:
“`bash
nvm alias default lts/*
“`
Langkah 9: Otomatiskan Pergantian Versi dengan `.nvmrc`
Ini adalah salah satu fitur NVM yang paling kuat dan jarang digunakan. Tempatkan file `.nvmrc` di root proyek Anda yang berisi versi Node.js yang diperlukan:
“`bash
echo "20.14.0" > /path/to/your/project/.nvmrc
“`
Kemudian, ketika Anda `cd` ke direktori tersebut:
“`bash
nvm use
Found '/path/to/your/project/.nvmrc' with version <20.14.0>
Now using node v20.14.0
“`
Pergantian Versi Otomatis saat Perubahan Direktori
Tambahkan yang berikut ke `~/.bashrc` (atau `~/.zshrc`) Anda untuk memicu `nvm use` secara otomatis setiap kali Anda memasuki direktori yang berisi file `.nvmrc`:
Untuk Bash:
“`bash
cdnvm() {
command cd "$@" || return $?
nvm_path="$(nvm_find_up .nvmrc | command tr -d 'n')"
if [[ ! $nvm_path = *[^[:space:]]* ]]; then
declare default_version
default_version="$(nvm version default)"
if [[ $default_version == "N/A" ]]; then
nvm use default
elif [[ $(nvm current) != "$default_version" ]]; then
nvm use default
fi
elif [[ -r "$nvm_path/.nvmrc" && -r "$nvm_path" ]]; then
declare nvm_version
nvm_version=$(<"$nvm_path/.nvmrc")
declare locally_resolved_nvm_version
locally_resolved_nvm_version="$(nvm ls –no-colors "$nvm_version" | command tail -1 | command tr -d '->*' | command tr -d '[:space:]')"
if [[ "$locally_resolved_nvm_version" == "N/A" ]]; then
nvm install "$nvm_version"
elif [[ $(nvm current) != "$locally_resolved_nvm_version" ]]; then
nvm use "$nvm_version"
fi
fi
}
alias cd='cdnvm'
“`
Pola ini sangat berharga dalam pipeline CI/CD dan lingkungan tim di mana beberapa pengembang mengerjakan proyek dengan persyaratan runtime yang berbeda.
Langkah 10: Kelola Paket npm Global di Berbagai Versi
Setiap versi Node.js yang diinstal oleh NVM memiliki direktori `node_modules` yang terisolasi untuk paket yang diinstal secara global. Ini berarti alat seperti `pm2`, `yarn`, atau `typescript` yang diinstal secara global di bawah `v18` tidak tersedia di bawah `v20`.
Instal Paket Global untuk Versi yang Aktif
“`bash
npm install -g yarn
npm install -g pm2
npm install -g typescript
“`
Migrasi Paket Global Saat Menginstal Versi Baru
NVM menyediakan flag bawaan untuk menyalin semua paket global dari satu versi ke instalasi baru:
“`bash
nvm install 20.14.0 –reinstall-packages-from=18.20.3
“`
Ini sangat penting saat memutakhirkan versi Node.js di server yang menjalankan proses persisten yang dikelola oleh PM2 atau alat serupa.
Daftar Paket yang Terinstal Secara Global untuk Versi Saat Ini
“`bash
npm list -g –depth=0
“`
Langkah 11: Hapus Instalasi Versi Node.js
Sebelum menghapus instalasi, beralih dari versi yang ingin Anda hapus:
“`bash
nvm use 20.14.0
nvm uninstall 16.20.2
“`
Anda tidak dapat menghapus instalasi versi yang sedang aktif. Mencoba melakukannya akan mengembalikan kesalahan.
Lanjutan: Menggunakan NVM di Lingkungan Non-Interaktif (CI/CD, Cron, Systemd)
NVM bergantung pada file inisialisasi shell yang tidak di-source di shell non-interaktif. Hal ini menyebabkan kesalahan `node: command not found` dalam cron job, file unit systemd, dan beberapa lingkungan CI.
Solusi 1: Gunakan jalur biner lengkap
“`bash
/home/username/.nvm/versions/node/v20.14.0/bin/node /path/to/app.js
“`
Solusi 2: Source NVM secara eksplisit dalam skrip
“`bash
#!/bin/bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm use 20.14.0
node /path/to/app.js
“`
Solusi 3: Buat symlink untuk akses sistem secara keseluruhan (gunakan dengan hati-hati)
“`bash
sudo ln -s /home/username/.nvm/versions/node/v20.14.0/bin/node /usr/local/bin/node
“`
Pendekatan ini mengorbankan isolasi per pengguna tetapi terkadang diperlukan untuk layanan systemd yang berjalan sebagai pengguna layanan khusus.
NVM di Shared Hosting vs. VPS vs. Dedicated Server
| Lingkungan | Kesesuaian NVM | Catatan |
|---|
| — | — | — |
|---|
| Shared hosting | Tidak didukung | Tidak ada akses shell; gunakan Node.js yang disediakan platform |
|---|
| [VPS Hosting](https://alexhost.com/id/vps/) | Sangat baik | Akses shell penuh; isolasi per pengguna berfungsi dengan sempurna |
|---|
| [Dedicated Servers](https://alexhost.com/id/dedicated-servers/) | Sangat baik | Ideal untuk lingkungan multi-proyek dan runner CI |
|---|
| Docker containers | Sebagian | Pertimbangkan menggunakan image Docker Node.js resmi sebagai gantinya |
|---|
| Shared Web Hosting | Tidak didukung | Tidak ada akses SSH di sebagian besar konfigurasi |
|---|
Untuk tim yang menjalankan aplikasi Node.js bersama layanan lain, VPS memberi Anda kontrol tingkat shell yang dibutuhkan NVM tanpa overhead pengelolaan perangkat keras fisik.
Daftar Periksa Poin Kunci Praktis
Gunakan ini sebagai referensi deployment dan konfigurasi:
- Verifikasi jenis shell (`echo $SHELL`) sebelum menginstal — Zsh dan Bash memerlukan file profil yang berbeda
- Selalu gunakan `–lts` untuk instalasi Node.js produksi; cadangkan `node` (terbaru) untuk pekerjaan eksperimental
- Commit `.nvmrc` ke version control agar setiap anggota tim dan runner CI menggunakan versi runtime yang identik
- Gunakan `–reinstall-packages-from` saat memutakhirkan versi Node.js untuk menghindari penginstalan ulang alat global secara manual
- Source NVM secara eksplisit dalam skrip non-interaktif mana pun (cron, systemd, pipeline CI) — jangan pernah berasumsi profil shell telah dimuat
- Audit paket global per versi dengan `npm list -g –depth=0` setelah beralih versi untuk mendeteksi dependensi yang hilang lebih awal
- Sematkan versi eksak di `.nvmrc` (mis., `20.14.0`) daripada alias (mis., `lts`) untuk reproduktibilitas maksimum di produksi
- Periksa `which node` setelah beralih versi untuk mengonfirmasi Anda tidak secara tidak sengaja menggunakan biner yang terinstal di sistem
Pertanyaan yang Sering Diajukan
Apakah NVM memerlukan akses sudo atau root untuk menginstal Node.js?
Tidak. NVM menginstal segalanya di bawah `~/.nvm` di direktori home pengguna saat ini. Tidak diperlukan hak akses root untuk menginstal atau beralih versi Node.js. Ini adalah salah satu keunggulan utamanya dibandingkan package manager tingkat sistem.
Mengapa `nvm: command not found` muncul setelah instalasi?
Blok inisialisasi NVM telah ditambahkan ke profil shell Anda, tetapi profil belum di-source ulang di sesi saat ini. Jalankan `source ~/.bashrc` (Bash) atau `source ~/.zshrc` (Zsh). Jika kesalahan berlanjut setelah membuka terminal baru, periksa bahwa blok inisialisasi benar-benar ditulis ke file yang benar menggunakan `grep NVM_DIR ~/.bashrc`.
Bisakah beberapa pengguna di server yang sama masing-masing memiliki versi Node.js yang berbeda melalui NVM?
Ya. Karena NVM menginstal ke direktori home setiap pengguna (`~/.nvm`), setiap pengguna mempertahankan serangkaian versi Node.js dan paket global yang sepenuhnya independen. Ini adalah arsitektur yang tepat untuk server multi-tenant.
Apa yang terjadi pada paket npm yang terinstal secara global ketika saya beralih versi Node.js dengan NVM?
Setiap versi Node.js memiliki direktori paket global yang terisolasi. Paket yang diinstal secara global di bawah satu versi tidak terlihat oleh versi lain. Gunakan `nvm install <new-version> –reinstall-packages-from=<old-version>` untuk memigrasikannya secara otomatis.
Apakah NVM cocok untuk menjalankan aplikasi Node.js di produksi di server?
NVM sangat cocok untuk mengelola versi Node.js mana yang digunakan, tetapi untuk manajemen proses di produksi Anda harus memasangkannya dengan manajer proses seperti PM2 atau menggunakan file unit systemd. Pastikan lingkungan non-interaktif tersebut secara eksplisit men-source NVM atau mereferensikan jalur biner lengkap, seperti yang dijelaskan di bagian CI/CD di atas.
