Базовая конфигурация MinIO 🔗

Отправной точкой для этого обзора стала простая стек Docker Compose: DuckDB для чтения и записи данных Iceberg, хранящихся на S3, предоставляемой MinIO.

Код можно найти здесь.

Docker Compose выглядит так:

  1. DuckDB и Iceberg REST Catalog

  2. MinIO (локальное S3 хранилище)

  3. mc — CLI для MinIO, использующийся для автоматического создания bucket'а.

minio01.excalidraw

При вставке данных в DuckDB:

INSERT INTO cat.test.products VALUES
    (1, 'Widget', 9.99),
    (2, 'Gadget', 19.99),
    (3, 'Doohickey', 14.99);

данные попадают в формат Iceberg на S3 в MinIO:

$ mc ls minio/warehouse/test/products/data/

[2026-01-12 14:35:55 UTC]   693B STANDARD 019bb2a2-8ad5-7159-968c-3693c3578902.parquet
[2026-01-12 14:35:55 UTC] 2.7KiB STANDARD 188ee032-8576-4f46-9834-1cac6d3080a3-m0.avro
[2026-01-12 14:35:55 UTC] 1.6KiB STANDARD snap-2633370813252912097-95ad4df0-3243-4cfb-a736-8f785aac100c.avro

В каждом из примеров можно запустить test.sh для проверки:

❯ ./test.sh

    ░▒▓██████████████████████████████████████████████████▓▒░
    ▒                                                      ▒
    ▓      ___                    ▓▓▓▓▓                    ▓
    █  ___( o)>  ┌───────────┐  ▓▓▓▓▓▓▓  ▒▒▒▒▒▒▒           █
    █  \ <_. )   │  DUCKDB   │  ▓░Local S3 ░▓  ▒▒▒▒        █
    █    ---     └───────────┘   ▓▓ MinIO  ▒▒▒             █
    ▓           ┏━━━━━━━━━━━━━┓        ░░░                 ▓
    ▒  ≋≋≋≋≋≋≋  ┃  ICEBERG    ┃  ≋≋≋≋≋≋≋≋  Smoke test      ▒
    ░  ≋≋≋≋≋≋≋  ┗━━━━━━━━━━━━━┛  ≋≋≋≋≋≋≋≋                  ░
    ░▒▓██████████████████████████████████████████████████▓▒░

1. Checking MinIO buckets (before)...
[2026-01-14 12:48:41 UTC]     0B warehouse/

2. Creating Iceberg table and inserting data...
[…]

3. Verifying data in DuckDB...
[…]

┌───────┬───────────┬───────────────┐
│  id   │   name    │     price     │
│ int32 │  varchar  │ decimal(10,2) │
├───────┼───────────┼───────────────┤
│     1 │ Widget    │          9.99 │
│     2 │ Gadget    │         19.99 │
│     3 │ Doohickey │         14.99 │
└───────┴───────────┴───────────────┘

4. Checking MinIO bucket contents (after)...
[2026-01-14 12:49:07 UTC]   493B STANDARD data/019bbc8d-7d44-7b6b-af71-0ab99d3a0124.parquet
[2026-01-14 12:49:07 UTC] 2.7KiB STANDARD data/c37ab68c-8aaf-44a4-88e6-bc02a01daf5c-m0.avro
[2026-01-14 12:49:07 UTC] 1.6KiB STANDARD data/snap-1988745121468861337-95e77212-9571-423f-bb71-ce8f1b4282f0.avro
[2026-01-14 12:49:07 UTC] 1.0KiB STANDARD metadata/00000-8bf22118-d262-47a9-986c-721d2b99a846.metadata.json
[2026-01-14 12:49:07 UTC] 1.7KiB STANDARD metadata/00001-5cad6fc5-fe54-41bc-8131-4d6f900d20e7.metadata.json

Альтернативы MinIO 🔗

Рассмотрим различные альтернативы MinIO и насколько легко его на них заменить.

Исходный проект переписывался для использования замены MinIO с минимальными изменениями. MinIO CLI mc оставлен, поскольку его легко заменить (s3cmd, aws CLI и т.д.).

S3Proxy 🔗

💾 Пример Docker Compose

Тестировалась версия: 3.0.0

Простота конфигурации: 👍👍

Очень простая в реализации и выглядит как хороший лёгкий вариант.

Заметили, что один из проектов, используемый S3Proxy — jclouds, был перемещён в Apache Attic (то есть снят с поддержки) в середине 2025 года. Вероятно, это не проблема, если использовать только локальное хранилище?

RustFS 🔗

💾 Пример Docker Compose

Тестировалась версия: 1.0.0-alpha.79

Простота конфигурации: ✅✅

Важно знать: недавно в RustFS найдена серьёзная уязвимость безопасности, которая многих отпугнула. Сайт выглядит красиво, но несколько ссылок ведут на одну страницу, давая ощущение свежепокрашенного нового проекта. Для демо это может быть менее критично, если легко переключаться. Также проект находится только на alpha-релизе.
rustfs.excalidraw

RustFS также включает GUI:

rustfs gui

SeaweedFS 🔗

💾 Пример Docker Compose

Тестировалась версия: 4.06

Простота конфигурации: 👍

seaweedfs.excalidraw

Этот quickstart полезен для запуска базовой функциональности S3. Впрочем, всё равно пришлось просить помощь у Claude для реализации. В целом изменений немного: просто замена Docker образа, но аутентификация требует собственного конфиг-файла (который, как и для Garage, встроен в Docker Compose для краткости).

Дополнение: сразу после публикации этого блога проект ответил, что уберут это требование, сделав использование ещё проще! Как здорово!

Это завершено в https://t.co/RQv387bbKb и будет включено в еженедельный релиз.

— SeaweedFS (@SeaweedFS) 14 января 2026

SeaweedFS поставляется с простым UI, что удобно:

seaweedfs ui

Сайт SeaweedFS на удивление скудный, и с первого взгляда можно пропустить, что это проект Open Source, так как есть опция "pricing" и название на главной странице — "SeaweedFS Enterprise" (и нет ссылки на GitHub, которую я мог найти!). Но это действительно проект Open Source, и давно существующий: SeaweedFS с поддержкой S3 существует с релиза 0.91 в 2018 году. Подробнее о SeaweedFS можно узнать из этих слайдов, включая таблицу сравнения с MinIO.

Zenko CloudServer 🔗

💾 Пример Docker Compose

Тестировалась версия: 9.2.8

Простота конфигурации: 👍

cloudserver.excalidraw

Раньше известный как S3 Server, CloudServer — часть набора инструментов Zenko, издаваемого Scality. Хорошо встраивается на место MinIO, но поначалу сложновато разобраться в наборе имён (cloudserver/zenko/scality) и какое ПО именно нужно запускать. Также есть странное ощущение, что доки ссылаются на устаревший Docker образ.

Garage 🔗

💾 Пример Docker Compose

Простота конфигурации: 😵

Тестировалась версия: 1.0.0

Пришлось просить помощь у друга при работе с этим. Помимо контейнера garage, нужен был другой для начальной конфигурации, плюс TOML конфиг-файл, который встроен в Docker Compose для краткости.

garage.excalidraw

Мог ли я сесть и разобраться с документацией самостоятельно? Да. Есть ли у меня дела поважнее? Тоже да.

Итак, Garage работает, но... это совсем не просто встраиваемая замена с точки зрения изменений кода. Требует другой сантехники для инициализации, и даже это не просто. Простой пример: The specified key ID is not a valid Garage key ID (starts with GK, followed by 12 hex-encoded bytes). Отлично для production-гигиены... избыточно для локальных демо и на самом деле порядком мешает.

Это совсем честная оценка? С точки зрения новой технологии — нет. Много отличного ПО, особенно способного работать распределённо, имеет крутую кривую обучения для конфигурации. Но моё требование здесь — простая встраиваемая замена для MinIO, чем Garage не является.

Apache Ozone 🔗

💾 Пример Docker Compose

Тестировалась версия: 2.1.0

Ozone выделилась из Apache Hadoop (помните его?) в 2020 году, начав как часть проекта HDFS ещё в 2015.

Простота конфигурации: 😵

apacheozone.excalidraw

Работает как замена MinIO, но это не лёгкий вариант; ни я, ни Claude не смогли развернуть её с менее чем **четырьмя** узлами. Чувствуется тяжёлой как Hadoop, и я не очень спешу её принимать для своего use case.

Ceph Object Gateway 🔗

Посмотрел на инструкции по установке и отказался!

Ozone (выше) достаточно тяжеловат; уверен, оба отличны в своём деле, но это не лёгкий контейнер для встраивания в Docker Compose для локальных демо.