Установка Node.js через nvm и запуск приложения через pm2
Запустить на сервере одной командой (сначала проверьте содержимое скрипта ниже):
curl -sSL https://cp.lv/scripts/ustanovit-nodejs-pm2.sh | sudo bash…или через wget:
wget -qO- https://cp.lv/scripts/ustanovit-nodejs-pm2.sh | sudo bashСодержимое скрипта ustanovit-nodejs-pm2.sh:
#!/usr/bin/env bash
set -e
APP_DIR=/var/www/myapp
# 1. Установка nvm и загрузка в текущую сессию
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# 2. Node.js LTS по умолчанию
nvm install --lts
nvm use --lts
nvm alias default 'lts/*'
# 3. Зависимости приложения (точные версии из lock-файла)
cd "$APP_DIR"
npm ci --omit=dev
# 4. Установка pm2 и запуск приложения
npm install -g pm2
pm2 start app.js --name myapp
# 5. Автозапуск после перезагрузки сервера
sudo env PATH=$PATH:$(dirname "$(command -v node)") \
pm2 startup systemd -u "$USER" --hp "$HOME"
pm2 save
pm2 status
echo "Node.js-приложение myapp запущено под pm2."
Чтобы Node.js-приложение работало в продакшене стабильно, его нельзя просто запустить командой node app.js в SSH-сессии — оно остановится при выходе. Нужен менеджер процессов pm2: он держит приложение живым, перезапускает при падении и стартует после перезагрузки сервера. А устанавливать сам Node.js удобно через nvm — тогда легко переключать версии.
Шаг 1. Установка nvm
nvm (Node Version Manager) ставит Node.js без прав root и позволяет держать несколько версий:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc
Проверьте:
nvm --version
Шаг 2. Установка Node.js LTS
Ставьте LTS-версию — она стабильна и получает долгую поддержку:
nvm install --lts
nvm use --lts
nvm alias default lts/*
Проверьте версии:
node -v
npm -v
Шаг 3. Подготовка приложения
Загрузите код (через git clone или rsync), установите зависимости в продакшен-режиме:
cd /var/www/myapp
npm ci --omit=dev
npm ci устанавливает точные версии из package-lock.json — предсказуемее, чем npm install. Проверьте, что приложение запускается:
node app.js
Если увидели «server listening on port 3000» — остановите (Ctrl+C) и переходите к pm2.
Шаг 4. Установка и запуск pm2
Установите pm2 глобально и запустите приложение:
npm install -g pm2
pm2 start app.js --name myapp
Для приложений с точкой входа в package.json:
pm2 start npm --name myapp -- run start
Проверьте статус:
pm2 status
pm2 logs myapp
Шаг 5. Автозапуск после перезагрузки
Чтобы pm2 поднимал приложения при старте сервера, сгенерируйте systemd-сервис и сохраните список процессов:
pm2 startup systemd
# выполните команду, которую pm2 выведет (начинается с sudo env ...)
pm2 save
pm2 save фиксирует текущий набор процессов, а pm2 resurrect восстановит их после перезагрузки автоматически.
Шаг 6. Режим кластера (по желанию)
Если приложение поддерживает несколько воркеров, pm2 может запустить процесс на всех ядрах CPU:
pm2 start app.js --name myapp -i max
Это балансирует нагрузку между ядрами без внешнего балансировщика.
Полезные команды pm2
| Задача | Команда |
|---|---|
| Список процессов | pm2 list |
| Перезапуск | pm2 restart myapp |
| Плавная перезагрузка | pm2 reload myapp |
| Остановить | pm2 stop myapp |
| Удалить из pm2 | pm2 delete myapp |
| Мониторинг | pm2 monit |
Частые вопросы
Зачем nvm, если Node.js есть в apt? Версия в репозитории Ubuntu часто устаревшая. nvm ставит любую нужную версию и позволяет быстро переключаться между проектами с разными требованиями.
Чем отличается pm2 restart от reload?
restart перезапускает процесс полностью (с кратким простоем), reload в режиме кластера перезапускает воркеры по очереди без простоя (zero-downtime).
Приложение падает — pm2 его поднимет?
Да, pm2 автоматически перезапускает упавший процесс. Настройте --max-restarts и следите за логами, чтобы не зациклить перезапуск при постоянной ошибке.
Как ограничить память процесса?
Флаг --max-memory-restart 300M перезапустит приложение при превышении лимита — защита от утечек памяти.
Node.js-приложения выиграют от быстрого CPU и достаточной памяти. Подобрать сервер можно на странице аренда VPS, а для контейнеризированных сборок пригодится VPS для Docker.
