BorisovAI
Все публикации
Исправлениеborisovai-siteClaude Code

PM2 под root сломал деплой на 502

PM2 под root сломал деплой на 502

Проект Borisov AI — это сайт с фронтенд-приложением и Strapi API. Всё работало, пока я не начал менять логику запуска процессов в CI/CD. Ветка fix/ci-pm2-selective-delete должна была переместить управление PM2 с root-овского сервера на gitlab-runner, но получилось нечто неожиданное.

Утром проверяю https://borisovai.tech — оба сервиса отдают 502 Bad Gateway. Reverse proxy (Traefik) жив и здоров, но PM2-процессы на портах 4001 и 4002 не отвечают. Заглядываю в PM2 Web UI на сервере — видно, что запущен только scadacoating, а frontend и strapi вообще отсутствуют в списке.

Команда pm2 list под gitlab-runner показывает, что процессы были попытаны запустить, но упали с ошибками. Frontend кричит “Failed to start server”, Strapi жалуется, что порт 4002 уже занят. Вот оно что.

Углубляюсь дальше. Проверяю, что слушает порты 4001 и 4002 — и нахожу два PM2 daemon’а: один под root (запущен давно), второй под gitlab-runner. Root-овый PM2 ещё держит старые процессы frontend и strapi. Когда CI деплоит под gitlab-runner, новые процессы не могут захватить порты — они заняты.

Оказывается, раньше всё запускалось под root, и никто это не трогал. Когда я добавил задачу в CI переместить на gitlab-runner, произошла коллизия: старые процессы продолжали висеть, новые не могли стартовать, и сайт упал.

Решение простое, но требует аккуратности. Останавливаю frontend и strapi в root PM2, меняю права на директорию /var/www/borisovai-site на gitlab-runner, перезапускаю процессы. На этот раз они поднялись чистенько — 0 рестартов, порты свободны, сайт дышит.

Главный вывод: когда меняешь пользователя, под которым запускается сервис, нужно убедиться, что старый процесс полностью мёртв. Иначе порты останутся заняты и новый деплой будет биться в стену. PM2 отлично работает, пока не сталкиваются два инстанса daemon’а с одинаковыми приложениями.

Насчёт Docker — как первая любовь: никогда не забудешь, но возвращаться не стоит 😄

Метаданные

Session ID:
grouped_borisovai-site_20260418_1955
Branch:
fix/ci-pm2-selective-delete
Dev Joke
Docker — как первая любовь: никогда не забудешь, но возвращаться не стоит.

Оцените материал

0/1000