Аналоги MinIO: SeaweedFS, Garage, Ceph RGW и облачные S3

↑ 4.2 Объектное хранилище: MinIO и S3 · ← Предыдущая · → Следующая

Желательно~11 мин чтенияУровень: middle

Зачем это на собесе

«Чем заменить MinIO?» и «Как выбрать S3-совместимое хранилище?» спрашивают всё чаще: у MinIO AGPL-лицензия и меняющаяся политика проекта. Сильный ответ не называет одно «лучшее» хранилище, а сравнивает по критериям: полнота S3 API, модель надёжности, эксплуатационная сложность, лицензия, цена и зрелость проекта.

Подтемы

  • Почему вообще ищут замену MinIO
  • Что значит «S3-совместимый»
  • SeaweedFS, Garage, Ceph RGW, RustFS
  • Облачные S3-совместимые сервисы
  • Критерии и схема выбора

Объяснение

Почему ищут замену MinIO

MinIO долго был стандартом для self-hosted S3: один бинарник, быстрый, простой старт. Причины смотреть на альтернативы:

  • Лицензия AGPLv3 (с 2021 года). Если вы встраиваете MinIO в свой продукт или предоставляете его как сервис, юристы задают вопросы; для обычного внутреннего использования ограничения мягче, но их надо понимать.
  • Политика проекта. В 2025 году MinIO урезал управление из веб-консоли в бесплатной версии (часть функций осталась в коммерческой линейке AIStor), затем прекратил публиковать готовые образы и бинарники сообщества, а репозиторий перешёл в режим поддержки без новых возможностей. Точное состояние на сегодня проверяйте в репозитории и объявлениях проекта: оно менялось быстро.
  • Функции под лицензией. Для крупных кластеров и поддержки нужна платная подписка.

Из этого не следует, что существующий MinIO надо срочно выбрасывать. Вопрос в планировании: как закреплять версии, откуда брать образы и какой у вас план миграции.

Что значит «S3-совместимый»

У S3 нет открытого стандарта. Есть документация AWS и де-факто поведение. Каждый продукт реализует часть API, поэтому «совместим с S3» нужно проверять по конкретным возможностям:

ВозможностьЗачем нужна
PUT/GET/DELETE/HEAD/LISTбазовые операции, есть везде
Multipart uploadбольшие файлы, докачка
Presigned URLпрямая загрузка и скачивание из браузера
Versioningоткат, защита от удаления
Lifecycleавтоматическое удаление и переезд по возрасту
Object LockWORM, защита от изменений по требованиям регуляторов
Server-side encryptionшифрование на стороне хранилища
События и уведомленияреакция на загрузку (webhook, очередь)
Политики и IAMразграничение доступа по бакетам и префиксам

Перед выбором составьте список того, что реально использует ваше приложение, и проверьте каждый пункт на тестовом стенде.

Кандидаты для self-hosted

РешениеЯзык и лицензияСильные стороныОграничения
SeaweedFSGo, Apache 2.0очень быстро с миллионами мелких файлов, отдельные volume-серверы, гибкая топология, S3-шлюз, есть FUSE-монтированиебольше компонентов (master, volume, filer, S3), S3-совместимость не полная
GarageRust, AGPLv3лёгкий, рассчитан на небольшие кластеры и географически разнесённые узлы, репликация по зонам, простой запускреплики вместо erasure coding, часть функций S3 не реализована (в частности, нет Object Lock и части lifecycle), AGPL
Ceph RGWC++, LGPLзрелый, промышленный, S3 и Swift, erasure coding, огромные кластерытяжёлая эксплуатация (RADOS, мониторы, OSD), нужна команда
RustFSRust, Apache 2.0позиционируется как замена MinIO, простой запускмолодой проект, смотрите зрелость и покрытие S3 на момент выбора
MinIOGo, AGPLv3самая полная совместимость среди простых решений, erasure coding, зрелостьлицензия и политика проекта

SeaweedFS хранит данные в больших volume-файлах по схеме «Haystack», поэтому мелкие объекты не раздувают метаданные файловой системы. Подходит, когда файлов очень много (миниатюры, вложения).

Garage проектировали для маленьких кластеров на обычном железе и слабых каналах. Данные реплицируются в несколько зон (например, 3 копии в 3 площадках). Хорош для домашней лаборатории, малых команд и бэкапов.

Ceph RGW выбирают, когда в инфраструктуре уже есть Ceph (часто вместе с Kubernetes через Rook) и нужен единый слой хранения для блочных, файловых и объектных данных.

Облачные S3-совместимые сервисы

СервисОсобенность
Amazon S3эталон, полный набор возможностей, платный трафик наружу
Cloudflare R2нет платы за исходящий трафик, S3 API, подходит для раздачи контента
Backblaze B2дёшево хранить, S3-совместимый API
Wasabiфиксированная цена за хранение, S3 API
Yandex Object Storage, VK Cloud, SelectelS3 API, данные в российских дата-центрах
Hetzner, DigitalOcean Spacesпростые и недорогие S3-хранилища

Главное отличие от self-hosted: вы платите деньгами и зависимостью от провайдера вместо собственного времени на эксплуатацию. Цены, лимиты и тарифы меняются, сверяйтесь с прайсом поставщика.

Схема выбора

flowchart TD
    A["Нужно S3-совместимое хранилище"] --> B{"Готовы отдать эксплуатацию<br/>облаку?"}
    B -- да --> C["Облако: S3, R2, B2, Yandex Object Storage<br/>(смотрите цену исходящего трафика)"]
    B -- нет --> D{"Данные и требования к S3"}
    D -- "много мелких файлов" --> E["SeaweedFS"]
    D -- "маленький кластер,<br/>несколько площадок" --> F["Garage"]
    D -- "уже есть Ceph,<br/>большие объёмы" --> G["Ceph RGW"]
    D -- "нужна полная совместимость,<br/>готовы принять лицензию и риски" --> H["MinIO (с закреплённой версией)"]
    C --> I["Проверить на тестовом стенде<br/>всё, что использует приложение"]
    E --> I
    F --> I
    G --> I
    H --> I

Примеры

Запуск SeaweedFS с S3-шлюзом

docker run -d --name seaweed -p 8333:8333 -p 9333:9333 \
  -v seaweed-data:/data chrislusf/seaweedfs \
  server -dir=/data -s3

S3-эндпоинт будет на http://localhost:8333. Для проверки подойдёт mc, aws s3 или rclone. В боевой конфигурации ключи и политики настраивают через файл конфигурации S3.

Garage: минимальный конфиг и первый бакет

# garage.toml (один узел для теста; в проде replication_factor = 3 на разных узлах)
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "sqlite"
replication_factor = 1
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "<openssl rand -hex 32>"
 
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
garage status                                   # узнать идентификатор узла
garage layout assign -z dc1 -c 10G <node_id>    # зона и ёмкость
garage layout apply --version 1
garage key create app-key                       # ключ доступа
garage bucket create files
garage bucket allow --read --write --owner files --key app-key

Команды и параметры могут отличаться между версиями Garage, сверяйтесь с документацией своей версии.

Подключение из .NET: один код для любого S3

var config = new AmazonS3Config
{
    ServiceURL = "http://localhost:8333",       // адрес вашего хранилища
    ForcePathStyle = true,                      // http://host/bucket/key, а не http://bucket.host/key
    AuthenticationRegion = "us-east-1",         // многие хранилища требуют регион, даже фиктивный
    RequestChecksumCalculation = RequestChecksumCalculation.WHEN_REQUIRED,
    ResponseChecksumValidation = ResponseChecksumValidation.WHEN_REQUIRED,
};
var s3 = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey), config);

Две настройки решают большинство проблем совместимости: ForcePathStyle (иначе SDK пойдёт на bucket.localhost) и отключение обязательных контрольных сумм. Новые версии AWS SDK по умолчанию добавляют CRC-заголовки и особое кодирование тела, которые не все сторонние хранилища понимают.

Нюансы и подводные камни

  • «Совместим» не значит «одинаков». Проверяйте мультичасти, presigned URL, версионирование и lifecycle на своём наборе запросов, а не по таблице на сайте проекта.
  • Replication или erasure coding. Реплики (Garage, SeaweedFS) проще, но тратят место ×3; erasure coding (MinIO, Ceph) экономнее, но сложнее и требует больше узлов.
  • Лицензия AGPL заразна для форков и сервисов. Если вы модифицируете исходники AGPL-продукта и предоставляете его по сети, обязаны открыть изменения. Для неизменённого внутреннего использования ограничений меньше. При сомнениях консультируйтесь с юристом.
  • Один узел не отказоустойчив. Любое хранилище с одним узлом теряет данные вместе с диском, для продакшена нужны реплики и бэкапы (см. репликацию и версионирование).
  • Закрепляйте версии образов. Не используйте latest: поведение и лицензии меняются, а образ могут перестать публиковать.
  • Эгресс-трафик. Для облачных хранилищ главная статья расходов часто не хранение, а исходящий трафик. Это причина, по которой смотрят на R2 и подобные сервисы.
  • Тесты. Для интеграционных тестов поднимайте лёгкое S3-совместимое хранилище в Testcontainers, а не мокайте клиент: так ловятся ошибки подписи и путей.

Вопросы с ответами

Связанные темы