Выбрал сервис 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 и проверяем

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

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


  1. MrSmitix
    18.08.2025 05:47

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


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

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