Як встановити NVM для Node.js на Ubuntu: Повний технічний посібник
NVM (Node Version Manager) — це POSIX-сумісний shell-скрипт, який встановлює та керує кількома ізольованими середовищами виконання Node.js на одній машині без необхідності прав root або зміни системних шляхів. Кожна версія Node.js знаходиться у власному каталозі під `~/.nvm/versions/node/`, забезпечуючи повну ізоляцію між проєктами без конфліктів.
Цей посібник охоплює встановлення NVM виробничого рівня на Ubuntu (20.04, 22.04 та 24.04), включаючи не лише базові команди, але й особливості файлів профілю shell, автоматизацію робочого процесу `.nvmrc`, міграцію глобальних пакетів та специфічні для серверів підводні камені, які більшість посібників оминає.
Чому NVM, а не системний менеджер пакетів
Встановлення Node.js через `apt` розміщує єдиний системний бінарний файл за адресою `/usr/bin/node`. Його оновлення одночасно впливає на всі застосунки на хості. На спільній машині розробки або VPS, що запускає кілька проєктів Node.js, це створює нестабільні середовища, які важко відтворити.
NVM вирішує цю проблему, встановлюючи кожну версію Node.js у каталог користувацького простору та маніпулюючи `PATH` на рівні shell. Результатом є контроль версій для кожного користувача та проєкту без жодного впливу на стан пакетів операційної системи.
NVM проти інших менеджерів версій Node.js
| Функція | NVM | fnm | Volta | n |
|---|
| — | — | — | — | — |
|---|
| Мова | Shell (Bash/Zsh) | Rust | Rust | Shell |
|---|
| Швидкість | Помірна | Дуже висока | Дуже висока | Висока |
|---|
| Підтримка `.nvmrc` | Так | Так | Часткова | Ні |
|---|
| Прив’язка до проєкту | Так | Так | Так | Ні |
|---|
| Підтримка Windows | Ні (лише WSL) | Так | Так | Ні |
|---|
| Ізоляція глобальних пакетів | Так | Так | Так | Ні |
|---|
| Накладні витрати на запуск shell | ~70ms | ~5ms | ~5ms | Мінімальні |
|---|
| Зрілість / екосистема | Найвища | Висока | Середня | Висока |
|---|
NVM залишається найбільш задокументованим варіантом з найширшою підтримкою екосистеми, що робить його найбезпечнішим вибором за замовчуванням для команд і серверних середовищ, де відтворюваність важливіша за швидкість запуску.
Передумови
- Ubuntu 20.04, 22.04 або 24.04 (десктоп або сервер)
- Обліковий запис користувача без прав root з привілеями `sudo`
- Встановлений `curl` або `wget` (обидва присутні за замовчуванням на більшості образів Ubuntu)
- Базове знайомство з Bash або Zsh
Щоб підтвердити тип shell та версію Ubuntu перед початком:
“`bash
echo $SHELL
lsb_release -a
“`
Крок 1: Оновлення індексу пакетів системи
Оновіть списки пакетів APT, щоб переконатися, що всі залежності, які вирішуються під час сесії, є актуальними:
“`bash
sudo apt-get update && sudo apt-get upgrade -y
“`
Також переконайтеся, що `curl` доступний:
“`bash
curl –version || sudo apt-get install -y curl
“`
Крок 2: Завантаження та запуск скрипту встановлення NVM
Офіційний інсталятор NVM розміщений на GitHub. Він клонує репозиторій NVM до `~/.nvm` та додає необхідний блок ініціалізації shell до вашого файлу профілю.
Варіант A — Використання curl (рекомендовано):
“`bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
“`
Варіант B — Використання wget:
“`bash
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
“`
Завжди перевіряйте останній тег релізу на сторінці релізів NVM на GitHub перед запуском. Замініть `v0.40.1` на поточний стабільний тег, якщо опублікована новіша версія.
Що насправді робить інсталятор:
- Клонує репозиторій NVM до `~/.nvm`
- Визначає ваш активний shell (`bash`, `zsh`, `ksh` або `fish`)
- Додає наступний блок ініціалізації до відповідного файлу профілю (`~/.bashrc`, `~/.zshrc`, `~/.profile` або `~/.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"
“`
Примітка щодо безпеки: Передача віддаленого скрипту безпосередньо до `bash` є поширеною практикою, але несе в собі певний ризик. Для виробничих серверів або середовищ виділеного сервера спочатку завантажте скрипт, перевірте його, а потім виконайте:
“`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
“`
Крок 3: Активація NVM у поточній сесії shell
Інсталятор змінює ваш профіль, але ці зміни набувають чинності лише в нових сесіях shell. Щоб активувати NVM негайно без відкриття нового термінала:
Для Bash:
“`bash
source ~/.bashrc
“`
Для Zsh:
“`bash
source ~/.zshrc
“`
Ручне підключення (працює в будь-якому shell):
“`bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
“`
Поширена проблема: файл профілю не підключається в неінтерактивних shell
В Ubuntu `~/.bashrc` підключається лише для інтерактивних неавторизаційних shell. Якщо ви підключаєтесь через SSH (авторизаційний shell), Bash читає `~/.bash_profile` або `~/.profile` натомість. Якщо NVM не знайдено після входу через SSH, додайте блок підключення до `~/.bash_profile`:
“`bash
echo 'source ~/.bashrc' >> ~/.bash_profile
source ~/.bash_profile
“`
Це одна з найчастіше зустрічаних проблем при налаштуванні NVM на віддалених серверах.
Крок 4: Перевірка встановлення NVM
“`bash
nvm –version
“`
Очікуваний результат (номер версії може відрізнятися):
“`
0.40.1
“`
Якщо команда повертає `nvm: command not found`, профіль shell не був підключений правильно. Повторно виконайте команду підключення з Кроку 3 та перевірте, що блок ініціалізації існує у вашому файлі профілю:
“`bash
grep -n 'NVM_DIR' ~/.bashrc
“`
Крок 5: Встановлення Node.js за допомогою NVM
Встановлення останнього LTS-релізу (рекомендовано для виробництва)
“`bash
nvm install –lts
“`
Прапорець `–lts` встановлює найновіший реліз з довгостроковою підтримкою, який отримує патчі безпеки протягом 30 місяців. Для виробничих навантажень на VPS з cPanel або будь-якому серверному середовищі LTS настійно рекомендується над поточним релізом.
Встановлення абсолютно останнього релізу
“`bash
nvm install node
“`
Встановлення конкретної версії
“`bash
nvm install 20.14.0
“`
Перегляд усіх доступних віддалених версій
“`bash
nvm ls-remote
“`
Щоб відфільтрувати лише LTS-версії:
“`bash
nvm ls-remote –lts
“`
Крок 6: Перевірка активних версій Node.js та npm
“`bash
node -v
npm -v
“`
Також підтвердіть шлях до бінарного файлу, щоб переконатися, що ви випадково не використовуєте системне встановлення Node.js:
“`bash
which node
Expected: /home/<username>/.nvm/versions/node/v20.14.0/bin/node
“`
Крок 7: Керування кількома версіями Node.js
Перегляд усіх локально встановлених версій
“`bash
nvm ls
“`
Приклад виводу:
“`
-> 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)
“`
Перемикання між версіями
“`bash
nvm use 18.20.3
“`
Ця зміна застосовується лише до поточної сесії термінала. Відкриття нового термінала повертає до версії за замовчуванням.
Перевірка поточної активної версії
“`bash
nvm current
“`
Крок 8: Встановлення постійної версії Node.js за замовчуванням
Щоб зробити конкретну версію версією за замовчуванням для всіх нових сесій shell:
“`bash
nvm alias default 20.14.0
“`
Ви також можете створити псевдонім для лінійки релізів, а не конкретної патч-версії, що автоматично відстежує оновлення в межах цієї лінійки:
“`bash
nvm alias default lts/*
“`
Крок 9: Автоматизація перемикання версій за допомогою `.nvmrc`
Це одна з найпотужніших і найменш використовуваних функцій NVM. Розмістіть файл `.nvmrc` у кореневому каталозі вашого проєкту з необхідною версією Node.js:
“`bash
echo "20.14.0" > /path/to/your/project/.nvmrc
“`
Тоді, коли ви виконуєте `cd` до цього каталогу:
“`bash
nvm use
Found '/path/to/your/project/.nvmrc' with version <20.14.0>
Now using node v20.14.0
“`
Автоматичне перемикання версій при зміні каталогу
Додайте наступне до вашого `~/.bashrc` (або `~/.zshrc`), щоб автоматично запускати `nvm use` щоразу, коли ви входите до каталогу, що містить файл `.nvmrc`:
Для 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'
“`
Цей підхід особливо цінний у CI/CD-конвеєрах та командних середовищах, де кілька розробників працюють над проєктами з різними вимогами до середовища виконання.
Крок 10: Керування глобальними пакетами npm між версіями
Кожна версія Node.js, встановлена NVM, має власний ізольований каталог `node_modules` для глобально встановлених пакетів. Це означає, що інструменти на кшталт `pm2`, `yarn` або `typescript`, встановлені глобально під `v18`, недоступні під `v20`.
Встановлення глобального пакету для активної версії
“`bash
npm install -g yarn
npm install -g pm2
npm install -g typescript
“`
Міграція глобальних пакетів при встановленні нової версії
NVM надає вбудований прапорець для копіювання всіх глобальних пакетів з однієї версії до нової інсталяції:
“`bash
nvm install 20.14.0 –reinstall-packages-from=18.20.3
“`
Це критично важливо при оновленні версій Node.js на сервері, що запускає постійні процеси, якими керує PM2 або подібні інструменти.
Перегляд глобально встановлених пакетів для поточної версії
“`bash
npm list -g –depth=0
“`
Крок 11: Видалення версії Node.js
Перед видаленням перейдіть з версії, яку хочете видалити:
“`bash
nvm use 20.14.0
nvm uninstall 16.20.2
“`
Неможливо видалити поточну активну версію. Спроба зробити це повертає помилку.
Додатково: Використання NVM у неінтерактивних середовищах (CI/CD, Cron, Systemd)
NVM покладається на файли ініціалізації shell, які не підключаються в неінтерактивних shell. Це спричиняє помилки `node: command not found` у завданнях cron, файлах юнітів systemd та деяких CI-середовищах.
Рішення 1: Використовуйте повний шлях до бінарного файлу
“`bash
/home/username/.nvm/versions/node/v20.14.0/bin/node /path/to/app.js
“`
Рішення 2: Явно підключайте NVM у скриптах
“`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
“`
Рішення 3: Створіть символічне посилання для загальносистемного доступу (використовуйте з обережністю)
“`bash
sudo ln -s /home/username/.nvm/versions/node/v20.14.0/bin/node /usr/local/bin/node
“`
Цей підхід жертвує ізоляцією для кожного користувача, але іноді необхідний для служб systemd, що працюють як виділений користувач служби.
NVM на спільному хостингу проти VPS проти виділених серверів
| Середовище | Придатність NVM | Примітки |
|---|
| — | — | — |
|---|
| Спільний хостинг | Не підтримується | Немає доступу до shell; використовуйте Node.js, наданий платформою |
|---|
| [VPS Хостинг](https://alexhost.com/uk/vps/) | Відмінна | Повний доступ до shell; ізоляція для кожного користувача працює ідеально |
|---|
| [Виділені сервери](https://alexhost.com/uk/dedicated-servers/) | Відмінна | Ідеально для багатопроєктних середовищ та CI-раннерів |
|---|
| Docker-контейнери | Часткова | Розгляньте використання офіційних Docker-образів Node.js натомість |
|---|
| Спільний веб-хостинг | Не підтримується | Немає SSH-доступу в більшості конфігурацій |
|---|
Для команд, що запускають застосунки Node.js поряд з іншими службами, VPS надає контроль на рівні shell, який вимагає NVM, без накладних витрат на управління фізичним обладнанням.
Практичний контрольний список ключових висновків
Використовуйте це як довідник з розгортання та налаштування:
- Перевірте тип shell (`echo $SHELL`) перед встановленням — Zsh та Bash вимагають різних файлів профілю
- Завжди використовуйте `–lts` для виробничих встановлень Node.js; залишайте `node` (latest) для експериментальної роботи
- Додайте `.nvmrc` до системи контролю версій, щоб кожен член команди та CI-раннер використовували однакову версію середовища виконання
- Використовуйте `–reinstall-packages-from` при оновленні версій Node.js, щоб уникнути ручного перевстановлення глобальних інструментів
- Явно підключайте NVM у будь-якому неінтерактивному скрипті (cron, systemd, CI-конвеєри) — ніколи не припускайте, що профіль shell було завантажено
- Перевіряйте глобальні пакети для кожної версії за допомогою `npm list -g –depth=0` після перемикання версій, щоб завчасно виявити відсутні залежності
- Вказуйте точні версії у `.nvmrc` (наприклад, `20.14.0`), а не псевдоніми (наприклад, `lts`) для максимальної відтворюваності у виробництві
- Перевіряйте `which node` після перемикання версій, щоб переконатися, що ви випадково не використовуєте системний бінарний файл
Часті запитання
Чи потребує NVM sudo або root-доступу для встановлення Node.js?
Ні. NVM встановлює все під `~/.nvm` у домашньому каталозі поточного користувача. Для встановлення або перемикання версій Node.js права root не потрібні. Це одна з його основних переваг перед системними менеджерами пакетів.
Чому після встановлення з’являється `nvm: command not found`?
Блок ініціалізації NVM було додано до вашого профілю shell, але профіль не було повторно підключено в поточній сесії. Виконайте `source ~/.bashrc` (Bash) або `source ~/.zshrc` (Zsh). Якщо помилка зберігається після відкриття нового термінала, перевірте, що блок ініціалізації дійсно було записано до правильного файлу за допомогою `grep NVM_DIR ~/.bashrc`.
Чи можуть кілька користувачів на одному сервері мати різні версії Node.js через NVM?
Так. Оскільки NVM встановлюється до домашнього каталогу кожного користувача (`~/.nvm`), кожен користувач підтримує повністю незалежний набір версій Node.js та глобальних пакетів. Це правильна архітектура для багатокористувацьких серверів.
Що відбувається з глобально встановленими пакетами npm, коли я перемикаю версії Node.js за допомогою NVM?
Кожна версія Node.js має власний ізольований каталог глобальних пакетів. Пакети, встановлені глобально під однією версією, не видимі для іншої. Використовуйте `nvm install <new-version> –reinstall-packages-from=<old-version>` для їх автоматичної міграції.
Чи підходить NVM для запуску застосунків Node.js у виробництві на сервері?
NVM добре підходить для керування тим, яка версія Node.js використовується, але для управління процесами у виробництві вам слід поєднувати його з менеджером процесів на кшталт PM2 або використовувати файли юнітів systemd. Переконайтеся, що ці неінтерактивні середовища явно підключають NVM або посилаються на повний шлях до бінарного файлу, як описано у розділі CI/CD вище.
