Выбрал сервис 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 для создания сервисного аккаунта.



Переходим в сервисный аккаунт и создаем новый ключ (запишите данные: 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)
eugene3711
18.08.2025 05:47Меня ещё смутил совет давать сервисному аккаунту роль админа. Я не спец по облаку яндекса, но думаю там тоже есть роли с меньшими, но достаточными для задачи привилегиями.
MrSmitix
Будем разбираться почему не обновляется статика после изменения через 3...2...1...
TheStupidBear Автор
не понял, что написали
4wards1
Зря вы полагаетесь на ChatGPT. Он вам нагенерировал мусор с очень серьёзной ошибкой внутри, а вы не просто её не видите - вы ещё и настолько доверяете этому мусору, что даже запаковываете его в статью-инструкцию и публикуете на Хабр.
TheStupidBear Автор
а на что полагаться) Очень мало информации как связать с Yandex Storage. Да, скорее всего ошибся, я всего лишь новичок
TheStupidBear Автор
так а какая ошибка? хоть намекните
MrSmitix
Статические файлы должны перезаписываться. Иначе вы их обновить не сможете при изменении. И даже не изменениями вами, а с переходом на более новую версию django, если они там изменятся в contrib.admin, например. Или с обновлением любой другой либы которая тянет свою статику
Вообще делиться знаниями похвально, но тут на статью не тянет, так ещё и с ошибками