Pull to refresh
89.6
Amvera
Amvera — облако для хостинга IT-приложений

Пример деплоя Web-приложения на C# Mono на хостинг

Level of difficultyMedium
Reading time3 min
Views2K

Для развертывания на сервере мы применим GitOps подход. 

Чтобы развернуть приложение, выполним следующие шаги:

  1. Напишем приложение

  2. Создадим конфигурационный файл

  3. Выгрузим все файлы (можно через git, а можно через интерфейс) на сервер и запустим сборку. 

Рассмотрим процесс подробнее.

Сначала напишем web-приложение, которое возвращает «Hello, World!», и развернем его в Amvera Cloud.

Создание проекта

Создаем в директории проекта файл Program.cs (название может быть любым)

**Program.cs:**
```csharp
using System;
using System.Net;
using System.Text;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // Запускаем сервер, используя порт 8080
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://*:8080/");
        listener.Start();
        while (true)
        {
            HttpListenerContext context = listener.GetContext();
            string responseString = "Hello, world!";
            byte[] buffer = Encoding.UTF8.GetBytes(responseString);
            context.Response.ContentLength64 = buffer.Length;
            context.Response.OutputStream.Write(buffer, 0, buffer.Length);
            context.Response.Close();
        }
    }
}

Создадим конфигурационный файл

Добавляем в директорию проекта конфигурационный файл amvera.yml. Написать YAML файл можно самостоятельно. Также можно воспользоваться генератором YAML, перейдя по ссылке либо заполнив соответствующий раздел в личном кабинете.

Пример файла amvera.yml:

yaml
meta:
  environment: csharp
  toolchain:
    name: mono
    version: latest
build:
  image: mono:latest
  mainFile: Program.cs
run:
  image: mono:latest
  persistenceMount: /data
  containerPort: 8080

Важно: Проверьте, что вы указали правильный containerPort (Amvera по умолчанию слушает порт 80) и mainFile.

Для локального тестирования :

bash
mcs Program.cs
mono Program.exe

Приложение готово, теперь его можно выкладывать в Amvera!

Использование внешних библиотек

Если в вашем проекте используются внешние библиотеки, процесс немного сложнее. Сначала вам нужно скачать соответствующие скомпилированные бинарные файлы (их расширение обычно .dll) и поместить их в директорию вашего проекта. При компиляции эти файлы указываются с помощью флага -r. Для добавления этого флага потребуется написать Dockerfile. В качестве примера рассмотрим использование библиотеки Newtonsoft.Json для работы с .json файлами. Обычно бинарный файл можно найти в релизах проекта, для данной библиотеки вы можете найти его здесь.

Dockerfile

Если вы используете Dockerfile, то конфигурационный файл amvera.yml в большинстве случаев можно не добавлять.

Шаги

1. Создаем Dockerfile в директории с проектом.

2. В Dockerfile указываем базовый образ для этапа сборки:

dockerfile
FROM mono:latest

3. Устанавливаем рабочий каталог внутри контейнера:

dockerfile
WORKDIR /app

4. Копируем все файлы проекта в контейнер:

dockerfile
COPY . .

5. Компилируем программу с использованием mcs (не забываем указать все зависимости):

dockerfile
RUN mcs Program.cs -r:Newtonsoft.Json.dll 

6. Указываем команду для запуска:

dockerfile
CMD ["mono", "Program.exe"]

Получившийся Dockerfile

FROM mono:latest

WORKDIR /app

COPY . .

RUN mcs Program.cs -r:Newtonsoft.Json.dll

CMD ["mono", "Program.exe"]

Пример файла amvera.yml вместе с Dockerfile

yaml
meta:
  environment: docker
  toolchain:
    name: docker
    version: latest
build:
  dockerfile: Dockerfile
  skip: false
run:
  persistenceMount: /data
  containerPort: 8080

Теперь обновим файл Program.cs так, чтобы он возвращал не «Hello, World!», а содержание notes.json:

Итого, директория проекта теперь выглядит следующим образом:

code/

├── Dockerfile

├── Newtonsoft.Json.dll

├── Program.cs

├── amvera.yml

└── notes.json

Для локального тестирования:

bash
sudo docker build -t my-csharp-app .
docker run -p 8080:8080 my-csharp-app

Важно: если файл notes.json изменяется в процессе работы приложения, то его нужно хранить в постоянном хранилище /data. Это позволит избежать потери данных при пересборке. Папка data в коде и постоянное хранилище /data - разные директории.

Если вы используете базу данных, то логика такая же. Скачиваете .dll файлы и указываете их в Dockerfile.

Обновление приложения

Если вы внесли изменения в код проекта, просто выполните следующие команды

git add .
git commit -m "Описание сделанных изменений"
git push amvera master

Для тех, кто дочитал до конца, бонусом прикладываю видеопример.

Проверка работоспособности

  1. Переходим в настройки проекта и активируем доменное имя.

  2. Теперь можно перейти по нему и откроется наш сайт с записями из notes.json.

Если что-то не работает, рекомендуем ознакомиться с логами Сборки и Приложения.

Поздравляем, вы успешно развернули C# Mono приложение на сервере!

Tags:
Hubs:
Total votes 8: ↑5 and ↓3+4
Comments6

Articles

Information

Website
amvera.ru
Registered
Employees
11–30 employees
Location
Россия
Representative
Кирилл Косолапов