Развертывание приложения на примере .net core 3.1

LAPKI

Продвинутый
26 Окт 2018
231
55
Всем привет! Сегодня мы поговорим о развертывании вашего приложения на удаленном сервере.
Для начала предоставляю глоссарий используемых в статье определений:
Api-сервер (или приложение) - Ваше приложение, написанное на одном из языков программирования.
Сервер - Удаленная машина, на которой вы размещаете ваше приложение.
SSH (Secure Shell) - протокол доступа к серверу по удаленному соединению. (удаленный от слово "далеко", а не от слова "удалить")
FTP(File Transfer Protocol) / SFTP(SSH File Transfer Protocol) - протокол передачи файлов на сервер.
PuTTY - приложение для доступа по SSH.
WinSCP/FileZilla - приложения для доступа по FTP/SFTP.
HTTP(HyperText Transfer Protocol) - протокол передачи гипертекстовых сообщений. (html-страниц, json-объектов, текста и т.п.)
HTTPS(HyperText Transfer Protocol Secure) - протокол защищенной передачи гипертекстовых сообщений.
URL(Uniform Resource Locator) - унифицированный указатель на ресурс. По простому - ссылка.
Docker - программа, обеспечивающая автоматизированное развертывание приложений на локальной машине в виде контейнеров.
Docker-контейнер (далее контейнер) - Виртуальная обособленная среда(не день недели, а синоним слова "окружение"), в которой разворачивается приложение.
docker-compose - программа, позволяющая управлять несколькими контейнерами, связывать их между собой и с внешним ( относительно контейнера ) окружением.
Dockerfile - файл настройки сборки и запуска вашего приложения в контейнере.
Контейнеризация - запуск приложения в контейнере.
dotnet - программа для сборки и запуска приложений платформы .net
Nginx - http/proxy-сервер. В нашем случае будет использоваться именно как proxy-сервер.
MySQL - База данных / сервер баз данных.
рут / root - пользователь со всеми правами (имеющий полный доступ).
вход из под рута - исполнение действий от лица root-пользователя.
Следует заметить, что вышеперечисленные определения могут не использоваться в тексте статьи, но использовались в ходе развертывания.
Используемое окружение:
1) удаленный сервер на базе Linux(в моем случае это Ubuntu 18.04) ( я использую сервера digitalocean в связи с их дешевизной, но многие ip могут быть заблокированны на территории России)
2) Созданный проект .net Core ( в моем случае версия .net core 3.1), ссылка на решение будет прикреплена к посту; описание приложения будет ниже.
3) WinSCP
4)PuTTY
5)Google Chrome

Шаг 1.
Подключаемся к нашему удаленному серверу по SSH. Стандартный порт SSH - 22, хост - IP адрес сервера.
Шаг 2. Устанавливаем необходимое серверное окружение, а именно:
1. Nginx
Bash:
            apt install nginx
2. dotnet SDK
Bash:
            snap install dotnet-sdk --classic
            snap alias dotnet-sdk.dotnet dotnet
3. dotnet ef
Bash:
            dotnet tool install -g dotnet-ef --version 3.1
            export DOTNET_ROOT=/snap/dotnet-sdk/current
            export MSBuildSDKsPath=$DOTNET_ROOT/sdk/$(${DOTNET_ROOT}/dotnet --version)/Sdks
            export PATH="${PATH}:${DOTNET_ROOT}"
            export PATH="$PATH:$HOME/.dotnet/tools"
4.Docker
Bash:
            apt install docker.io
5.Docker-compose
Bash:
            apt install docker-compose
6. MySQL
Bash:
            apt install mysql-server
Шаг 3. Настраиваем окружение:
1. Nginx
a) Открываем сервер в WinSCP. Стандартный порт для FTP - 21. Хост - IP вашего сервера.
b) идем по пути (от корня сервера, а не от папки /root; изначально у вас открывается папка /root) /etc/nginx/sites-available/
с) Так как мы не планируем вешать разные приложения на разные порты и не используем веб, то копируем файл default в папку корень сервера/home, чтобы у нас были бэкапы на всякий случай
d) Возвращаемся в /etc/nginx/sites-available/
e) заменяем содержимое файла default на следующий текст
Код:
                server {
                    listen 80;
                    server_name dota;
                    access_log /home/dota/nginx_access.log;
                    error_log /home/dota/nginx_error.log;

                location / {
                    proxy_pass http://localhost:5000;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
                    }
                }
f) Сохраняем файл и закрываем
2. MySQL
Все действия будут производится в PuTTY:
пишем(без двойных кавычек( это вот такие ") и нумерации ("a)" "b)" и т.п. )
a)"mysql"
b)
SQL:
CREATE USER 'СЮДА ПИШЕТЕ ИМЯ ПОЛЬЗОВАТЕЛЯ ДЛЯ MYSQL'@'localhost' IDENTIFIED BY 'СЮДА ПИШЕТЕ ПАРОЛЬ ПОЛЬЗОВАТЕЛЯ MYSQL';
с)
SQL:
GRANT ALL PRIVILEGES ON (СЮДА ПИШЕТЕ НАЗВАНИЕ БАЗЫ ДАННЫХ БЕЗ КАВЫЧЕК В КОТОРЫХ ЭТОТ ТЕКСТ) . * TO 'ТУТ ИМЯ ПОЛЬЗОВАТЕЛЯ MYSQL'@'localhost';
b-с) (пример, это не надо повторно писать)
SQL:
                CREATE USER 'dota'@'localhost' IDENTIFIED BY '1234';
                GRANT ALL PRIVILEGES ON dotaapi . * TO 'dota'@'localhost';
d) [/CODE]FLUSH PRIVILEGES[/CODE];
e) чтобы выйти из консоли mysql в системную консоль пишем "exit"
3. Приложение
a) идем в папку DotaAPI и открываем файл appsettings.json
b) в нем - нас интересует строка 3, там меняем значение секретного ключа на свое ( поле SigningSecret)
строка 7, меняем значение Database на имя вашей базы данных (в моем случае и по умолчанию стоит dotaapi)
меняем значение user на имя вашего пользователя mysql (в моем случае и по умолчанию стоит dota)
меняем значение password на пароль вашего пользователя mysql (в моем случае и по умолчанию стоит 1234)
с) копируем весь проект (всю приложенную папку) в корень_сервера/home (копирование может занять несколько минут, так как ftp медленный)
4. Связка приложения и MySQL
пишем в консоли
a)
Bash:
cd /home/dota/DotaAPI
b)
Bash:
dotnet ef migrations add ТУТ НАЗВАНИЕ ВАШЕЙ МИГРАЦИИ БЕЗ ПРОБЕЛОВ ОБЫЧНО НА ПЕРВУЮ МИГРАЦИЮ ПИШЕТСЯ Init
c)
Bash:
dotnet ef database update
d) проверяем что все таблицы создались
i) пишем mysql
ii)
SQL:
use НАЗВАНИЕ ВАШЕЙ БАЗЫ ДАННЫХ
iii)
SQL:
show tables;
iv) выходим с помощью команды exit
5. Обновляем Nginx
Bash:
service nginx restart
6. Проверяем приложение на сервере
все делаем в консоли
Переходим в папку /home/dota/DotaAPI
Bash:
cd /home/dota/DotaAPI
запускаем приложение
Bash:
dotnet run
ДАЛЕЕ НЕ НАЖИМАЕМ В PuTTY НИЧЕГО
открываем Google Chrome или любой другой браузер и пишем там http://IP вашего сервера/api/version
и видим "0.9". Это значит что наш браузер нашел удаленный сервер и смог получить данные от нашего приложения
7. Контейнеризация
Данный шаг самый простой, так как ранее мы установили все необходимое, а в файлах проекта уже есть все нужные и настроенные файлы
a) переключаемся в PuTTY и нажимаем комбинацию клавиш ctrl + c, что завершит работу приложения.
b) Переходим в папку /home/dota/DotaAPI (
Bash:
cd /home/dota/DotaAPI
)
c) пишем
Bash:
docker-compose build
и ждем пока все загрузится
d) пишем
Bash:
docker-compose up
На данном этапе мы видим кучу логов "warning CS1591: Missing XML comment", не пугайтесь, так и должно быть. Закрываем PuTTY через крестик обновляем страницу в браузер. Если все так же у вас отображается "0.9", то поздравляю, вы все сделали правильно.
8. Для обновления вашего сервера вам достаточно:
a) заменить приложение в папке /home/dota на новую версию.
b) открыть PuTTY
с) перейти в папку /home/dota/DotaAPI (
Bash:
cd /home/dota/DotaAPI
)
d) написать "docker-compose build && docker-compose up"
Видео, демонстрирующее вышеописанные действия(12 минут без музыки, сори, можно поставить на х2, там не особо все быстро):

Разберем часть приложения
В файл Program.cs можете не залезать, там ничего интересного нет
Первый фал который мы рассмотрим это Startup.cs
1) строки 33-55 - это уже готовая авторизация основанная на ролях. Сами роли добавляются в Enums/UserRole
2) строка 56 - здесь мы связываем наше приложение с MySQL
3) строки 57-59 - добавляем сервисы, которые определены в Services. Для добавления своего сервиса надо добавить сюда строчку с названием класса вашего сервиса
Больше нас здесь ничего не интересует
Папка Data
Расписывать я её особо не буду, там хранятся все модели БД и возвращаемые модели, а так же контекст БД
Чтобы добавить свою таблицу вам надо добавить строчку в DotaAPIContext (например "public DbSet<MyCustomStructure> MyStructures {get;set;}") и соответственно создать модель ( в нашем случае класс MyCustomStructure) примеры структур есть в папке Models
Папка Services
Тут расположен слой между контроллером и данными, здесь мы получаем данные из бд, обрабатываем их и отдаем котнроллеру
Примеры методов можете посмотреть непосредственно в классах *Service
Папка Controllers
Когда вы обращаетесь к серверу после прохождения Startup он посылает вас непосредственно в контроллером
В классе контроллера мы можем определить по какому адресу какой метод будет выполняться, например
[HttpPost("/api/users/{player_id}/unban")] будет обрабатывать POST запросы по указанному в скобках пути
[HttpGet("/api/relics/get")] будет обрабатывать GET запросы по указанному в скобках пути
Аттрибут Authorize дает доступ только пользователям определенных ролей, всем остальным возвращает код 403 - Forbidden(доступ запрещен)
[Authorize(Roles = "Admin")] - доступ только пользователям с ролью Admin
[Authorize] - доступ только авторизованным пользователям
Об остальном можете почитать в интернете или спросить меня
В заключении хочу сказать, что описанное в статье - лишь малая часть того, что можно реализовать в проекте. Надеюсь статья была вам полезна.
Любой фидбек можете оставлять в комментариях ниже, в лс на форуме или в дискорде LAPKI#5570

Полезные ссылки:
Документация docker - https://docs.docker.com/
docker-compose - https://docs.docker.com/compose/
Настройка проксирования Nginx - https://losst.ru/nastrojka-proksi-nginx#_Nginx
Dotnet SDK(для разработки на .net core)- https://dotnet.microsoft.com/download/dotnet-core/3.1
Spring Initalizr (для разработки на java) - https://start.spring.io/
Spring MVC get started - https://spring.io/guides/gs/serving-web-content/
JDK - https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
UPD: Не могу загрузить архив с приложением, ищу админа чтобы нормально залить, а пока вот вам (переименовать с .txt на .rar) Файлы проекта
 
Последнее редактирование:

bobi

Активный
24 Июл 2017
92
11
Если не сложно обновите ссылку на проект
 
Реклама: