В этой статье я по шагам покажу как:
Развернуть ASP.NET Core приложение
Установить и настроить MS SQL
Установить SSL сертификат
Все это на VPS с чистой системой Ubuntu 20.04.
MS SQL требует минимум 2GB свободной оперативной памяти для установки и запуска.
Показывать я буду на примере готового ASP.NET Core сайта для просмотра аниме (японская анимация). Оно работает и запускается без ошибок на localhost. Приложение использует 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)
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
, который может сделать с вашим сервером практически что угодно.MichaelSkirda Автор
29.12.2022 11:18Я все понимаю, но зачем в конце 2022 года писать инструкцию про установку приложения на ASP.NET Core 3.1 (вы его в тексте ошибочно называете ASP.NET)
Опечатки сейчас исправлю, спасибо. А про версию я отдельно выделил, что на шаге с установкой .NET-SDK устанавливайте ту версию, которая вам нужна.
Приложение должно работать под выделенным пользователем с минимально возможными правами
Я писал про развертывание и не стал сильно отвлекаться на настройку СУБД.
Boilerplate
29.12.2022 03:59Возможно тут, конечно, из-за аниме совсем другие требования для хостинга (в первую очередь из-за объема материалов). Но на том же рег ру, есть обычный asp net core хостинг, куда без проблем можно опубликовать свой сайт без дополнительных установок чего-либо. И плюс он поддерживает установку напрямую из студии. Причем ценник вроде с 200+р начинается.
MichaelSkirda Автор
29.12.2022 11:10Сейчас этого хостинга нету.
Boilerplate
29.12.2022 14:22О, и правда отменили все такие тарифы. Хорошо хоть не убрали то, что куплено и можно вроде проапгрейдить
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.
by_awkward
29.12.2022 11:20+1ssh "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.
MichaelSkirda Автор
29.12.2022 11:34Не проще ли "ssh root@
134.0.118.152"
На вкус и цвет. (Edit: попробовал, удобнее.)
Достаточно sudo apt update. По этому обычно видно неопытного пользователя.
Пользовался Unix впервые. Команды сейчас исправлю, спасибо.
За что вы так не любите использовать стандартные пути?
Я про них не знал. Изучу вопрос и отредактирую статью.
А потом можно включать и выключать сайт через a2ensite/a2dissite.
Это очень удобно, попробую сделать так.
mayorovp
29.12.2022 11:58+1Ещё замечание: вполне возможно, что приложению при запуске захочется сделать миграции БД или загрузить оттуда какие-нибудь данные, а потому оно не запустится если запускать его при неработающей СУБД.
Это "лечится" через
Wants=mssql-server
иAfter=mssql-server
в юнит-файле.
Kisva
29.12.2022 14:54В феврале 2022 не было возможности установить MS SQL на Ubuntu, которая развернута на сервере с процессором ARM. Не знаю, как эта ситуация в декабре, так как тогда же перешел на PostgreSQL, которая на Ubuntu на ARM ставилась.
web3_Venture
Тут бы не плохо вторую статью сделать после слов "для просмотра аниме" как на этом всём живет просмотр (если имелось виду просмотр видео). Сколько вы тюнинговали всё это чтобы просмотр не тормозил и хотябы работал в +50 одновременных потоков
MichaelSkirda Автор
Я просто взял приложение, которое у меня было. Вопрос оптимизации изучу, если что, дополню статью.