У меня есть 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