Weather Forecast
March 5, 2023

WeatherForecast. Dev. Deploy. Selectel.

И так, у нас есть проект в стадии разработки, и я хочу проверить как он будет разворачиваться на виртуальном сервере с подключением к реальным базам данным. Заодно, ещё раз потренируемся.

Создаем виртуальную машину. Только в этот раз в настройках сети выбираем "Приватная подсеть + 1 публичный IP". Наш сервер будет доступен по публичному IP, а базы данных будут находиться в приватной сети, и будут доступны только внутри неё. По соображениям безопасности лучше избегать выставления баз данных наружу.

В этот раз нам понадобится размер диска побольше, потому что 5 ГБ не хватит, я увеличил размер диска до 7ГБ.

После создания сервера мы видим в консоли 2 IP адреса: первый - публичный, второй - внутри приватной сети.

Далее настраиваете подключение по SSH.

Затем устанавливаете ПО: NGINX и ufw, dotnet

Ещё нам понадобится программа Git, чтобы скачать исходники с GitHub. Устанавливаете командой:

sudo apt install git -y

Теперь скачиваем исходники проекта, я качаю только ветку dev, последний коммит:

git clone --depth 1 -b dev https://github.com/deploy2production/weather-forecast.git

Переходим в каталог проекта и собираем его для публикации:

cd weather-forecast/
dotnet publish DeployToProduction.WeatherForecast.App --configuration Release

Теперь нам нужно создать базы данных. Заходим в панель управления Selectel, в левом меню выбираем "Облачная платформа" -> "Базы данных", жмем "Создать кластер".

Первой базой данных мы создадим Postgres.

Выбираем "Произвольная" конфигурация и ставим минимальные ресурсы, мы тренируемся, тратить лишние деньги нам ни к чему. Реплики нам тоже пока не нужны.

В настройках сети выбираем ранее созданную с виртуальной машиной подсеть.

И жмем "Создать кластер баз данных".

Второй базой данных создаем Redis. Также выбираем минимальные ресурсы.

Выбираем политику вытеснения. И генерируем пароль. С паролем тут аккуратно. Нам нужен пароль без запятых (замените запятые на другой символ). Сохраните пароль.

Выбираем подсеть. Жмем "Создать кластер баз данных".

Ждем пока базы данных будут созданы.

Теперь нужно настроить Postgres: создать пользователя и базу данных.

Кликаем на строку "WeatherForecastPgsql" в списке кластеров, выбираем вкладку "Пользователь".

Жмем "Создать пользователя". Вводим имя и пароль.

Ждем завершения операции:

Открываем вкладку "Базы данных", жмем "Создаем базу данных".

Выбираем имя, и влаельца, жмем "Создать".

Готово.

На вкладке "Настройки" вы можете увидеть как подключиться к базе данных, нам эта информация пригодится при настройке ConnectionStrings нашего сервиса:

С настройкой демонов вы уже знакомы. Кратко:

sudo nano /etc/systemd/system/weatherforecast.service

Меняем в настройках путь к каталогу куда проект был опубликован, имя dll-ки. И добавляем два ключа Environment (ConnectionStrings + два символа _ + название = значение в кавычках):

[Unit]
Description=weatherforecast

[Service]
WorkingDirectory=/home/aseverin/weather-forecast/DeployToProduction.WeatherForecast.App/bin/Release/net7.0/publish
ExecStart=dotnet ./DeployToProduction.WeatherForecast.App.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=weatherforecast
User=aseverin
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://127.0.0.1:5022
Environment=ConnectionStrings__Postgres="Host=192.168.0.115;Port=6432;UserName=webapp;Password=*******;Database=weatherforecast"
Environment=ConnectionStrings__Redis="192.168.0.136:6379,password=********"


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

Запускаем:

sudo systemctl enable weatherforecast.service
sudo systemctl start weatherforecast.service

Настраиваем NGINX:

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

Оставляем только один сервер для обработки запросов:

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

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

sudo service nginx restart

Результат:

И давайте бонусом настроим DNS для нашего проекта.

Я открываю панель управления доменами в REG.RU, выбираю домен deploy2production.ru, жму "Добавить запись".

Выбираю запись "А"

Ввожу под-домен weather-forecast и публичный IP адрес моей виртуальной машины, жму "Готово":

Ждем, когда изменения DNS вступят в силу. Проверяем:

Готово.

З.Ы.

Не забываем после экспериментов и тренировок удалять не нужные ресурсы (виртуальные машины, базы данных)