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 не задействован.
Зависимости и требования
- Требует модуль
04-node— PM2 ставится черезnpm, и еслиnpmне найден, установка модуля прерывается с ошибкой «npm не найден — модуль node обязателен для PM2». - Требует пользователя деплоя (переменная
DEPLOY_USER, по умолчаниюdeploy) — автозапуск и логи настраиваются именно под него. - systemd (есть на всех поддерживаемых дистрибутивах).
Что именно делает
Шаги module_install (файл modules/07-pm2.sh):
- Проверяет наличие
npm, читаетDEPLOY_USER. - Глобальная установка PM2:
npm install -g pm2@latest. - Автозапуск через systemd. Команда
pm2 startup systemd -u <deploy> --hp /home/<deploy>выполняется от root — она сразу записывает systemd-юнитpm2-<deploy>.service. Клиенту НЕ нужно копировать и вставлять никакую команду вручную (обычноpm2 startupпечатает команду для ручного запуска — здесь этот шаг уже сделан за вас). - pm2-logrotate ставится от имени пользователя деплоя (
pm2 install pm2-logrotate) и настраивается: максимальный размер файла лога50M, хранить14ротаций. pm2 save --force— сохраняет текущий (пока пустой) список процессов, чтобы он восстановился после перезагрузки.- Верификация и отметка модуля.
Что будет после reboot: systemd поднимет pm2-<deploy>.service, PM2 прочитает сохранённый список (pm2 save) и запустит все приложения, которые были в нём на момент последнего pm2 save. Поэтому после ручного добавления/удаления приложения через pm2 нужно делать pm2 save (в mitdev 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. Полный сквозной пример — в доке соответствующего рантайма:
- Node/Next/Nest — 04-node.md;
- FastAPI/Django — 21-python.md;
- Go — 22-go.md.
Общая схема для любого из них:
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 (см. «Как переопределить настройки»).
Безопасность и продакшен
- Все приложения работают от непривилегированного пользователя
deploy, а не от root — это правильно, не меняйте. - Приложения слушают только
127.0.0.1и публикуются через nginx; порты приложений в файрволе открывать не нужно. - Следите за размером логов (pm2-logrotate уже настроен) и периодически проверяйте
pm2 statusна количество перезапусков (↺) — рост означает падающее приложение. - После изменения набора приложений всегда делайте
pm2 save, иначе состояние не переживёт reboot.
Откат и удаление
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.
См. также
- 04-node.md — Node.js, без него PM2 не устанавливается.
- 21-python.md, 22-go.md — рантаймы, тоже запускающиеся под PM2.
- ../COMMANDS.md — команды
mitdev app,deploy,logs pm2.