Магазин на одном сервере складывает загруженные картинки в /var/www/uploads — и это работает ровно до первого события: переезда, второго сервера, потерянного диска или запуска в контейнере. Дальше начинается разбор, куда делись фотографии товаров. Объектное хранилище с S3-совместимым API решает этот класс задач целиком, но не бесплатно и не без оговорок.
Что ломается при локальном хранении
Локальный диск живёт ровно столько, сколько живёт машина. В контейнерном развёртывании это записано в документации Docker прямым текстом: файлы, созданные внутри контейнера, попадают в записываемый слой, и «данные, записанные в слой контейнера, не сохраняются при уничтожении контейнера».
Том (volume) эту конкретную проблему снимает, но не следующие: том привязан к хосту. Два веб-сервера за балансировщиком не видят файлы друг друга — картинка, загруженная через первый, отдаёт 404 на втором. Резервная копия базы больше не описывает состояние магазина целиком: без синхронного снимка диска восстановление даст каталог с битыми изображениями. А единственная копия файла на единственном диске — это ровно одна аппаратная поломка до потери всех фотографий товаров.
Надёжность, которую нельзя собрать на одном диске
Объектное хранилище раскладывает каждый объект по нескольким машинам, а обычно и по нескольким дата-центрам. Yandex Object Storage описывает схему прямо: «используется репликация ×3 — по одной копии данных в каждой зоне доступности», и все классы хранилища «защищают данные от потери даже при полном отказе одной из трёх зон доступности». Selectel формулирует то же иначе: «все объекты хранятся в трёх копиях на разных серверах, в разных стойках и сегментах дата-центров уровня Tier III». MWS заявляет надёжность хранения 99,999999999 % — те самые одиннадцать девяток — при данных, размещённых «одновременно в двух дата-центрах, с избыточной репликацией».
Одиннадцать девяток — это проектная оценка вероятности потери объекта, а не гарантия по договору: возмещение регулируется отдельным SLA и считается в процентах от потреблённого сервиса. Но собрать эквивалент из RAID и одной серверной нельзя в принципе: RAID переживает диск, а не пожар.
Сколько это стоит
Yandex Object Storage тарифицирует хранение в ГБ × час: первые 720 единиц в месяц не тарифицируются, дальше 0,0033 ₽ за ГБ × час. Гигабайт, пролежавший месяц (720 часов), стоит 2,376 ₽. Операции считаются отдельно: GET, HEAD и OPTIONS — 0,46 ₽ за 10 000 операций, PUT, POST, PATCH и LIST — 0,5692 ₽ за 1 000 операций, DELETE не тарифицируется. Бесплатны первые 100 000 операций чтения и первые 10 000 операций записи в месяц.
В той же документации есть готовый расчёт для сайта на 3 ГБ с посещаемостью 200 человек в день, каждый из которых тянет около 20 объектов, — 120 000 запросов в месяц. Стандартное хранилище: 4,752 ₽ за хранение, 62,612 ₽ за запросы, итого 67,364 ₽ в месяц.
Обратите внимание на пропорцию: запросы дороже хранения в тринадцать раз. Это главная особенность биллинга объектных хранилищ, и на неё натыкаются те, кто считал только гигабайты. Но так устроен не каждый поставщик — у половины российских S3 запросы не тарифицируются вообще.
Где взять S3 в России
S3-совместимое хранилище есть почти у каждого российского облака, и биллинг у них устроен по-разному: кто-то берёт за хранение, запросы и трафик отдельно, кто-то продаёт объём пакетом и не считает операции. Цены ниже — за стандартный (горячий) класс, проверены 6 сентября 2026; у всех перечисленных дата-центры находятся в России.
| Сервис | Хранение | Запросы | Исходящий трафик | Надёжность |
|---|---|---|---|---|
| Cloud.ru | 1,1346 ₽/ГБ·мес (однозонное, с НДС) | GET, HEAD — 0,03294 ₽/тыс.; PUT, POST, LIST — 0,1098 ₽/тыс. | 1,1712 ₽/ГБ (от 10 000 ГБ) | SLA ≥ 99,95 % на трёхплощадочные классы, ≥ 99,0 % на однозонное |
| Beget | 0,07 ₽/ГБ в день | Бесплатно | Безлимитный | SLA 99,98 %, тройная репликация |
| Timeweb Cloud | Пакетами: 10 ГБ — 79 ₽/мес, 100 ГБ — 349 ₽/мес | Отдельно не тарифицируются | 100 ГБ в месяц бесплатно, дальше 1,3 ₽/ГБ | SLA 99,98 %, тройная репликация |
| Yandex Object Storage | 2,376 ₽/ГБ·мес (0,0033 ₽ за ГБ × час) | Запись — 0,5692 ₽/тыс.; чтение — 0,46 ₽/10 тыс. | 100 ГБ в месяц бесплатно, дальше 1,67994 ₽/ГБ | SLA 99,98 %, репликация ×3 по зонам доступности |
| MWS Object Storage | 2,44 ₽/ГБ·мес | Запись — 0,0055 ₽ за 10; чтение — 0,0045 ₽ за 100 | 1,3212 ₽/ГБ | SLA 99,95 %, надёжность 99,999999999 % |
| Selectel | От 2,56 ₽/ГБ·мес | Платные, зависят от класса | Платный, зависит от класса | Компенсации по SLA — при доступности ниже 99,98 %; три копии |
| Рег.облако (REG.RU) | 2,63 ₽/ГБ·мес | Без лимитов, включены | Без лимитов, включён | Трёхкратная репликация |
| VK Cloud | Публичного прайса нет — стоимость считается калькулятором на сайте | |||
Yandex Object Storage — самый подробно документированный вариант: правила тарификации расписаны до отдельных операций, там же лежат примеры расчёта. Есть классы холодного и ледяного хранения (1,267 и 0,633 ₽ за ГБ в месяц) и Intelligent Tiering, который сам перекладывает объекты между классами. Обратная сторона подробного биллинга — за запросы придётся платить, и в типовом расчёте они дороже хранения.
Selectel — собственные дата-центры в Москве, Санкт-Петербурге и Ленинградской области, три класса хранения (стандартное от 2,56 ₽, холодное от 1,25 ₽, ледяное от 0,89 ₽ за ГБ в месяц) с явным разменом: дешевле хранение — дороже запросы и трафик. Единственный из списка, кто публикует шкалу компенсаций по SLA целиком, вплоть до возврата 100 % при доступности ниже 90 %.
Timeweb Cloud продаёт не потребление, а пакет: 1 ГБ — 1 ₽, 10 ГБ — 79 ₽, 100 ГБ — 349 ₽ в месяц, безлимитный тариф — 639 ₽ (в него включено 250 ГБ, свыше — 2 ₽ за ГБ). Запросы не считаются, исходящего трафика бесплатно 100 ГБ в месяц. Для магазина с предсказуемым объёмом картинок это самый простой счёт из всех. Дата-центр пока один — Санкт-Петербург.
Cloud.ru (бывший SberCloud) — самое дешёвое хранение в списке, но цена в прайсе указана за однозонный класс, у которого и SLA соответствующий: «в однозонном хранилище данные хранятся и реплицируются только на одной площадке; в случае её недоступности данные перестают быть доступными». Трёхплощадочные классы в описании услуги есть, в опубликованной таблице тарифов — нет. Стартовые 15 ГБ дают бесплатно.
MWS Object Storage (МТС) — два подмосковных дата-центра Tier III, заявленные одиннадцать девяток надёжности и SLA 99,95 %. Тарификация подробная, как у Яндекса: хранение, трафик и запросы отдельно, плюс архивный класс за 1,26 ₽ и премиальный за 9,15 ₽ за ГБ в месяц.
Beget — единственный, кто не берёт ни за запросы, ни за исходящий трафик: только 0,07 ₽ за ГБ в день, то есть около 2,1 ₽ за месяц из тридцати дней. Для раздачи картинок каталога, где запросов много, а гигабайтов мало, это меняет структуру счёта целиком. Посуточная тарификация удобна для коротких экспериментов.
Рег.облако — 2,63 ₽ за ГБ в месяц «без скрытых платежей и лимитов на исходящий трафик или количество операций», трёхкратная репликация, дата-центры в Москве, Санкт-Петербурге и Самаре. Самая простая модель после Timeweb: одна цифра в счёте.
VK Cloud S3-хранилище предлагает, но цены на сайте не публикует — считать нужно калькулятором в личном кабинете. Сравнить с остальными по открытым данным не получится.
Где у S3 цена: трафик и запросы
Исходящий трафик оплачивается отдельно почти везде. У Yandex Object Storage первые 100 ГБ в месяц бесплатны, дальше 1,67994 ₽ за гигабайт: в примере из документации 283 ГБ трафика за месяц стоят 307,43 ₽. Для страницы каталога с полусотней фотографий этот рубеж проходится быстрее, чем кажется.
Отсюда два следствия. Первое — перед хранилищем нужен CDN или кеш, иначе каждый просмотр карточки товара оплачивается как отдельная пачка GET-запросов. Второе — выбор поставщика влияет на счёт сильнее, чем выбор архитектуры: на одном и том же магазине счёт у Яндекса складывается из хранения, запросов и трафика, а у Beget или Рег.облака запросы и трафик не тарифицируются вовсе, и остаётся одна строка за объём.
Остальные издержки честнее назвать сразу: лишний сетевой переход при загрузке файла, ключи доступа и политики бакета, которые надо не перепутать, и файлы-сироты, которые копятся в бакете, если удаление объектов не встроено в приложение с самого начала. Доступность по SLA — 99,95–99,98 % за год, то есть не 100 %: когда хранилище недоступно, магазин остаётся без картинок, и локальный диск в этот момент выглядит привлекательнее.
Приватные файлы отдаёт хранилище, а не приложение
Публичное чтение включается политикой на префикс — например, только на images/*, тогда как всё остальное в бакете остаётся закрытым. Файлы, которые нельзя отдавать всем, выдаются по временной ссылке: в документации Yandex Object Storage это «подписанные (pre-signed) URL», а срок их жизни задаётся параметром X-Amz-Expires, у которого «максимальное значение — 2592000 секунд (30 дней)».
Практический смысл — байты идут от хранилища к покупателю напрямую. Приложение не проксирует гигабайты, не занимает воркеров на время скачивания и не упирается в свой канал. Ровно так устроена выдача архивов плагинов в нашем маркетплейсе: картинки лежат под публичным префиксом, архив — за временной ссылкой.
S3 — это протокол, а не поставщик
S3 давно перестал быть названием одного сервиса и стал интерфейсом, который реализуют все: и облачные провайдеры из таблицы выше, и хранилища, которые ставят на своём железе. RustFS — open source под Apache 2.0 — описывает себя как «S3-совместимое объектное хранилище» с drop-in S3 API.
Отсюда вывод, который на практике важнее цен: код, работающий с S3, одинаков в разработке и на проде. Локально поднимается контейнер с S3-совместимым хранилищем, на проде подставляются адрес и ключи облака — приложение не меняется. Привязки к поставщику нет: переезд между облаками — это перелив объектов и правка четырёх переменных окружения. Поэтому и выбор из таблицы выше не окончательный: не подошли цены — меняете endpoint и ключи.
Когда локальный диск лучше
Один сервер, который никуда не переезжает, десяток картинок и понятная резервная копия всего диска — S3 здесь добавит сетевой переход, ключи и счёт, не решив ни одной существующей проблемы. Смысл появляется там, где есть хотя бы одно из: второй сервер, контейнеры, пользовательские загрузки, требование пережить потерю диска.
Вывод
Локальное хранение картинок — не ошибка, а решение с коротким сроком годности: оно перестаёт работать при первом изменении в развёртывании. Объектное хранилище снимает связку «файлы ↔ конкретная машина», даёт сохранность, недостижимую на одном диске, и разгружает приложение от отдачи байтов. Счёт при этом зависит не столько от гигабайтов, сколько от модели тарификации: там, где запросы и трафик считают отдельно, кеш перед хранилищем нужен не «потом», а сразу; там, где их включили в цену объёма, магазин на несколько десятков гигабайт картинок обходится в пару сотен рублей в месяц.
Источники
- Docker Docs — Storage: жизненный цикл записываемого слоя контейнера. Обращение 6 сентября 2026.
- Yandex Cloud — правила тарификации Object Storage: цены хранения, операций и трафика, примеры расчёта. Обращение 6 сентября 2026.
- Yandex Cloud — классы хранилища: репликация ×3 по зонам доступности. Обращение 6 сентября 2026.
- Yandex Cloud — подписанные (pre-signed) URL: срок жизни ссылки до 2 592 000 секунд. Обращение 6 сентября 2026.
- Cloud.ru — тарифы Evolution Object Storage: цены хранения и операций. Обращение 6 сентября 2026.
- Selectel — облачное хранилище S3: классы, три копии, дата-центры Tier III. Обращение 6 сентября 2026.
- Selectel — условия оказания услуги: шкала компенсаций по SLA. Обращение 6 сентября 2026.
- Timeweb Cloud — объектное хранилище S3: пакетные тарифы, лимит трафика, SLA. Обращение 6 сентября 2026.
- MWS — Object Storage: цены классов, надёжность и SLA, дата-центры. Обращение 6 сентября 2026.
- Beget — облачное хранилище S3: 0,07 ₽ за ГБ в день, бесплатные запросы и трафик. Обращение 6 сентября 2026.
- Рег.облако — хранилище S3: 2,63 ₽ за ГБ в месяц, трёхкратная репликация. Обращение 6 сентября 2026.
- VK Cloud — объектное хранилище: описание сервиса. Обращение 6 сентября 2026.
- RustFS: S3-совместимое объектное хранилище под Apache 2.0. Обращение 6 сентября 2026.