Версия Node.js в стандартных репозиториях обычно отстаёт. Возьмите актуальную LTS: либо из репозитория NodeSource (одна версия для всей системы), либо через nvm (своя версия для каждого пользователя).
Вариант 1: NodeSource
$ curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh$ bash nodesource_setup.sh$ apt install -y nodejs$ node -v && npm -vВариант 2: nvm
Выполняйте от пользователя, под которым будет работать приложение (не root). Актуальную версию установщика смотрите в репозитории nvm-sh/nvm на GitHub.
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash$ source ~/.bashrc$ nvm install --lts$ node -vОтдельный пользователь
Не запускайте приложение от root: уязвимость в зависимости не должна давать полный доступ к серверу.
$ adduser --disabled-password --gecos "" app$ mkdir -p /srv/app && chown app:app /srv/appЗапуск под PM2
При установке через NodeSource поставьте PM2 от root, при nvm — от пользователя app:
$ npm install -g pm2$ su - app$ cd /srv/app$ npm ci --omit=dev$ pm2 start server.js --name app$ pm2 statusУдобнее описать процесс в файле, чтобы параметры хранились в репозитории:
module.exports = { apps: [ { name: 'app', script: 'server.js', instances: 1, env: { NODE_ENV: 'production', PORT: 3000, HOST: '127.0.0.1' }, max_memory_restart: '400M', }, ],};$ pm2 start ecosystem.config.js$ pm2 logs app --lines 50Автозапуск после перезагрузки
pm2 startup печатает команду для создания службы systemd — выполните её от root, как она подсказывает. Затем сохраните список процессов:
$ pm2 startup systemd$ # выполните напечатанную команду вида: sudo env PATH=… pm2 startup systemd -u app --hp /home/app$ pm2 saveПубликация за Nginx
Приложение слушает 127.0.0.1:3000. Настройте проксирование по статье «Nginx как обратный прокси для приложения» и выпустите сертификат через certbot.
Проверьте результат
$ curl -I http://127.0.0.1:3000$ sudo reboot$ # после перезагрузки$ pm2 statusЧастые ошибки
- После перезагрузки приложение не поднялось — не выполнена команда из
pm2 startupили забытpm2 save. - pm2 не найден в cron или systemd — при установке через nvm путь к node есть только в интерактивной оболочке. Указывайте полный путь.
- Приложение слушает 0.0.0.0 — порт доступен снаружи в обход Nginx. Задайте HOST=127.0.0.1.