Деплой C# приложения на VPS: пошаговое руководство от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему 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

Установка SSL-сертификата с Let's Encrypt

Блоги

Рекомендаций по книгам