Продвинутый деплой 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