Как установить 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 (login 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-релиза (рекомендуется для production)
“`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 Hosting](https://alexhost.com/vps/) | Отлично | Полный доступ к shell; изоляция на уровне пользователя работает идеально |
|---|
| [Dedicated Servers](https://alexhost.com/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`) для максимальной воспроизводимости в production
- Проверяйте `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 в production на сервере?
NVM хорошо подходит для управления используемой версией Node.js, однако для управления процессами в production следует использовать его совместно с менеджером процессов, таким как PM2, или файлами юнитов systemd. Убедитесь, что эти неинтерактивные среды явно загружают NVM или ссылаются на полный путь к бинарному файлу, как описано в разделе CI/CD выше.
