Деплой C# приложения на VPS: продвинутый уровень

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

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

Начать курс

Продвинутый деплой C# (.NET) приложения на VPS: пошаговое руководство

Деплой C#-приложения на VPS — это не просто копирование файлов на сервер. Для production-среды требуется комплексная настройка: от конфигурации обратного прокси до автоматизации развертывания. В этой статье мы разберем продвинутые техники деплоя, которые используют опытные разработчики. Вы научитесь настраивать Nginx, подключать HTTPS, внедрять CI/CD и мониторинг.

1. Подготовка сервера и установка .NET Runtime

Перед началом деплоя убедитесь, что ваш VPS работает под управлением Ubuntu 22.04 или новее. Подключитесь по SSH и выполните базовую настройку.

# Обновление системы
sudo apt update && sudo apt upgrade -y

# Установка .NET SDK (для сборки) и Runtime (для запуска)
wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x dotnet-install.sh
sudo ./dotnet-install.sh --channel 8.0 --install-dir /usr/share/dotnet
sudo ln -s /usr/share/dotnet/dotnet /usr/local/bin/dotnet

# Проверка установки
dotnet --list-runtimes

Для production рекомендуется использовать только Runtime, чтобы уменьшить размер образа. SDK необходим только на машине сборки (например, в CI/CD).

2. Оптимизация приложения для production

Перед деплоем настройте приложение для работы в production-среде. Это включает в себя конфигурацию Kestrel, логгирование и обработку ошибок.

2.1. Настройка Program.cs

В файле Program.cs укажите явный порт и включите переадресацию на HTTPS (если используете reverse proxy).

var builder = WebApplication.CreateBuilder(args);

// Настройка Kestrel для работы через reverse proxy
builder.WebHost.ConfigureKestrel(options =>
{
    options.Listen(IPAddress.Any, 5000); // HTTP порт для Nginx
});

// Добавление сервисов
builder.Services.AddControllersWithViews();
builder.Services.AddHealthChecks();

var app = builder.Build();

// Middleware для production
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.MapHealthChecks("/health");
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

2.2. Сборка и публикация

Соберите приложение как self-contained, чтобы не зависеть от установленного Runtime на сервере.

dotnet publish -c Release -r linux-x64 --self-contained true -o ./publish

Эта команда создаст папку publish со всеми необходимыми файлами. Перенесите её на сервер с помощью scp или rsync.

3. Настройка Nginx как reverse proxy

Nginx будет принимать входящие запросы и перенаправлять их к вашему C#-приложению. Это повышает производительность и безопасность.

3.1. Установка и базовая конфигурация

sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx

Создайте конфигурационный файл для вашего приложения:

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

Вставьте следующий код:

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;
    }

    location /health {
        access_log off;
        return 200 "Healthy\n";
        add_header Content-Type text/plain;
    }
}

Активируйте сайт и перезапустите Nginx:

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

3.2. Настройка HTTPS с Let's Encrypt

Безопасность — критический аспект. Используйте Certbot для автоматического получения SSL-сертификата.

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

После успешного выполнения Certbot автоматически обновит конфигурацию Nginx, добавив блок server для HTTPS. Теперь все запросы будут шифроваться.

4. Настройка systemd для управления приложением

Чтобы приложение запускалось автоматически после перезагрузки сервера и корректно перезапускалось при сбоях, создайте systemd-сервис.

sudo nano /etc/systemd/system/myapp.service

Добавьте содержимое:

[Unit]
Description=My C# .NET Application
After=network.target

[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/local/bin/dotnet /var/www/myapp/MyApp.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-myapp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

Запустите сервис:

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp

Теперь ваше приложение будет работать как демон. Проверьте логи при необходимости:

sudo journalctl -u myapp -f

5. Внедрение CI/CD с GitHub Actions

Автоматизация деплоя — признак профессионального подхода. Настройте GitHub Actions для автоматической сборки и отправки на сервер.

Создайте файл .github/workflows/deploy.yml в корне репозитория:

name: Deploy to VPS

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v4
    
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: 8.0.x
    
    - name: Publish
      run: dotnet publish -c Release -r                

Блоги

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