В этой статье я по шагам покажу как:

  1. Развернуть ASP.NET Core приложение

  2. Установить и настроить MS SQL

  3. Установить SSL сертификат

Все это на VPS с чистой системой Ubuntu 20.04.

MS SQL требует минимум 2GB свободной оперативной памяти для установки и запуска.

Показывать я буду на примере готового ASP.NET Core сайта для просмотра аниме (японская анимация). Оно работает и запускается без ошибок на localhost. Приложение использует MS SQL базу данных, которую мы установим и настроим на Шаге шесть.

ASP.NET Core 3.1 Application | MS SQL
ASP.NET Core 3.1 Application | MS SQL

Шаг первый: публикация приложения

В обозревателе решений нажмите правой кнопкой мыши по проекту -> опубликовать.

Если у вас нет профиля, нажмите "Добавить профиль публикации" -> Целевой объект выбираем папка -> Указываем удобно место, куда файлы выгрузятся -> Готово.

Мои настройки профиля:

  • Конфигурация: Release

  • Целевая платформа: net6.0

  • Режим развертывания: Зависит от платформы

  • Целевая среда выполнения: Переносимая версия

Нажимаю опубликовать.

Если у вас другая целевая платформа, то на Шаге три вам нужно будет скачать версию .NET-SDK, которая вам нужна.

Шаг второй: отправить файлы через SFTP и установить SSH соединение

Имя пользователя и пароль пришли мне на e-mail, указанный при регистрации. Обычно имя пользователя стоит root. IP адрес написан в настройках VPS на сайте.

Чтобы подключиться по SFTP (SSH File Transfer Protocol) для передачи файлов, я использую программу FileZilla.

Запускаю -> Файл -> Менеджер сайтов -> Новый сайт

Протокол надо выбрать SFTP - SSH File Transfer Protocol.
Хост - это IP от VPS.
Логин и пароль ввожу из письма, нажимаю соединиться.

На VPS я создал директорию /var/netcore/ и файлы опубликованного приложения, при помощи Drag&Drop перенес в созданную директорию. FileZilla в логах показывает какие-то ошибки, но я их просто игнорирую, и все работает.

Установка SSH соединения. Большинство сайтов предоставляют возможность открыть консоль с SSH прямо в браузере нажатием одной кнопки, но он какой-то лагучий. Сделать это через CMD на windows 10 мне на много удобнее.

ssh <login>@<ip>
ssh root@134.0.118.152

Шаг третий: установить .NET 6.0 на Ubuntu

У меня не было репозиториев Microsoft с .NET-SDK 6.0, поэтому я установил их командами:

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

Я устанавливаю .NET 6.0 и необходимые библиотеки:

sudo apt update
sudo apt install apt-transport-https
sudo apt update
sudo apt install dotnet-sdk-6.0

Шаг четвертый: установить и настроить Nginx

Устанавливаю Nginx:

sudo apt install nginx

Следующие, что надо сделать - это настроить файл конфигурации, который будет перенаправлять запросы по порту 80 (а в будущем и 443 для SSL) на наше ASP.NET Core приложение. Файл конфигурации находится по пути /etc/nginx/sites-available/default

Можете создать файл на вашей ОС и при помощи FileZilla перенести его, или создать его при помощи текстового редактора nano/vim. Я воспользуюсь nano.

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

Содержание файла:

server {
    listen        80;
    server_name vashdomen.com;
    location / {
        proxy_pass         http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Если ваше .NET приложение запущено на другом порте, указывайте его вместо 5000.

Проверяем конфиг на ошибки и перезапускаем nginx, чтобы обновить конфиг:

sudo nginx -t
sudo nginx -s reload

Шаг пятый: создать сервис с ASP.NET Core приложением

По сути этот шаг необязательный и его можно просто пропустить, заменив командой dotnet YourApp.dll. Теперь вы можете в строке браузера написать IP адрес VPS и увидеть ваш сайт. У меня сейчас ошибка 500 из-за отсутствия MS SQL на VPS, исправив ее на Шаге шесть, сайт будет работать. Но держать в потоке (я не уверен, как это в unix называется) вашего пользователя всегда запущенное приложения - это не вариант, поэтому давайте настроим сервис, который будет делать это постоянно на фоне.

Чтобы завершить выполнение приложения, нажмите сочетание клавиш Ctrl + C.

Я создал файл по пути /etc/systemd/system/AspNetServer.service AspNetServer - это имя нашего сервиса, позже мы будем его использовать, чтобы запускать, останавливать, перезапускать приложение, читать его журналы и т.д. Можете указать любое имя, главное оставьте .service в конце.

Кому проще создать файл на своей ОС и отправить его через FileZilla, делайте так, я же просто воспользуюсь командой sudo nano /etc/systemd/system/AspNetServer.service и вставлю следующий код:

[Unit]
Description=ASP .NET Web Application
[Service]
WorkingDirectory=/var/netcore
ExecStart=/usr/bin/dotnet /var/netcore/AnimeSite.dll
Restart=always
RestartSec=10
SyslogIdentifier=netcore-demo
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target

На 5 строчке вместо AnimeSite.dll укажите dll файл вашего приложения.

Теперь запустим сервер:

sudo systemctl enable AspNetServer
sudo systemctl start AspNetServer

Проверить статус сервиса можно командой:

sudo systemctl status AspNetServer

Чтобы выйти из режима просмотра статуса, нажмите Ctrl + C.

Если ваше приложение не использует базы данных, то все готово, введите IP от VDS в строку браузера и проверяйте. Если приложение выдает ошибку или вы просто хотите почитать вывод приложения, используйте команду:

journalctl -u AspNetServer

При помощи ввода цифр можете выбрать, на какую строчку перескочить. Я пишу 9999, чтобы перейти в конец и посмотреть, какое исключение появляется.

Шаг шестой: установка и настройка MS SQL

Установим необходимую библиотеку и репозитории MS SQL:

sudo apt install software-properties-common
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"

Затем установим загрузчик MS SQL:

sudo apt update
sudo apt install -y mssql-server

И при помощи этой команды перейдем к установке MS SQL:

sudo /opt/mssql/bin/mssql-conf setup

Нам предлагают выбрать, какую версию установить, я выберу Express под номером 3. Соглашаюсь с условиями пользования, устанавливаю свой супер сложный пароль и готово. Проверим, работает ли MS SQL командой systemctl status mssql-server --no-pager

Я изменяю строку подключения в appsettings.json, указав свой супер сложный пароль:

Server=localhost;Database=animesitedb;User Id=sa;Password=<MyStrongPassword>;

Важно! Как верно отметили в комментариях, подключаться к БД через sa не правильно. Лучше создайте пользователя и выделите ему минимальные необходимые права.

И перезапускаю сервис AspNetServer командой:

sudo systemctl restart AspNetServer

Готово! Сайт работает. Следующий шаг будет посвящен настройке SSL сертификата.

Шаг седьмой: настройка SSL сертификата

При покупке домена мне в подарок дали SSL сертификат. На почту пришли все данные. Чтобы установить его на сайт я создал 2 файла:

  • certificate.crt - сам сертификат

  • private.key - приватный ключ

Важно! Данные в эти файлы надо вставлять вместе с

-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----

В директории с ASP.NET Core приложением я создал директорию ssl-certificates и перенес все файлы сертификатов по пути /var/netcore/ssl-certificates/

Теперь надо изменить файл конфигурации Nginx, я открываю редактор nano командой sudo nano /etc/nginx/sites-available/default и изменяю код:

server {
    listen        80;
    server_name vashdomen.com;
    location / {
        proxy_pass         http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

server {
	listen 443 ssl;

	ssl_certificate /var/netcore/ssl-certificates/certificate.crt;
	ssl_certificate_key /var/netcore/ssl-certificates/private.key;

	server_name vashdomen.com;

	location / {
        proxy_pass         http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Если хотите, чтобы HTTP автоматический перенаправлялся на HTTPS, измените содержимое server, где listen 80 на это:

server {
    listen 80;
    server_name vashdomen.com;
    return 301 https://$host$request_uri;
}

Проверяем правильность конфига и перезапускаем Nginx:

sudo nginx -t
sudo nginx -s reload

Итог

На этом все, спасибо всем, кто прочел, надеюсь помог вам.

Большая часть информации взята отсюда - https://www.c-sharpcorner.com/article/how-to-deploy-net-core-application-on-linux/

Комментарии (14)


  1. web3_Venture
    29.12.2022 00:35

    Тут бы не плохо вторую статью сделать после слов "для просмотра аниме" как на этом всём живет просмотр (если имелось виду просмотр видео). Сколько вы тюнинговали всё это чтобы просмотр не тормозил и хотябы работал в +50 одновременных потоков


    1. MichaelSkirda Автор
      29.12.2022 00:43

      Я просто взял приложение, которое у меня было. Вопрос оптимизации изучу, если что, дополню статью.


  1. lair
    29.12.2022 01:29
    +10

    Я все понимаю, но зачем в конце 2022 года писать инструкцию про установку приложения на ASP.NET Core 3.1 (вы его в тексте ошибочно называете ASP.NET), если .NET Core 3.1 перестали поддерживать 13 декабря?

    Server=localhost;Database=animesitedb;User Id=sa;Password=<MyStrongPassword>;

    Не надо так делать, так делать не надо никогда. Приложение должно работать под выделенным пользователем с минимально возможными правами, а совсем не под sa, который может сделать с вашим сервером практически что угодно.


    1. MichaelSkirda Автор
      29.12.2022 11:18

      Я все понимаю, но зачем в конце 2022 года писать инструкцию про установку приложения на ASP.NET Core 3.1 (вы его в тексте ошибочно называете ASP.NET)

      Опечатки сейчас исправлю, спасибо. А про версию я отдельно выделил, что на шаге с установкой .NET-SDK устанавливайте ту версию, которая вам нужна.

      Приложение должно работать под выделенным пользователем с минимально возможными правами

      Я писал про развертывание и не стал сильно отвлекаться на настройку СУБД.


  1. Boilerplate
    29.12.2022 03:59

    Возможно тут, конечно, из-за аниме совсем другие требования для хостинга (в первую очередь из-за объема материалов). Но на том же рег ру, есть обычный asp net core хостинг, куда без проблем можно опубликовать свой сайт без дополнительных установок чего-либо. И плюс он поддерживает установку напрямую из студии. Причем ценник вроде с 200+р начинается.


    1. MichaelSkirda Автор
      29.12.2022 11:10

      Сейчас этого хостинга нету.


      1. Boilerplate
        29.12.2022 14:22

        О, и правда отменили все такие тарифы. Хорошо хоть не убрали то, что куплено и можно вроде проапгрейдить


  1. fedorovmg
    29.12.2022 07:04

    А поместить это в контейнер и получить плюшки в виде CI\CD?


    1. vabka
      30.12.2022 20:10

      CI/CD можно и без контейнеров получить. Поверх systemd вполне можно реализовать практически любой паттерн развёртывания.


  1. mayorovp
    29.12.2022 10:04
    +7

    Зря вы ставите Apache в качестве реверс-прокси для Kestrel. Это попросту глупо: Apache гораздо хуже держит медленные соединения, чем голый Kestrel из-за разницы в архитектуре. В принципе, никому не нужный сайт по просмотру аниме можно так на голом Kestrel и оставить, пусть это и не рекомендуется Microsoft. А если уж закрывать его, то не Апачем, а nginx.


    Второе замечание по тому же серверу: раз уж вы поставили полноценный веб-сервер перед сервером приложений — почему бы статические файлы не раздавать им же?


    Третье замечание: раз уж вы запускаете сервер используя systemd, а не докер — не помешает установить пакет Microsoft.Extensions.Hosting.Systemd и добавить в Program.cs строку .UseSystemd(), что позволит запускать сервис как Type=notify.


    А ещё, если вы вдруг захотите использовать активацию по сокету — Kestrel в неё умеет. Настраивается через .ConfigureKestrel(opt => opt.UseSystemd())


    Кстати, оба вызова UseSystemd проверяют окружение и ничего не делают если запуск был не через systemd.


  1. by_awkward
    29.12.2022 11:20
    +1

    ssh "134.0.118.152" -l root

    Не проще ли "ssh root@134.0.118.152"

    sudo apt-get update

    Достаточно sudo apt update. По этому обычно видно неопытного пользователя.

    Зачем брать Ubuntu 20.04 в конце 2022 при наличии 22.04

    /var/netcore/

    sudo nano /etc/apache2/conf-enabled/netcore.conf

    За что вы так не любите использовать стандартные пути? Ну можно же свой софт ставить в /opt, а не размазывать по файловой системе. Когда вы хотите создать vhost на apache2 в Ubuntu - есть тоже стандартное место - /etc/apache2/sites-available/. А потом можно включать и выключать сайт через a2ensite/a2dissite.


    1. MichaelSkirda Автор
      29.12.2022 11:34

      Не проще ли "ssh root@134.0.118.152"

      На вкус и цвет. (Edit: попробовал, удобнее.)

      Достаточно sudo apt update. По этому обычно видно неопытного пользователя.

      Пользовался Unix впервые. Команды сейчас исправлю, спасибо.

      За что вы так не любите использовать стандартные пути? 

      Я про них не знал. Изучу вопрос и отредактирую статью.

      А потом можно включать и выключать сайт через a2ensite/a2dissite.

      Это очень удобно, попробую сделать так.


  1. mayorovp
    29.12.2022 11:58
    +1

    Ещё замечание: вполне возможно, что приложению при запуске захочется сделать миграции БД или загрузить оттуда какие-нибудь данные, а потому оно не запустится если запускать его при неработающей СУБД.


    Это "лечится" через Wants=mssql-server и After=mssql-server в юнит-файле.


  1. Kisva
    29.12.2022 14:54

    В феврале 2022 не было возможности установить MS SQL на Ubuntu, которая развернута на сервере с процессором ARM. Не знаю, как эта ситуация в декабре, так как тогда же перешел на PostgreSQL, которая на Ubuntu на ARM ставилась.