Вы разработчик, проект растет, код пишется легко. И вот уже готово приложение, и вы хотите поскорее показать его заказчику, коллегам или пользователям. Но вместо этого приходится разбираться с Kubernetes, настройках кластеров и балансировщиков. Знакомо?
Я Никита Корольков из Cloud.ru, и сегодня покажу, как без лишних сложностей и запуска виртуальных машин развернуть проект в облаке с помощью сервиса Evolution Container Apps и при этом не потерять данные, даже если вы не DevOps.
Почему Evolution Container Apps и как это работает
Evolution Container Apps — это сервис для быстрого запуска приложений на базе Docker-образов в облаке. Чтобы ваш готовый проект стал доступен для коллег, заказчиков или пользователей, достаточно нескольких шагов:
собрать Docker-образ и выгрузить его в сервис Evolution Artifact Registry — облачный реестр для хранения OCI-артефактов;
затем перейти к работе с образом прямо в интерфейсе Evolution Artifact Registry или в Evolution Container Apps, выбрать порт, отметить, что сервис должен быть доступен для всех, и нажать кнопку Создать.
Кстати, можно бесплатно попробовать сервис с помощью Evolution free tier — объема облачных ресурсов, за который не нужно платить.

Основные преимущества такого подхода: низкий порог входа — не нужно думать про настройку ВМ, отладку автоматического восстановления работоспособности приложения при сбоях, настройку Nginx и сертификатов; гибкая модель оплаты — сервис поддерживает динамическое масштабирование.
При этом при спаде трафика до нуля такая модель всегда подразумевает деактивацию экземпляров контейнеров и, как следствие, потерю данных. Но если использовать сервис на основе S3 — Evolution Object Storage, создавать бакеты и хранить данные можно независимо от потока трафика.
Запуск приложений в Evolution Container Apps и сохранение данных в Evolution Object Storage
Как всё это работает на практике, будем разбирать на примере — создадим django-приложение для раздачи фотографий.
На старте работы у нас есть:
nginx-сервис для раздачи фотографий, который умеет раздавать файлы из папки с медиа;
объектное хранилище S3 на платформе Cloud.ru Evolution, которое можно подключить к папке с медиа;
сервис управления файлами для добавления данных в папку с медиа и хранилище.
Для эффективной настройки работы приложения нужно сделать следующее:
C помощью Evolution Container Apps создать Container App и первую ревизию — неизменяемую версию контейнера.
Связать созданный контейнер с сервисом 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, синхронизируются и попадут в объектное хранилище.

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

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

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

5. В конце щелкнем Создать, чтобы создать ревизию с томами, содержащими бакеты с данными.
Теперь при добавлении данных в сервис для раздачи фотографий они не будут теряться даже в том случае, если трафик будет падать до нуля.
Шаг 4. Запускаем nginx-сервис для раздачи файлов приложения
Итак, у нас есть приложение, развернутое в облаке с помощью Evolution Container Apps. Также к нему подключены бакеты сервиса Evolution Object Storage — это гарантия того, что данные не потеряются. Что дальше? Можем раздавать файлы с помощью приложения.
Для этого:
В исходном файле приложения зададим конфигурацию для раздачи файлов в сервисе добавления фотографий.
Вновь создадим реестр в Evolution Artifact Registry, пройдем аутентификацию и загрузим Docker-образ в репозиторий, а затем создадим контейнер в Evolution Container Apps, выбрав привилегированный режим для предоставления контейнеру root-прав.
Снова впишем все параметры и добавим том с медиаданными в бакете Object Storage.
Щелкнем Создать.
В конце работы важно проверить, что приложение действительно создается. Для проверки нужно перейти на вкладку Логи — там лежат пользовательские и системные логи:
в пользовательских логах содержатся данные приложения;
в системных – логи, которые отрабатываются в инфраструктуре облака.
Просмотрев логи, можно убедиться, что запущенное nginx-приложение действительно работает, а в объектном хранилище хранятся загруженные фотографии.
Вот таким незамысловатым способом теперь все данные приложения надежно хранятся в Evolution Object Storage, даже когда оно не раздает файлы.
Ну и небольшой бонус для тех, кто дочитал: при использовании Evolution Container Apps с free tier, каждый месяц в вашем личном кабинете будет начисляться объем ресурсов для работы контейнера — 480 ГБ RAM и 120 vCPU, которого будет достаточно для тестирования и запуска небольших приложений.
Roman2dot0
Серьёзно? sqlite на фс, которая на с3? Привилегированный контейнер для веб приложения? Это статья о том, как не надо делать? Плохо, даже для джуна.
AlexGluck
Зачем ты подсказываешь? Я хочу зарплату лям, а с такими деятелями это будет легко.