Виртуальная машина
February 21, 2023

Виртуальная машина. Демоны.

Предисловие

Когда мы тренировались локально, настраивали NGINX, мы запусками проекты командой dotnet run. В "бою" так, конечно, не делают. Во-первых, проект собирают для публикации. Во-вторых, настраивают систему так, чтобы она запускала приложение в фоновом режиме, на языке linux, создают демонов. Этим мы сейчас и займемся.

Но прежде взглянем на несколько команд, которые нам пригодятся. В Ubuntu, когда вы подключаетесь по ssh или открываете терминал в WSL, вы попадаете в свой "домашний" каталог. Его путь выглядит так: /home/<username>. Этот путь можно вывести командой pwd, как только вы открыли терминал. pwd - выводит путь рабочего каталога, то есть полный путь текущего каталога.

Быстро вернуться в домашний катало можно командой:

cd ~

Проверить как работает наш проект или NGINX можно с помощью программы curl

curl http://127.0.0.1

curl выведет в консоль содержимое ответа сайта/сервера.

Поехали

Мы только создали виртуальную машину и установили нужное нам ПО. Теперь создадим шаблонные проекты и выполним команду publish, которая скомпилирует проект и сложит в каталог готовый для запуска:

mkdir deploy2production
cd deploy2production/
dotnet new webapp
dotnet publish --configuration Release
cd ..
mkdir deploy2production2
cd deploy2production2/
dotnet new webapp
dotnet publish --configuration Release
cd ..

Опубликованный проект будет находиться по относительному пути:

./bin/Release/net7.0/publish

В нашей OC Ubuntu установлена подсистема systemd, которая отвечает за управление службами. Её-то мы и будем настраивать. И делать мы это будем, как всегда, редактируя конфигурационные файлы.

Откроем на редактирование файл для первого проекта и вставим в него необходимые нам настройки:

sudo nano /etc/systemd/system/deploy2production.service
[Unit]
Description=deploy2production

[Service]
WorkingDirectory=/home/aseverin/deploy2production
ExecStart=dotnet ./bin/Release/net7.0/publish/deploy2production.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=deploy2production
User=aseverin
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://127.0.0.1:5022

[Install]
WantedBy=multi-user.targetmulti-user.targetmulti-user.target

Вам нужно поправить для себя следующие ключи:

WorkingDirectory - ваш путь к каталогу deploy2production

User - ваш пользователь на виртуальной машине

Аналогично настраиваем фоновый запуск второго проекта

sudo nano /etc/systemd/system/deploy2production2.service
[Unit]
Description=deploy2production2

[Service]
WorkingDirectory=/home/aseverin/deploy2production2
ExecStart=dotnet ./bin/Release/net7.0/publish/deploy2production2.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=deploy2production2
User=aseverin
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://127.0.0.1:5122

[Install]
WantedBy=multi-user.targetmulti-user.targetmulti-user.target

Далее активируем наши настройки:

sudo systemctl enable deploy2production.service
sudo systemctl enable deploy2production2.service

И запускаем наши сервисы:

sudo systemctl start deploy2production.service
sudo systemctl start deploy2production2.service

Проверить состояние сервиса можно командой (выйти Ctrl+C):

sudo systemctl status deploy2production.service

Смотреть журнал работы сервиса (выйти Ctrl+C):

sudo journalctl -fu deploy2production2.service

Теперь осталось настроить NGINX, как это делать вы уже знаете, а здесь кратко:

sudo nano /etc/nginx/sites-available/default

Настройки:

upstream backend {
        server 127.0.0.1:5022;
        server 127.0.0.1:5122;
}
server {
        location / {
                proxy_pass http://backend;
        }
}

Перезапускаем:

sudo service nginx restart

Результат:

Готово!