Evolution
Тема интерфейса

Создание django-приложения для раздачи фотографий

С помощью этого руководства вы научитесь сохранять данные проекта, размещенного в Container Apps, с помощью Object Storage. Вы будете использовать репозиторий GitVerse с исходным кодом готового nginx-сервиса для раздачи фотографий и django-приложения для управления фотографиями. На примере этих приложений вы научитесь создавать сервис Container Apps без потери данных, когда трафик падает до нуля.

Вы будете использовать следующие сервисы:

  • Artifact Registry для хранения, совместного использования и управления Docker-образами и Helm-чартами.

  • Container Apps — сервис для запуска контейнерных приложений в облаке. Не требует знания Kubernetes и создания виртуальных машин.

  • Object Storage — объектное S3-хранилище с бесплатным хранением файлов, объемом до 15 ГБ.

Шаги:

Перед началом работы

Если вы уже зарегистрированы, войдите под своей учетной записью.

1. Подготовьте среду

Подготовьте среду, если не сделали этого ранее.

2. Клонируйте или скачайте репозиторий c GitVerse

Вы можете зарегистрироваться в GitVerse, если у вас еще нет аккаунта, и познакомиться с новой системой контроля версий. Этот шаг необязательный и не влияет на дальнейшее прохождение сценария.

В этом репозитории находится исходный код django-приложения, написанного на Python, а также nginx-сервис для публикации фотографий.

git clone https://gitverse.ru/cloudru/evo-container-apps-django-app

3. Соберите образ с django-приложением и присвойте тег

Внимание

Убедитесь, что Docker Desktop запущен и пользователь авторизован в приложении.

Используйте реестр, созданный на этапе подготовки среды.

  1. Перейдите в подкаталог с django-приложением.

    cd django_app
  2. Выполните команду для сборки образа:

    docker build . \
    --tag django-app.cr.cloud.ru/manage-photos-django-app \
    --platform linux/amd64 \
    --provenance false

Для создания контейнера Docker-образ должен быть собран под платформу linux/amd64, поэтому в команде используется флаг platform со значением linux/amd64.

4. Загрузите Docker-образ c django-приложением в реестр

Загрузите образ в реестр Artifact Registry, выполнив команду:

docker push <registry_name>.cr.cloud.ru/manage-photos-django-app

Где:

  • <registry_name> — название реестра, которое вы указывали при его создании в Artifact Registry.

  • manage-photos-django-app — название будущего репозитория в Artifact Registry. Название репозитория соответствует имени Docker-образа.

5. Соберите образ с nginx-сервисом и присвойте тег

Внимание

Убедитесь, что Docker Desktop запущен и пользователь авторизован в приложении.

Используйте реестр, созданный на этапе подготовки среды.

  1. В исходном коде приложения в файле nginx.conf убедитесь, что в качестве каталога для хранения файлов указан /files/media/.

  2. Перейдите в подкаталог с nginx-сервисом.

    cd nginx_share_media_files
  3. Выполните команду для сборки образа:

    docker build . \
    --tag django-app.cr.cloud.ru/nginx-service \
    --platform linux/amd64 \
    --provenance false

Для создания контейнера Docker-образ должен быть собран под платформу linux/amd64, поэтому в команде используется флаг platform со значением linux/amd64.

6. Загрузите Docker-образ c nginx-сервисом в реестр

Загрузите образ в реестр Artifact Registry, выполнив команду:

docker push <registry_name>.cr.cloud.ru/manage-photos-nginx

Где:

  • <registry_name> — название реестра, которое вы указывали при его создании в Artifact Registry.

  • manage-photos-nginx — название будущего репозитория в Artifact Registry. Название репозитория соответствует имени Docker-образа.

7. Создайте бакеты в Object Storage

В сервисе Object Storage создайте бакет для базы данных и бакет для хранения медиаданных.

../_images/object_storage_create.png

Бакет для базы данных SQLite:

Внимание

SQLite не поддерживает одновременную многопоточную запись, особенно при размещении файла базы в Object Storage. Этот пример предназначен исключительно для демонстрационных целей и быстрого запуска приложения.

Для production-среды настоятельно рекомендуется использовать полноценную СУБД, например PostgreSQL — она обеспечит надежность, масштабируемость и поддержку конкурентного доступа.

  • Название<your_name>, например django-app-media-data.

  • Доменное имя — не задано.

  • Класс хранения по умолчаниюСтандартный.

  • Максимальный размер — отключите или укажите на свое усмотрение.

    Этот бакет используется для размещения SQLite-базы данных, в которой хранятся учетные данные пользователей и ссылки на их фотографии. Он будет примонтирован в приложение по пути /files/database.

Бакет для хранения медиаданных:

  • Название<your_name>, например django-app-media-db.

  • Доменное имя — не задано.

  • Класс хранения по умолчаниюСтандартный.

  • Максимальный размер — отключите или укажите на свое усмотрение.

    Этот бакет предназначен для хранения загруженных фотографий. Он будет примонтирован в приложение по пути /files/media.

Убедитесь, что в личном кабинете на странице сервиса Object Storage:

  • в списке бакетов отображаются созданные вами бакеты;

  • класс хранения созданных бакетов — Стандартный.

8. Создайте и запустите контейнер c django-приложением

  1. Откройте меню загруженного образа django-app и нажмите Создать Container App.

    ../_images/create_container_django.png
  2. Заполните поля и активируйте опции:

    ../_images/container_django_params.png
    • Название контейнера — глобально уникальное имя, на базе которого формируется адрес вашего приложения в домене *.containers.cloud.ru.

    • Порт контейнера — порт контейнера, который должен совпадать с портом вашего приложения. В этом сценарии используем порт 8000.

    • vCPU/RAM — количество vCPU и RAM, которые выделяются для каждого экземпляра контейнера при обработке вызова. Выберите конфигурацию 0.2 vCPU - 512 MB.

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

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

    • Автоматическое развертывание — активируйте опцию, чтобы каждый раз после загрузки в Artifact Registry новой версии образа на стороне Container Apps автоматически создавалась новая ревизия контейнера.

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

    Контейнер будет создан в течение нескольких секунд. Отобразится интерфейс Container Apps с информацией о созданном контейнере.

  4. Нажмите Создать ревизию на основе выбранной.

  5. Добавьте том — бакет в сервисе Object Storage для БД приложения:

    1. В разделе Тома главного контейнера выберите Добавить том.

    2. Укажите тип тома — постоянный.

    3. Введите название тома, например django-app-db.

    4. Выберите созданный на предыдущем этапе бакет для базы данных.

    5. Нажмите Добавить.

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

  6. Добавьте том — бакет в сервисе Object Storage для хранения медиаданных:

    1. В разделе Тома главного контейнера выберите Добавить том.

    2. Укажите тип тома — постоянный.

    3. Введите название тома, например django-media.

    4. Выберите созданный на предыдущем этапе бакет для медиаданных.

    5. Нажмите Добавить.

    6. В разделе Параметры монтирования в поле Путь укажите путь до папки с медиаданными.

      ../_images/volumes_create.png
  7. Перейдите на вкладку Переменные контейнера и укажите в качестве значения переменных пути к папкам с БД и с медиафайлами:

    • DB_DIR=/files/database

    • MEDIA_ROOT=/files/media

    • ADMIN_USERNAME=admin

    • ADMIN_PASSWORD=****

      ../_images/variables.png
  8. Нажмите Создать.

Откроется страница сервиса Container Apps. Контейнер будет запущен в течение нескольких секунд.

Дождитесь, когда контейнер и ревизия перейдут в статус «Выполняется».

../_images/django-container-running.png

9. Проверьте работоспособность развернутого django-приложения

  1. Перейдите по публичному URL-адресу контейнера с django-приложением:

    ../_images/loginpage.png

    Отобразится окно входа в панель администратора.

  2. Укажите логин и пароль. Отобразится каталог с изображениями.

    ../_images/django_homepage.png
  3. Попробуйте загрузить изображение.

    ../_images/django_view_files.png

Даже если страница закрыта и приложение не используется, загруженные в базу данных изображения сохранятся.

10. Создайте и запустите контейнер c nginx-сервисом

  1. Перейдите в сервис Container Apps через меню в левом верхнем углу экрана.

    ../_images/go-ca.png
  2. Нажмите Создать.

  3. Укажите название контейнера и активируйте опцию Привилегированный режим, чтобы обеспечить доступ nginx-сервиса к root-пользователю.

    ../_images/privileged_mode.png
  4. Не меняйте конфигурацию. Для nginx-сервиса достаточно минимальной конфигурации, выбранной по умолчанию: vCPU и RAM: 0.1 vCPU – 256 MB.

  5. Выберите Docker-образ, который вы загрузили в Artifact Registry, перейдя в реестр django-app.cr.cloud.ru и репозиторий nginx-service.

    ../_images/select_ar_image.png
  6. Укажите порт контейнера — 80.

  7. Добавьте том — бакет в сервисе Object Storage для хранения медиаданных:

    1. В разделе Тома главного контейнера выберите Добавить том.

    2. Укажите тип тома — постоянный.

    3. Введите название тома, например django-app-media-data.

    4. Выберите созданный на шаге 7 бакет для медиаданных.

    5. Нажмите Добавить.

    6. В разделе Параметры монтирования в поле Путь укажите путь до папки с медиаданными /files/media.

    ../_images/create_nginx_volume.png
  8. Нажмите Следующий шаг.

  9. Задайте количество ресурсов:

    • Минимальное количество экземпляров: 0.

    • Максимальное количество экземпляров: 1.

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

Откроется страница сервиса Container Apps. Контейнер будет запущен в течение нескольких секунд.

Дождитесь, когда контейнер и ревизия перейдут в статус «Выполняется».

11. Проверьте работоспособность развернутого nginx-сервиса

Перейдите по публичному URL-адресу контейнера с nginx-сервисом.

Отобразится каталог изображений, загруженных с помощью сервиса Django.

Результат

Вы научились:

  • создавать репозитории в существующих реестрах Artifact Registry;

  • создавать и запускать контейнер через быстрое меню в Artifact Registry;

  • добавлять постоянный том Object Storage, который позволяет сохранить ваши данные, когда запросы к приложению не поступают;

  • разворачивать приложения, которые совместно используют один и тот же бакет Object Storage.

Смотрите обучающее видео по сервису Container Apps и узнайте о том, как сохранять данные в бакете при нулевом трафике.