MinIO заархивировал открытую версию. Что остаётся тем, у кого он уже развёрнут

Я держу MinIO в контейнере для проверок совместимости и слежу за ним примерно так же, как за погодой за окном. За последний год вид из окна поменялся полностью.
Июнь 2025 года. Из бесплатной сборки убрали административную часть веб-консоли. Остался просмотр объектов. Политики бакетов, правила жизненного цикла, пользователи и настройки сервера уехали в платную версию, в бесплатной остался только консольный клиент mc.
Октябрь 2025 года. Прекратилась публикация готовых сборок и образов. Остались исходники.
Декабрь 2025 года. Репозиторий переведён в режим поддержки. Новых возможностей нет, исправления безопасности рассматриваются выборочно. Тогда же появилась редакция AIStor Free, бесплатная, с полным набором возможностей, но по проприетарной лицензии и только в одноузловом режиме, без распределённого кластера и отказоустойчивости.
Февраль 2026 года. В описании репозитория появилась строка о том, что он больше не поддерживается.
25 апреля 2026 года. Репозиторий заархивирован и доступен только для чтения.
То есть бесплатный вариант у MinIO остался, просто он больше не открытый и не распределённый. Для одного узла AIStor Free закрывает почти всё, включая консоль. Для кластера из нескольких узлов бесплатного пути не осталось.
Хорошо это или плохо для рынка, пусть спорят другие. У меня два практических вопроса. Чем управлять тем, что уже крутится на открытой сборке, и что сломается, если уходить.
Что на самом деле потеряно
Убрали интерфейс, а не возможности сервера.
Политики бакетов, правила жизненного цикла, версионирование, блокировка объектов, CORS, шифрование - всё это части протокола S3, и сервер MinIO их по-прежнему обслуживает. Просто нажимать в браузере больше негде.
Любой инструмент, который говорит с сервером по S3 API, продолжает управлять этими настройками. Консольный mc из той же категории, просто без окон.
Хуже с административным API, через который заводят пользователей, сервисные аккаунты и политики уровня сервера. Это собственный интерфейс MinIO, к S3 отношения не имеющий, и вот он остался без бесплатного графического клиента вообще.
Управление без консоли
Покажу, как те же операции выглядят на уровне протокола. Код на Rust, из клиента, который я пишу для S3-совместимых хранилищ.
Первое, на чём спотыкаются при ручной подписи запросов. В подпись нужно отдавать все заголовки, которые реально уйдут на сервер.
let content_length = body.len().to_string();
let mut all_headers: Vec<(&str, &str)> = extra_headers.to_vec();
all_headers.push(("content-length", content_length.as_str()));
let signable = SignableRequest::new(
"PUT",
&url,
all_headers.iter().copied(),
SignableBody::Bytes(body),
)?;
MinIO к этому относится спокойно и лишний неподписанный заголовок пропускает. Ceph RGW отвечает 403 AccessDenied с пустым полем Message, и выглядит это ровно как отсутствие прав у пользователя.
Я на этом потерял полчаса, перебирая регионы, имена бакетов и способы адресации, пока не дошёл до того, что HTTP-библиотека сама подставляет Content-Type при наличии тела запроса. Заголовок уходит, в подпись не попадает, сервер отвергает запрос.
Второе. Настройки подписи, без которых ключи со слэшами и точками внутри имени ломаются.
let mut signing_settings = SigningSettings::default();
signing_settings.percent_encoding_mode = PercentEncodingMode::Single;
signing_settings.uri_path_normalization_mode = UriPathNormalizationMode::Disabled;
signing_settings.payload_checksum_kind = PayloadChecksumKind::XAmzSha256;
Дальше уже обычная работа с конфигурацией бакета. Правило жизненного цикла отправляется как XML, читается так же.
Что обязательно проверить перед переездом
Я прогнал одинаковый набор запросов по живому кластеру Ceph RGW релиза Tentacle и по MinIO в контейнере. Ниже то, что разошлось. Это же и есть список мест, где ломается миграция.
Жизненный цикл принимается не целиком
Отправляю правило со сроком хранения и с отменой незавершённых многочастных загрузок. Оба хранилища отвечают 200. При чтении обратно RGW возвращает правило целиком, MinIO возвращает его без блока AbortIncompleteMultipartUpload. Ни ошибки, ни предупреждения.
Значит после записи настроек их надо прочитать обратно и сверить с тем, что отправляли. Иначе вы живёте с уверенностью, что брошенные загрузки подчищаются, а они копятся и занимают место, которого не видно в списке объектов.
Кстати, современная форма правила с блоком Filter, тегами и правилом для неактуальных версий принимается обоими хранилищами без потерь. Проблема именно со старой формой.
Маркеры удаления с версией null
Если версионирование приостановлено, маркер удаления получает идентификатор версии null. Обычный DELETE такой объект не убирает, а кладёт сверху ещё один маркер.
Цикл уборки при этом выглядит рабочим. Удалили всё, что видели, перечитали бакет, нашли новый маркер, удалили, снова нашли. И так до упора в лимит попыток, а бакет остаётся непустым.
Удалять надо явным указанием версии.
DELETE /bucket/key?versionId=null
Object Lock в режиме GOVERNANCE
Удаление объекта под блокировкой возвращает 204 и выглядит как успех, но удаляется не версия, а создаётся маркер. Сама версия остаётся, потому что срок хранения ещё не вышел.
Версия удаляется только с заголовком обхода.
DELETE /bucket/key?versionId=...
x-amz-bypass-governance-retention: true
Для режима COMPLIANCE обхода нет вообще, и это правильно.
Имена объектов
Двойной слэш внутри ключа и переход на уровень вверх RGW принимает, MinIO отвергает с кодом 400 и ошибками XMinioInvalidObjectName и XMinioInvalidResourceName.
Пробелы, плюсы, амперсанды, проценты, знаки вопроса и юникод переваривают оба, если клиент правильно кодирует путь.
Для переезда это означает вот что. Если данные лежат на Ceph и кто-то когда-то записал ключ с двойным слэшем, перенос на MinIO встанет на середине. В обратную сторону проблемы нет.
Незавершённые загрузки
Здесь хранилища ведут себя одинаково, и лучше бы наоборот. Незавершённая многочастная загрузка не видна в обычном списке объектов ни на одном из них, показывает её только ListMultipartUploads. Место она при этом занимает.
Перед переездом такие загрузки стоит найти и подчистить, иначе вы переносите объём, которого не видите.
Групповое удаление
Отправляю три существующих ключа и один заведомо несуществующий. Оба хранилища отвечают, что удалили четыре объекта, без ошибок. Это поведение AWS, но на нём строят проверки, которые ничего не проверяют.
Контрольные суммы
Заголовки x-amz-checksum-crc32 и x-amz-checksum-sha256, которые свежие версии SDK добавляют по умолчанию, принимаются обоими. На старых версиях RGW с этим были проблемы, на Tentacle их нет.
Куда уходить
Первый вариант очевидный и его стоит назвать честно. Если у вас один узел и проприетарная лицензия не смущает, AIStor Free закрывает вопрос вообще без переезда, вместе с консолью.
Дальше речь про тех, у кого распределённый кластер или требование держать открытый код. Универсального ответа тут нет, всё упирается в масштаб.
У Ceph RGW самый полный S3 API и настоящая многопользовательская модель, но и эксплуатация самая дорогая. Он разумен там, где кластер уже стоит или где объёмы идут на десятки терабайт.
Из более лёгких вариантов обсуждают Garage с минимальным следом в эксплуатации, SeaweedFS с сочетанием объектного и файлового доступа и RustFS, который повторяет привычную модель развёртывания MinIO и несёт собственную консоль.
Российские облачные хранилища тоже вариант, если данные можно вынести наружу и устраивает оплата за объём.
Бежать в первый же день не обязательно. Развёрнутая открытая сборка работает, её никто не выключает, вопрос только в обновлениях. Но тянуть год я бы не стал именно из-за исправлений безопасности.
Не верьте ответу сервера
Перечитывайте настройку обратно после записи. Все расхождения выше я нашёл именно так, и каждое рано или поздно превращается либо в растущий объём, за который платят, либо в бакет, который нельзя удалить.
А потеряна в этой истории кнопка, а не сервер и не данные. Политики, жизненный цикл, версии и блокировки как работали, так и работают, просто дотягиваться до них теперь нужно чем-то, кроме браузера.
Проверял я всё это своим клиентом для S3-совместимых хранилищ, он лежит на s3tm.ru. Бесплатную версию можно скачать без регистрации.
Если у вас есть свои находки по расхождениям хранилищ, пишите в комментариях. Соберу в отдельный разбор.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.