Для развертывания на сервере мы применим GitOps подход.
Чтобы развернуть приложение, выполним следующие шаги:
Напишем приложение
Создадим конфигурационный файл
Выгрузим все файлы (можно через git, а можно через интерфейс) на сервер и запустим сборку.
Рассмотрим процесс подробнее.
Сначала напишем web-приложение, которое возвращает «Hello, World!», и развернем его в Amvera Cloud.
Почему Amvera:
Удобная доставка файлов и обновлений через git push. За 3 команды не выходя из IDE можно развернуть обновление в облаке. Это сэкономит ваше время в сравнении с настройкой VPS в несколько раз.
Встроенная поддержка C#.
После регистрации и подтверждения номера телефона начисляется бесплатный баланс в размере 111 рублей, которого хватит на тесты!
Создание проекта
Создаем в директории проекта файл 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
Для тех, кто дочитал до конца, бонусом прикладываю видеопример.
Проверка работоспособности
Переходим в настройки проекта и активируем доменное имя.
Теперь можно перейти по нему и откроется наш сайт с записями из notes.json.
Если что-то не работает, рекомендуем ознакомиться с логами Сборки и Приложения.
Поздравляем, вы успешно развернули C# Mono приложение на сервере!