Вы разработчик, проект растет, код пишется легко. И вот уже готово приложение, и вы хотите поскорее показать его заказчику, коллегам или пользователям. Но вместо этого приходится разбираться с 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 — объема облачных ресурсов, за который не нужно платить. 

Схема работы с Docker-образом в облаке Cloud.ru Evolution
Схема работы с Docker-образом в облаке Cloud.ru Evolution

Основные преимущества такого подхода: низкий порог входа — не нужно думать про настройку ВМ, отладку автоматического восстановления работоспособности приложения при сбоях, настройку Nginx и сертификатов; гибкая модель оплаты — сервис поддерживает динамическое масштабирование. 

При этом при спаде трафика до нуля такая модель всегда подразумевает деактивацию экземпляров контейнеров и, как следствие, потерю данных. Но если использовать сервис на основе S3 — Evolution Object Storage, создавать бакеты и хранить данные можно независимо от потока трафика. 

Запуск приложений в Evolution Container Apps и сохранение данных в Evolution Object Storage

Как всё это работает на практике, будем разбирать на примере — создадим 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, синхронизируются и попадут в объектное хранилище.

Развертывание контейнера в Evolution Container Apps
Развертывание контейнера в Evolution Container Apps

8. После заполнения основных параметров нажмем Следующий шаг и укажем параметры масштабирования контейнера. Минимальное количество экземпляров — 0. 

9. Затем снова нажмем Следующий шаг и активируем дополнительные опции: публичный адрес, тип масштабирования, логирование запросов, request- и idle-таймаут. 

10. В конце нажмем Создать. В течение нескольких секунд после этого контейнер опубликуется и будет готов для использования. 

Шаг 2. Создаем бакет в Object Storage

В нашем случае не обойтись без бакетов для хранения медиаданных и базы данных проекта. 

Сначала создадим бакет для базы данных. Для этого:

  1.  В личном кабинете Cloud.ru выберем сервис Object Storage на платформе Cloud.ru Evolution и нажмем Создать бакет.

  2. Введем общие параметры бакета.

  3. Нажмем Создать

Затем по тем же шагам создадим второй бакет — для хранения медиаданных. 

Создание бакета в Evolution Object Storage
Создание бакета в Evolution Object Storage

Шаг 3. Связываем бакеты Evolution Object Storage с приложение в контейнере Evolution Container Apps

Теперь, чтобы не терять данные приложения даже при нулевом трафике, свяжем два созданных бакета с ревизией в Evolution Container Apps. Для этого: 

  1. Перейдем в личный кабинет Cloud.ru, среди сервисов платформы Cloud.ru Evolution выберем Container Apps и перейдем к ранее созданной ревизии. 

При этом прямо над ревизией можно увидеть публичный URL, по которому доступно приложение, а в блоке справа — общие параметры ревизии, переменные и секреты, health-пробы и тома. 

1. Перейдем на вкладку Тома и щелкнем Добавить том.

2. Выберем тип тома — Постоянный.

3. Затем прикрепим к нему бакет в Object Storage с базой данных.

4. Нажмем Добавить и для управления фотографиями в графу Путь впишем путь к файлу в нашем сервисе. 

Процесс добавления тома с бакетом Evolution Object Storage в контейнер Evolution Container Apps
Процесс добавления тома с бакетом Evolution Object Storage в контейнер Evolution Container Apps

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

Указание пути к данным на вкладке Переменные в интерфейсе сервиса Evolution Container Apps
Указание пути к данным на вкладке Переменные в интерфейсе сервиса Evolution Container Apps

5. В конце щелкнем Создать, чтобы создать ревизию с томами, содержащими бакеты с данными. 

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

Шаг 4. Запускаем nginx-сервис для раздачи файлов приложения 

Итак, у нас есть приложение, развернутое в облаке с помощью Evolution Container Apps. Также к нему подключены бакеты сервиса Evolution Object Storage — это гарантия того, что данные не потеряются. Что дальше? Можем раздавать файлы с помощью приложения. 

Для этого: 

  1. В исходном файле приложения зададим конфигурацию для раздачи файлов в сервисе добавления фотографий.

  2. Вновь создадим реестр в Evolution Artifact Registry, пройдем аутентификацию и загрузим Docker-образ в репозиторий, а затем создадим контейнер в Evolution Container Apps, выбрав привилегированный режим для предоставления контейнеру root-прав. 

  3. Снова впишем все параметры и добавим том с медиаданными в бакете Object Storage. 

  4. Щелкнем Создать

В конце работы важно проверить, что приложение действительно создается. Для проверки нужно перейти на вкладку Логи — там лежат пользовательские и системные логи:

  • в пользовательских логах содержатся данные приложения;

  • в системных – логи, которые отрабатываются в инфраструктуре облака. 

Просмотрев логи, можно убедиться, что запущенное nginx-приложение действительно работает, а в объектном хранилище хранятся загруженные фотографии.


Вот таким незамысловатым способом теперь все данные приложения надежно хранятся в Evolution Object Storage, даже когда оно не раздает файлы.

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

Комментарии (2)


  1. Roman2dot0
    10.07.2025 17:18

    Серьёзно? sqlite на фс, которая на с3? Привилегированный контейнер для веб приложения? Это статья о том, как не надо делать? Плохо, даже для джуна.


    1. AlexGluck
      10.07.2025 17:18

      Зачем ты подсказываешь? Я хочу зарплату лям, а с такими деятелями это будет легко.