Введение: Почему VPS — идеальное решение для C# приложений?
Разработка на C# и платформе .NET давно перестала быть прерогативой исключительно Windows-серверов. С выходом .NET Core (а теперь и .NET 5/6/7/8) разработчики получили возможность запускать свои приложения на Linux, что открыло доступ к недорогим и производительным VPS-серверам. Деплой C# приложения на VPS — это не только экономия бюджета, но и полный контроль над инфраструктурой: от выбора ОС до настройки безопасности.
В этом руководстве мы разберём полный цикл развёртывания ASP.NET Core приложения на удалённом сервере. Вы узнаете, как подготовить сервер, настроить обратный прокси-сервер Nginx, запустить приложение через Kestrel и защитить его с помощью SSL-сертификата. Все шаги сопровождаются примерами кода и консольными командами.
1. Подготовка сервера и установка .NET Runtime
Выбор ОС и подключение по SSH
Для деплоя C# приложения на VPS рекомендуется использовать дистрибутив Ubuntu 22.04 LTS или Debian 11. После аренды сервера подключитесь к нему через SSH:
ssh root@ваш_IP_сервера
Обновите пакетный менеджер и установите необходимые утилиты:
apt update && apt upgrade -y
apt install curl wget git -y
Установка .NET SDK или Runtime
Для запуска готового приложения достаточно установить ASP.NET Core Runtime. Если вы планируете компилировать код прямо на сервере — установите SDK. Добавим репозиторий Microsoft и установим .NET 8:
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
apt update
apt install aspnetcore-runtime-8.0 -y
Проверьте установку:
dotnet --list-runtimes
Вывод должен содержать строку с версией ASP.NET Core 8.0.x.
2. Подготовка и публикация приложения
Настройка проекта для продакшена
В вашем проекте ASP.NET Core откройте файл Program.cs и убедитесь, что приложение слушает правильный URL. Для работы через Kestrel зададим порт 5000:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls("http://0.0.0.0:5000");
var app = builder.Build();
app.MapGet("/", () => "Hello from VPS!");
app.Run();
Также добавьте в appsettings.json секцию для логов и строки подключения к БД, если они используются.
Публикация приложения (Self-contained или Framework-dependent)
Выберите способ публикации. Self-contained включает все зависимости, что удобно, если на сервере нет .NET Runtime. Framework-dependent требует установленного Runtime. Выполните команду в папке проекта:
dotnet publish -c Release -o ./publish
После завершения в папке publish появятся все необходимые файлы. Заархивируйте их:
tar -czf app.tar.gz ./publish
Загрузка на сервер
Используйте SCP или SFTP для передачи архива. Пример через SCP (выполняется с локальной машины):
scp app.tar.gz root@ваш_IP:/var/www/myapp/
На сервере распакуйте архив:
mkdir -p /var/www/myapp
tar -xzf /var/www/myapp/app.tar.gz -C /var/www/myapp/
3. Настройка Kestrel и создание systemd-службы
Запуск приложения через Kestrel
Kestrel — это встроенный веб-сервер ASP.NET Core. Для тестового запуска выполните:
cd /var/www/myapp/publish
dotnet YourAppName.dll
Приложение должно запуститься на порту 5000. Проверьте через curl http://localhost:5000. Если всё работает — остановите процесс (Ctrl+C).
Создание systemd unit-файла
Чтобы приложение автоматически запускалось при старте системы и перезапускалось при сбоях, создадим службу systemd. Создайте файл:
nano /etc/systemd/system/myapp.service
Вставьте следующий конфиг (замените пути на свои):
[Unit]
Description=My ASP.NET Core App
After=network.target
[Service]
WorkingDirectory=/var/www/myapp/publish
ExecStart=/usr/bin/dotnet /var/www/myapp/publish/YourAppName.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=myapp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Включите и запустите службу:
systemctl enable myapp.service
systemctl start myapp.service
systemctl status myapp.service
Убедитесь, что статус — active (running).
4. Настройка Nginx как обратного прокси и SSL
Установка и базовая настройка Nginx
Установите Nginx:
apt install nginx -y
Создайте конфигурационный файл для вашего домена:
nano /etc/nginx/sites-available/myapp
Добавьте конфигурацию проксирования на Kestrel:
server {
listen 80;
server_name your-domain.com www.your-domain.com;
location / {
proxy_pass http://localhost: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;
}
}
Активируйте сайт и проверьте конфигурацию:
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx