Для развертывания на сервере мы применим 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 приложение на сервере!
