Выбрал сервис Yandex Object Storage (S3) для медиа (фото) и статики. Потратил пару дней, чтобы подключить. Статью от Яндекса не нашел, использовал пару сторонних сайтов и информацию с Chat GPT. И вот решил написать свою статью.

Начнем с Django. По идее в settings.py у вас так:

# медиа и статичные файлы в режиме разработки
STATIC_URL = "static/"
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
MEDIA_ROOT = f"{BASE_DIR}/media"
MEDIA_URL = "/media/"

Переходим в Yandex Cloud. Вы зарегистрировались, переходим в Identity and Access Management для создания сервисного аккаунта.

Главное добавьте роль Admin
Главное добавьте роль Admin

Переходим в сервисный аккаунт и создаем новый ключ (запишите данные: ID и Ключ)

Переходим в Object Storage и создаем бакет. Это простой пример (доступ ограничен, объём неограничен)

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

Назначаем созданному сервисному аккаунту роль Admin. Переходим к Django (settings.py).

Для начала установим пакеты django-storages и boto3. Добавляем приложение 'storages' в INSTALLED_APPS.

INSTALLED_APPS = [
    ...,
    'storages',
]
# медиа и статичные файлы в режиме разработки
# STATIC_URL = "static/"
# STATICFILES_DIRS = [
#     os.path.join(BASE_DIR, "static"),
# ]
# MEDIA_ROOT = f"{BASE_DIR}/media"
# MEDIA_URL = "/media/"

# связь с Yandex S3 (статика)
AWS_S3_ACCESS_KEY_ID = "ваш key_id"
AWS_S3_SECRET_ACCESS_KEY = "ваш ключ"
AWS_STORAGE_BUCKET_NAME = "имя бакета"
AWS_S3_ENDPOINT_URL = "https://storage.yandexcloud.net"
AWS_S3_CUSTOM_DOMAIN = f"storage.yandexcloud.net/{AWS_STORAGE_BUCKET_NAME}"
AWS_S3_OBJECT_PARAMETERS = {
    "CacheControl": "max-age=86400",
}
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"
MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
DEFAULT_FILE_STORAGE = "online_store.s3_storage.MediaStorage"
STATICFILES_STORAGE = "online_store.s3_storage.StaticStorage"

В той же папке, где settings.py создайте файл s3_storage.py. Код внутри файла:

from storages.backends.s3boto3 import S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    location = "media" #папка в бакете
    file_overwrite = False #запрет на перезапись файлов


class StaticStorage(S3Boto3Storage):
    location = "static"
    file_overwrite = False

После запускаем команду:

python manage.py collectsatic и проверяем

Спасибо за прочтение :-)

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


  1. MrSmitix
    18.08.2025 05:47

    Будем разбираться почему не обновляется статика после изменения через 3...2...1...


    1. TheStupidBear Автор
      18.08.2025 05:47

      не понял, что написали


      1. 4wards1
        18.08.2025 05:47

        Зря вы полагаетесь на ChatGPT. Он вам нагенерировал мусор с очень серьёзной ошибкой внутри, а вы не просто её не видите - вы ещё и настолько доверяете этому мусору, что даже запаковываете его в статью-инструкцию и публикуете на Хабр.


        1. TheStupidBear Автор
          18.08.2025 05:47

          а на что полагаться) Очень мало информации как связать с Yandex Storage. Да, скорее всего ошибся, я всего лишь новичок


        1. TheStupidBear Автор
          18.08.2025 05:47

          так а какая ошибка? хоть намекните


          1. MrSmitix
            18.08.2025 05:47

            class StaticStorage(S3Boto3Storage):
                location = "static"
                file_overwrite = False

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

            Вообще делиться знаниями похвально, но тут на статью не тянет, так ещё и с ошибками


  1. eugene3711
    18.08.2025 05:47

    Меня ещё смутил совет давать сервисному аккаунту роль админа. Я не спец по облаку яндекса, но думаю там тоже есть роли с меньшими, но достаточными для задачи привилегиями.


    1. TheStupidBear Автор
      18.08.2025 05:47

      просмотрю другие роли, если что изменю статью
      спасибо)