15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
08.10.2024

Как установить 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

ФункцияNVMfnmVoltan
ЯзыкShell (Bash/Zsh)RustRustShell
СкоростьУмереннаяОчень высокаяОчень высокаяВысокая
Поддержка `.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` текущим стабильным тегом, если была опубликована более новая версия.

Что фактически делает установщик:

  1. Клонирует репозиторий NVM в `~/.nvm`
  2. Определяет ваш активный shell (`bash`, `zsh`, `ksh` или `fish`)
  3. Добавляет следующий блок инициализации в соответствующий файл профиля (`~/.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 выше.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать