Введение: почему VPS — идеальное место для вашего C# приложения
Разработка на C# в экосистеме .NET даёт мощные инструменты для создания веб-приложений, API и микросервисов. Однако написать код — лишь половина дела. Чтобы ваше приложение стало доступно пользователям, его необходимо развернуть на сервере. Виртуальный частный сервер (VPS) предоставляет полный контроль над окружением, что критически важно для production-среды. В этом руководстве мы пройдём путь от нуля до полностью работающего C# приложения на VPS под управлением Ubuntu. Вы узнаете, как установить .NET Runtime, настроить обратный прокси-сервер Nginx, запустить приложение как службу systemd и обеспечить его автоматический перезапуск.
Подготовка сервера и установка необходимого ПО
1. Подключение к VPS и базовые настройки
После получения доступа к VPS (IP-адрес, логин и пароль или SSH-ключ) подключитесь через терминал:
ssh root@ваш_IP_сервера
Обновите пакетную базу и установите curl (он понадобится для загрузки .NET):
apt update && apt upgrade -y
apt install curl -y
2. Установка .NET SDK/Runtime
Microsoft рекомендует устанавливать .NET через официальный репозиторий. Добавим его и установим SDK (для сборки) или Runtime (только для запуска). Для production-сервера обычно достаточно Runtime, но для удобства деплоя установим SDK:
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 -y dotnet-sdk-8.0
Проверьте установку:
dotnet --version
3. Установка Nginx и Git
Nginx будет выступать в роли обратного прокси, перенаправляя запросы с порта 80 на ваше приложение. Git понадобится для клонирования репозитория:
apt install -y nginx git
systemctl enable nginx
systemctl start nginx
Подготовка и публикация C# приложения
1. Создание или клонирование проекта
Для примера создадим простое ASP.NET Core Web API приложение прямо на сервере (в реальном проекте вы склонируете репозиторий):
mkdir /var/www/myapp
cd /var/www/myapp
dotnet new webapi --name MyApp
cd MyApp
2. Публикация приложения (self-contained)
Чтобы приложение работало без установленного SDK на сервере, опубликуем его в self-contained режиме:
dotnet publish -c Release -r linux-x64 --self-contained true -o /var/www/myapp/publish
Флаг --self-contained true включает все зависимости .NET в папку publish. Альтернатива — --self-contained false (требует установленного Runtime).
3. Тестовый запуск
Проверьте, что приложение стартует (по умолчанию на порту 5000):
cd /var/www/myapp/publish
./MyApp --urls "http://0.0.0.0:5000"
Откройте в браузере http://ваш_IP:5000 — вы должны увидеть ответ API. Остановите процесс (Ctrl+C).
Настройка Nginx как обратного прокси
1. Конфигурация сайта
Создадим конфигурационный файл для Nginx:
nano /etc/nginx/sites-available/myapp
Вставьте следующий код (замените your_domain_or_ip на ваш домен или IP):
server {
listen 80;
server_name your_domain_or_ip;
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;
}
}
2. Активация конфигурации
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t # Проверка синтаксиса
systemctl reload nginx
Теперь все запросы на порт 80 будут перенаправляться на ваше приложение, работающее на порту 5000.
Запуск приложения как службы systemd
Чтобы приложение автоматически запускалось при старте сервера и перезапускалось в случае сбоя, создадим systemd service.
1. Создание файла службы
nano /etc/systemd/system/myapp.service
Содержимое:
[Unit]
Description=My ASP.NET Core Application
After=network.target
[Service]
WorkingDirectory=/var/www/myapp/publish
ExecStart=/var/www/myapp/publish/MyApp --urls "http://0.0.0.0:5000"
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=myapp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
2. Запуск и включение автозагрузки
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp
systemctl status myapp
Убедитесь, что статус active (running).
3. Настройка прав доступа
Поскольку служба работает от пользователя www-data, дадим ему права на папку приложения:
chown -R www-data:www-data /var/www/myapp
Заключение: что дальше?
Вы успешно развернули C# приложение на VPS. Теперь ваше приложение доступно по IP-адресу сервера (или домену, если вы настроили DNS). Для production-среды обязательно добавьте HTTPS с помощью Certbot и Let's Encrypt, настройте мониторинг (например, Prometheus + Grafana) и регулярное резервное копирование базы данных, если она используется. Помните, что деплой — это не финальная точка, а начало эксплуатации. Регулярно обновляйте .NET Runtime и пакеты безопасности. У