раздел 04
Объектное хранилище и S3
Что это
Объектное хранилище - это отдельный сервис для хранения файлов: картинок, видео, документов, бэкапов. Вы кладёте туда файл (объект), а сервис отдаёт на него ссылку. Самый известный стандарт - S3 (Simple Storage Service от Amazon), и почти все провайдеры дают «S3-совместимое» хранилище, которое работает по тому же протоколу.
Ключевые понятия
- Бакет (bucket) - папка-контейнер верхнего уровня, в которой лежат ваши файлы. У бакета есть имя и регион.
- Объект - сам файл внутри бакета плюс его метаданные.
- Ключи доступа (access key + secret key) - пара «логин-пароль» для программного доступа. Приложение использует их, чтобы загружать и читать файлы. Их нельзя светить в коде.
- Endpoint - адрес, по которому обращаются к хранилищу.
Чем отличается от диска сервера
| | Диск сервера | Объектное хранилище (S3) | |---|---|---| | Что хранит | Систему, код, БД, временные файлы | Пользовательские файлы, медиа, бэкапы | | Объём | Фиксированный, надо докупать | Практически безлимитный, платите за факт | | Доступ | Только через сам сервер | Прямая ссылка, доступно отовсюду | | Надёжность | Завязан на один сервер | Реплицируется, переживает падение сервера | | Цена | Входит в тариф сервера | Отдельно, обычно дёшево за гигабайт |
Зачем
- Видео и картинки. Не забивают диск сервера, отдаются напрямую пользователю, не нагружая ваш сервер.
- Бэкапы. Складываете дампы базы и архивы в хранилище - они переживут даже потерю сервера.
- Загрузки пользователей. Аватары, документы, вложения - всё это логично хранить в S3, а не на диске.
Пример
Веб-приложение, где пользователи грузят фото. Само приложение крутится на VPS, а фотографии летят в S3-бакет. В базе хранится только ссылка на файл. Если сервер придётся пересоздать - файлы на месте, ничего не потеряется. Бэкап базы тоже кладётся в отдельный бакет по расписанию.
Антипаттерны
- Хранить пользовательские загрузки на диске сервера. Диск заполнится, пересоздадите сервер - потеряете файлы.
- Класть ключи доступа в код или в Git. Это утечка. Держите их в переменных окружения и
.env, который не коммитится. - Делать бакет публичным «на всякий случай». Открывайте доступ только к тому, что реально должно быть публичным.
Что дальше
Теперь посмотрим на конкретных провайдеров - кто даёт серверы и хранилища, для кого они и сколько стоят. Практику по S3 на конкретной платформе смотрите в курсах Selectel и DigitalOcean, а про данные в целом - в курсе Хранение данных.