Как сохранить данные в S3 при работе с Evolution Container Apps
Допустим, вы разработчик. Вы пишете код, получаете от этого удовольствие и намерены приложить максимум усилий для создания и развития своего проекта. А вот разбираться с тем, где и как он будет запущен, вам не хочется. Что делать?

Мы в Cloud.ru создали среду, в которой можно развернуть приложение, не тратя время на создание виртуальных машин (ВМ), установку Docker и настройку кластеров Kubernetes. Один из ключевых элементов этой среды — Evolution Container Apps, сервис для запуска контейнерных приложений в облаке. В статье я расскажу, в чем его преимущества и как с его помощью за пару кликов запустить приложение из контейнера, не потеряв при этом данные.
Evolution Container Apps: что это и в чем его преимущества
Evolution Container Apps — это сервис для запуска приложений на базе Docker-образов в облаке. В числе его аналогов значатся продукты от таких гигантов зарубежного облачного рынка, как Google, Amazon и Azure. Вслед за этой большой тройкой мы предлагаем российскому бизнесу собственный сервис для быстрого запуска проектов и их вывода на рынок.
Чтобы просто объяснить, зачем нужен Evolution Container Apps, представьте, что вы написали проект и хотите его запустить. Для этого нужно будет сделать примерно следующее:
сначала собрать Docker-образ и выгрузить его в сервис Evolution Artifact Registry — облачный реестр для хранения OCI-артефактов;
затем перейти к работе с образом прямо в интерфейсе Evolution Artifact Registry или в Evolution Container Apps, выбрать порт, отметить, что сервис должен быть доступен для всех, и нажать кнопку Создать.
После этого проект будет развернут и станет доступен для пользователей.


Использование сервиса Evolution Container Apps дает разработчику ряд преимуществ:
Высокая скорость развертывания приложений. Сервис позволяет отказаться от настройки виртуальных машин, которая часто бывает долгой и энергоемкой.
Низкий порог входа. При использовании Evolution Container Apps можно забыть не только про настройку ВМ, но и про отладку автоматического восстановления работоспособности приложения при сбоях, а также про настройку Nginx и сертификатов.
Гибкая модель оплаты. Evolution Container Apps поддерживает динамическое масштабирование, то есть создает и удаляет экземпляры контейнера автоматически в зависимости от нагрузки.
Отмечу, что опробовать Evolution Container Apps в деле можно бесплатно, используя Evolution free tier — объем облачных ресурсов, за который не нужно платить.
При использовании Evolution Container Apps с free tier каждый месяц в личный кабинет пользователя начисляется объем ресурсов для работы контейнера: 480 ГБ RAM и 120 vCPU. Этого достаточно для тестирования и запуска небольших приложений.

Здесь важно сказать, что при спаде трафика до нуля гибкая модель оплаты подразумевает деактивацию экземпляров контейнеров и, как следствие, потерю данных. И тут на помощь приходит Evolution Object Storage — сервис на основе S3, который позволяет создавать бакеты и хранить данные вне зависимости от потока трафика.
Запуск приложений в Evolution Container Apps и сохранение данных в Evolution Object Storage
Чтобы понять, как Evolution Object Storage помогает сохранять данные проекта, размещенного с помощью Evolution Container Apps, давайте создадим django-приложение для раздачи фотографий.
Допустим, на старте работы есть:
nginx-сервис для раздачи фотографий, который умеет раздавать файлы из папки с медиа;
объектное хранилище S3 на платформе Cloud.ru Evolution, которое мы можем подключить к папке с медиа;
сервис управления файлами для добавления данных в папку с медиа и хранилище.

Для эффективной настройки работы приложения нужно сделать следующее:
1. C помощью Evolution Container Apps создать Container App и первую ревизию — неизменяемую версию контейнера.
2. Связать созданный контейнер с сервисом Evolution Object Storage.
Туториал 1: как создать Container App и первую ревизию
Перед началом работы нужно создать реестр в Evolution Artifact Registry, пройти аутентификацию и загрузить Docker-образ в репозиторий. Далее перейдите к развертыванию приложения в контейнере:
1. В личном кабинете Cloud.ru выберите сервис Container Apps на платформе Cloud.ru Evolution и нажмите Создать.
2. Введите название приложения.
3. Активируйте опцию Привилегированный режим.
Привилегированный режим дает контейнеру root-права при его выполнении. Использование этого режима опционально, но рекомендуется — некоторые Docker-образы со сторонними приложениями поддерживаются только в нем.
4. На вкладке Общие параметры впишите все необходимое: выбрать конфигурацию (количество vCPU и RAM), добавить название контейнера, указать URI Docker-образа, выбрать порт, а также команду точки входа и аргументы.
5. На вкладке Переменные укажите переменные окружения.
6. На вкладке Health-пробы добавьте liveness-пробу (опционально).
7. На вкладке Тома добавьте том — бакет в сервисе Object Storage для хранения данных приложения.
Именно тома помогают вашим бакетам подключиться к Evolution Container Apps. В них вы монтируете нужные папки, которые автоматически добавляются в контейнеры сервиса Evolution Container Apps, синхронизируются и отправляются в объектное хранилище.
О том, как создавать бакеты в Object Storage, я расскажу подробнее чуть ниже.

8. После заполнения основных параметров нажмите Следующий шаг и укажите параметры масштабирования контейнера. Минимальное количество экземпляров — 0.
9. Затем снова нажмите Следующий шаг и активируйте дополнительные опции: публичный адрес, тип масштабирования, логирование запросов, request- и idle-таймаут.
10. В конце нажмите Создать. В течение нескольких секунд после этого контейнер опубликуется и будет готов для использования.
Туториал 2: как создать бакет в Object Storage
Наш пример — приложение для раздачи фотографий, а значит без бакетов для хранения медиаданных и базы данных проекта не обойтись.
Поэтому первым делом нужно создать бакет для базы данных. Для этого сделайте следующее:
1. В личном кабинете Cloud.ru выберите сервис Object Storage на платформе Cloud.ru Evolution и нажмите Создать бакет.
2. Введите общие параметры бакета.
3. Нажмите Создать.
После этого таким же образом создайте второй бакет для хранения медиаданных.

Туториал 3: как связать бакеты Evolution Object Storage с приложение в контейнере Evolution Container Apps
Чтобы произвести ту самую магию, которая позволит не терять данные приложения даже при нулевом трафике, нам нужно связать два созданных бакета с ревизией в Evolution Container Apps. Для этого:
1. Перейдите в личный кабинет Cloud.ru, среди сервисов платформы Cloud.ru Evolution выберите Container Apps и перейдите к ранее созданной ревизии.
При этом прямо над ревизией можно увидеть публичный URL, по которому доступно приложение, а в блоке справа — общие параметры ревизии, переменные и секреты, health-пробы и тома.
2. Перейдите на вкладку Тома и щелкните Добавить том.
3. Выберите тип тома — Постоянный.
4. Затем прикрепите к нему бакет в Object Storage с базой данных.
5. Нажмите Добавить и впишите путь к файлу в нашем сервисе для управления фотографиями в графу Путь.

Затем на вкладке Переменные важно указать, в какой папке находится база данных и медиаданные.

6. В конце щелкните Создать, чтобы создать ревизию с томами, содержащими бакеты с данными.
Теперь при добавлении данных в сервис для раздачи фотографий они не будут теряться даже в том случае, если трафик будет падать до нуля.
Туториал 4: запуск nginx-сервиса для раздачи файлов приложения
Итак, у нас есть приложение, развернутое в облаке с помощью Evolution Container Apps. Также к нему подключены бакеты сервиса Evolution Object Storage — это гарантия того, что данные не потеряются. Что же дальше? Правильно. Пора начать раздавать файлы с помощью приложения.
Для этого сделайте так:
В исходном файле приложения задайте конфигурацию для раздачи файлов в сервисе добавления фотографий.
Вновь создайте реестр в Evolution Artifact Registry, пройдите аутентификацию и загрузите Docker-образ в репозиторий, а затем создайте контейнер в Evolution Container Apps, выбрав привилегированный режим для предоставления контейнеру root-прав.
Снова впишите все параметры и добавьте том с медиаданными в бакете Object Storage.
Щелкните Создать.
В конце работы важно проверить, что приложение действительно создается. Для проверки нужно перейти на вкладку Логи — там лежат пользовательские и системные логи:
в пользовательских логах содержатся данные приложения;
в системных – логи, которые отрабатываются в инфраструктуре облака.
Просмотрев логи, можно убедиться, что запущенное nginx-приложение действительно работает, а в объектном хранилище хранятся загруженные фотографии.
Если же при просмотре логов у вас возникнут вопросы или сомнения в том, что все настроено корректно, обратитесь к нам за помощью. Для этого воспользуйтесь нашим AI-помощником, кликнув по виджету внизу личного кабинета, или напишите на почту support@cloud.ru.
Итоги
Теперь вы знаете, как запускать приложение в Evolution Container Apps, а еще умеете связывать контейнеры в этом сервисе с бакетами объектного хранилища S3. Это гарантия того, что все его данные надежно хранятся в Evolution Object Storage, даже когда ваше приложение не раздает файлы.