Как да инсталирате NVM за Node.js на Ubuntu: Пълно техническо ръководство
NVM (Node Version Manager) е POSIX-съвместим шел скрипт, който инсталира и управлява множество изолирани Node.js среди за изпълнение на една машина, без да изисква root привилегии или промяна на системните пътища. Всяка версия на Node.js се съхранява в собствена директория под `~/.nvm/versions/node/`, осигурявайки пълна, безконфликтна изолация между проектите.
Това ръководство описва инсталация на NVM от производствен клас на Ubuntu (20.04, 22.04 и 24.04), обхващайки не само основните команди, но и специфичните случаи с шел профилите, автоматизацията на работния процес с `.nvmrc`, миграцията на глобални пакети и специфичните за сървъра проблеми, които повечето уроци пропускат.
Защо NVM вместо системния мениджър на пакети
Инсталирането на Node.js чрез `apt` поставя единичен, системно-широк двоичен файл на `/usr/bin/node`. Надграждането му засяга едновременно всички приложения на хоста. На споделена машина за разработка или VPS, изпълняващ множество Node.js проекти, това създава нестабилни, трудно възпроизводими среди.
NVM решава това, като инсталира всяка версия на Node.js в директория в потребителското пространство и манипулира `PATH` на ниво шел. Резултатът е контрол на версиите на ниво потребител и проект без никакво въздействие върху състоянието на пакетите на операционната система.
NVM срещу други мениджъри на версии на Node.js
| Функция | NVM | fnm | Volta | n |
|---|
| — | — | — | — | — |
|---|
| Език | Shell (Bash/Zsh) | Rust | Rust | Shell |
|---|
| Скорост | Умерена | Много бърза | Много бърза | Бърза |
|---|
| Поддръжка на `.nvmrc` | Да | Да | Частична | Не |
|---|
| Фиксиране на версия за проект | Да | Да | Да | Не |
|---|
| Поддръжка на Windows | Не (само WSL) | Да | Да | Не |
|---|
| Изолация на глобални пакети | Да | Да | Да | Не |
|---|
| Натоварване при стартиране на шела | ~70ms | ~5ms | ~5ms | Минимално |
|---|
| Зрялост / екосистема | Най-висока | Висока | Средна | Висока |
|---|
NVM остава най-широко документираната и поддържана от екосистемата опция, което я прави най-сигурният избор по подразбиране за екипи и сървърни среди, където възпроизводимостта е по-важна от скоростта на стартиране.
Предварителни изисквания
- Ubuntu 20.04, 22.04 или 24.04 (десктоп или сървър)
- Потребителски акаунт без root с привилегии `sudo`
- Инсталиран `curl` или `wget` (и двата са налични по подразбиране в повечето Ubuntu образи)
- Основни познания за Bash или Zsh
За да потвърдите вашия шел и версията на 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` и добавя необходимия блок за инициализация на шела към вашия профилен файл.
Вариант 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`
- Открива активния ви шел (`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` е често срещан модел, но носи присъщ риск. За производствени сървъри или среди с dedicated server, изтеглете скрипта първо, прегледайте го, след което го изпълнете:
“`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 в текущата шел сесия
Инсталаторът променя вашия профил, но тези промени влизат в сила само в нови шел сесии. За да активирате NVM незабавно, без да отваряте нов терминал:
За Bash:
“`bash
source ~/.bashrc
“`
За Zsh:
“`bash
source ~/.zshrc
“`
Ръчно зареждане (работи във всеки шел):
“`bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
“`
Често срещан проблем: Профилният файл не се зарежда в неинтерактивни шелове
В Ubuntu `~/.bashrc` се зарежда само за интерактивни нелогин шелове. Ако се свързвате чрез SSH (логин шел), 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`, профилът на шела не е зареден правилно. Изпълнете отново командата за зареждане от Стъпка 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 по подразбиране
За да направите конкретна версия по подразбиране за всички нови шел сесии:
“`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 разчита на файлове за инициализация на шела, които не се зареждат в неинтерактивни шелове. Това причинява грешки `node: command not found` в cron задачи, systemd unit файлове и някои 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 срещу dedicated сървъри
| Среда | Пригодност на NVM | Бележки |
|---|
| — | — | — |
|---|
| Споделен хостинг | Не се поддържа | Без достъп до шел; използвайте Node.js, предоставен от платформата |
|---|
| [VPS Хостинг](https://alexhost.com/bg/vps/) | Отличен | Пълен достъп до шел; изолацията на ниво потребител работи перфектно |
|---|
| [Dedicated Сървъри](https://alexhost.com/bg/dedicated-servers/) | Отличен | Идеален за среди с множество проекти и CI runner-и |
|---|
| Docker контейнери | Частична | Обмислете използването на официални Docker образи на Node.js вместо това |
|---|
| Споделен уеб хостинг | Не се поддържа | Без SSH достъп в повечето конфигурации |
|---|
За екипи, изпълняващи Node.js приложения заедно с други услуги, един VPS ви дава контрола на ниво шел, който NVM изисква, без натоварването от управление на физически хардуер.
Практически контролен списък с ключови изводи
Използвайте го като справочник за внедряване и конфигуриране:
- Проверете типа на шела (`echo $SHELL`) преди инсталиране — Zsh и Bash изискват различни профилни файлове
- Винаги използвайте `–lts` за производствени инсталации на Node.js; запазете `node` (latest) за експериментална работа
- Добавете `.nvmrc` към контрола на версиите, за да може всеки член на екипа и CI runner да използва идентична версия на средата за изпълнение
- Използвайте `–reinstall-packages-from` при надграждане на версии на Node.js, за да избегнете ръчното преинсталиране на глобални инструменти
- Заредете NVM изрично във всеки неинтерактивен скрипт (cron, systemd, CI конвейери) — никога не приемайте, че профилът на шела е бил зареден
- Проверявайте глобалните пакети за всяка версия с `npm list -g –depth=0` след превключване на версии, за да откривате липсващи зависимости навреме
- Фиксирайте точни версии в `.nvmrc` (напр. `20.14.0`) вместо псевдоними (напр. `lts`) за максимална възпроизводимост в производство
- Проверявайте `which node` след превключване на версии, за да потвърдите, че не използвате случайно системно инсталиран двоичен файл
Често задавани въпроси
Изисква ли NVM sudo или root достъп за инсталиране на Node.js?
Не. NVM инсталира всичко под `~/.nvm` в домашната директория на текущия потребител. Не са необходими root привилегии за инсталиране или превключване на версии на Node.js. Това е едно от основните му предимства пред системните мениджъри на пакети.
Защо се появява `nvm: command not found` след инсталацията?
Блокът за инициализация на NVM е добавен към вашия шел профил, но профилът не е презареден в текущата сесия. Изпълнете `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 unit файлове. Уверете се, че тези неинтерактивни среди изрично зареждат NVM или препращат към пълния път до двоичния файл, както е описано в раздела за CI/CD по-горе.
