07-pm2 — PM2 (менеджер процессов Node)

Глобально ставит PM2, настраивает автозапуск приложений через systemd от имени пользователя деплоя и подключает ротацию логов. ☐ опциональный модуль.

Зачем нужен

PM2 — менеджер процессов для Node-приложений. Он держит приложение запущенным (перезапускает при падении), запускает его при загрузке сервера, ведёт логи и позволяет управлять несколькими процессами одной командой. Без PM2 приложение пришлось бы запускать вручную и оно бы не пережило перезагрузку сервера.

Модуль также настраивает автозапуск через systemd (штатный менеджер служб Linux) — так сохранённый список приложений PM2 поднимается автоматически после reboot, и ставит pm2-logrotate, чтобы логи приложений не росли бесконечно.

Когда включать и когда не нужен

Включайте вместе с модулем node, если разворачиваете Node-, Python- или Go-приложения через mitdev app с пресетами node/next/nest, fastapi/django, go — все они запускаются под PM2.

Не нужен, если приложения работают в Docker (mitdev app docker), обслуживаются через PHP-FPM (laravel/wordpress) или это статический сайт (static) — там процесс-менеджер PM2 не задействован.

Зависимости и требования

Что именно делает

Шаги module_install (файл modules/07-pm2.sh):

  1. Проверяет наличие npm, читает DEPLOY_USER.
  2. Глобальная установка PM2: npm install -g pm2@latest.
  3. Автозапуск через systemd. Команда pm2 startup systemd -u <deploy> --hp /home/<deploy> выполняется от root — она сразу записывает systemd-юнит pm2-<deploy>.service. Клиенту НЕ нужно копировать и вставлять никакую команду вручную (обычно pm2 startup печатает команду для ручного запуска — здесь этот шаг уже сделан за вас).
  4. pm2-logrotate ставится от имени пользователя деплоя (pm2 install pm2-logrotate) и настраивается: максимальный размер файла лога 50M, хранить 14 ротаций.
  5. pm2 save --force — сохраняет текущий (пока пустой) список процессов, чтобы он восстановился после перезагрузки.
  6. Верификация и отметка модуля.

Что будет после reboot: systemd поднимет pm2-<deploy>.service, PM2 прочитает сохранённый список (pm2 save) и запустит все приложения, которые были в нём на момент последнего pm2 save. Поэтому после ручного добавления/удаления приложения через pm2 нужно делать pm2 savemitdev app/deploy это происходит автоматически).

Файлы, службы и порты

Путь / объект Назначение Права
/usr/lib/node_modules/pm2 (или /usr/local/lib/...) глобальный пакет PM2 системные
/usr/bin/pm2 бинарник PM2 системные
/etc/systemd/system/pm2-<deploy>.service юнит автозапуска PM2 для пользователя деплоя root
/home/<deploy>/.pm2/ рабочий каталог PM2: сохранённый список процессов (dump.pm2), логи, pid-файлы владелец — deploy
/home/<deploy>/.pm2/logs/ stdout/stderr каждого приложения владелец — deploy
/var/lib/mitdev/state/pm2.done отметка, что модуль установлен root

PM2 собственных портов не открывает — их слушают приложения, которыми он управляет (по умолчанию 127.0.0.1:3000).

Настройка

Отдельных переменных defaults.conf у модуля нет. Он использует общий DEPLOY_USER (по умолчанию deploy), а параметры pm2-logrotate заданы в коде модуля:

Параметр Значение На что влияет
pm2-logrotate:max_size 50M при каком размере лог ротируется
pm2-logrotate:retain 14 сколько повёрнутых файлов хранить

Как переопределить настройки

DEPLOY_USER задаётся при первичной установке (переменная DEPLOY_USER_DEFAULT в config/defaults.conf или экспорт перед sudo -E ./install.sh). Параметры pm2-logrotate меняются уже на работающем сервере от имени пользователя деплоя:

# Хранить логи по 100M и 30 ротаций:
sudo -u deploy -H pm2 set pm2-logrotate:max_size 100M
sudo -u deploy -H pm2 set pm2-logrotate:retain 30

Установить модуль отдельно (после первичной настройки):

sudo mitdev add pm2

Интерактивных вопросов модуль не задаёт.

Проверка, что всё работает

Автоматическая верификация проверяет, что есть pm2 и pm2 -v отрабатывает.

Вручную (важно: команды PM2 запускают от имени пользователя деплоя, иначе увидите пустой список root'а):

pm2 -v                                   # версия PM2
sudo -u deploy -i pm2 status             # список приложений и их статус (online/stopped)
sudo -u deploy -i pm2 ls                 # то же самое
systemctl status pm2-deploy.service      # юнит автозапуска активен
sudo -u deploy -i pm2 logs --lines 50    # последние строки логов всех приложений

sudo -u deploy -i запускает команду как пользователь deploy в его окружении (флаг -i — login-shell, чтобы подхватился PATH и переменные PM2).

Развёртывание приложения на этом рантайме

PM2 сам по себе приложения не разворачивает — он выступает менеджером процессов для рантаймов Node/Python/Go. Полный сквозной пример — в доке соответствующего рантайма:

Общая схема для любого из них:

sudo mitdev app next webapp https://github.com/you/webapp.git app.example.com
#  → mitdev соберёт приложение и выполнит (от deploy):
#    pm2 start ... --name webapp && pm2 save --force
sudo -u deploy -i pm2 status             # webapp в состоянии online
sudo -u deploy -i pm2 logs webapp        # логи приложения
sudo mitdev deploy webapp                # обновление: git pull + build + pm2 restart --update-env

Типовые задачи

# Статус всех приложений (от имени deploy):
sudo -u deploy -i pm2 status

# Логи конкретного приложения (живой поток):
sudo -u deploy -i pm2 logs webapp
mitdev logs pm2                          # то же через mitdev

# Перезапустить / остановить / запустить приложение:
sudo -u deploy -i pm2 restart webapp
sudo -u deploy -i pm2 stop webapp
sudo -u deploy -i pm2 start webapp

# Обновить сам PM2:
sudo npm install -g pm2@latest
sudo -u deploy -i pm2 update             # перезапустить демон PM2 на новую версию

# Сохранить текущий список процессов (чтобы поднялся после reboot):
sudo -u deploy -i pm2 save

# Проверить, что автозапуск переживёт перезагрузку:
systemctl is-enabled pm2-deploy.service  # ожидается: enabled

Частые ошибки

Симптом: pm2 status от root показывает пустой список, хотя приложение работает. Причина: PM2 у каждого пользователя свой; приложения крутятся под deploy. Решение: sudo -u deploy -i pm2 status.

Симптом: после reboot приложения не поднялись. Причина: список процессов не был сохранён (pm2 save) после последнего изменения. Решение: sudo -u deploy -i pm2 save; проверьте systemctl status pm2-deploy.service.

Симптом: установка модуля падает «npm не найден — модуль node обязателен для PM2». Причина: не установлен модуль 04-node. Решение: sudo mitdev add node, затем sudo mitdev add pm2.

Симптом: логи приложения занимают весь диск. Причина: pm2-logrotate не установился или лимиты слишком большие. Решение: проверьте sudo -u deploy -i pm2 ls (в списке модулей должен быть pm2-logrotate); при необходимости понизьте max_size/retain (см. «Как переопределить настройки»).

Безопасность и продакшен

Откат и удаление

module_rollback (при сбое установки): снимает автозапуск (pm2 unstartup systemd) и удаляет PM2 глобально.

Ручное удаление:

sudo mitdev remove pm2            # PM2 удалён, каталог ~/.pm2 пользователя сохранён
sudo mitdev remove pm2 --purge   # плюс удаляется ~deploy/.pm2 (список процессов и логи)

module_remove: останавливает демон PM2 (pm2 kill от имени deploy), снимает автозапуск, удаляет юнит /etc/systemd/system/pm2-<deploy>.service, перечитывает systemd (daemon-reload) и удаляет PM2 через npm uninstall -g pm2. Если модуль node уже удалён, PM2 уходит вместе с Node — в этом случае модуль просто сообщит об этом. Каталог ~/.pm2 (сохранённый список процессов и логи) по умолчанию сохраняется; удаляется только с --purge.

См. также