Назад | Перейти на главную страницу

Промышленный стандарт для приложений с несколькими узлами на одном VPS?

У меня есть VPS, который запускает несколько узловых приложений за обратным прокси. Каждое приложение запускается через pm2 другим пользователем (т.е. каждый пользователь запускает pm2 самостоятельно), переменные среды, специфичные для приложения, устанавливаются в .bashrc этого пользователя. Обновления кода контролируются через git, вся логика пост-обновления перемещается в обработчик пост-получения.

Эта конфигурация пока работает нормально. Однако меня не покидает неприятное ощущение, что существует широко известное и общепринятое решение, которое я как-то пропустил - большинство онлайн-руководств предполагают, что один пользователь использует pm2 для запуска нескольких приложений, или предлагают докер.

Есть ли общепринятый способ запуска приложений с несколькими узлами на одном сервере, например, расположение кода и контроль версий, роли пользователей, программное обеспечение для управления?

В наши дни Docker - обычное решение, но само по себе оно не очень хорошо подходит для многопользовательской среды.

Вы можете масштабировать - намного больше - с помощью чего-то вроде Kubernetes или OpenShift, но для небольшого VPS это, вероятно, слишком сложно.

Противные хакерские программы вроде pm2, supervisord, forever и т. Д. Можно использовать, но systemd в значительной степени делает их устаревшими.

Рассмотрите возможность перехода на systemd пользователь Сервисы, которым каждый пользователь может управлять по своему желанию. Я запускал службы в NodeJS, Go и Ruby on Rails с помощью этого метода. Он подходит практически для всего, о чем вы можете подумать.

Тривиальный пример (который, вероятно, потребует расширения):

$ cat $HOME/.config/systemd/user/nodejs-against-humanity.service
[Unit]
Description=NodeJS Against Humanity

[Service]
ExecStart=/home/error/nodejs-against-humanity/server.js
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/home/error/nodejs-against-humanity

[Install]
WantedBy=default.target

Пользователь может разместить пользовательский блок в $HOME/.config/systemd/user, а администратор может размещать пользовательские блоки, которые могут использоваться всеми пользователями (что необычно, но иногда полезно) в /etc/systemd/user.

Затем пользователь может управлять службой с помощью обычных команд systemd с --user добавлен флаг, например

$ systemctl --user enable nodejs-against-humanity
Created symlink from /home/error/.config/systemd/user/default.target.wants/nodejs-against-humanity.service to /home/error/.config/systemd/user/nodejs-against-humanity.service.
$ systemctl --user start nodejs-against-humanity

Обратите внимание, что для запуска пользовательских служб при загрузке root должен включить задержку для этого пользователя.

$ sudo loginctl enable-linger username