Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

MinIO: свой S3-совместимый объектный сторадж

MinIO: свой S3-совместимый объектный сторадж

Amazon S3 стал фактическим стандартом объектного хранилища: тысячи библиотек, инструментов и сервисов умеют работать с его API. Но платить Amazon не всегда разумно — особенно если данные должны оставаться на вашем железе, или если объёмы настолько велики, что стоимость S3 становится неприемлемой. MinIO — высокопроизводительный объектный сторадж с полной совместимостью S3 API, который разворачивается за несколько минут.

Что умеет MinIO

  • Полная совместимость с AWS S3 API — любой код написанный для S3 заработает без изменений
  • Erasure coding — собственная схема защиты данных, аналог RAID 6
  • Шифрование на стороне сервера (SSE-S3, SSE-KMS, SSE-C)
  • Репликация между несколькими кластерами или облаками
  • Версионирование объектов и Object Lock (WORM)
  • Производительность: до 325 ГБ/с на запись на кластере из NVMe-дисков

Быстрый старт: одна нода

# Docker
docker run -d 
  -p 9000:9000 
  -p 9001:9001 
  -v /data/minio:/data 
  -e MINIO_ROOT_USER=minioadmin 
  -e MINIO_ROOT_PASSWORD=supersecret 
  --name minio 
  quay.io/minio/minio server /data --console-address ":9001"

Веб-консоль доступна на порту 9001, API — на 9000. Одна нода подходит для разработки и небольших объёмов; для продакшна нужен distributed mode.

Distributed mode: отказоустойчивый кластер

MinIO требует минимум 4 ноды (или 4 диска на одной ноде) для включения erasure coding:

# На каждой ноде
minio server 
  http://minio{1...4}.example.com/data{1...4} 
  --console-address ":9001"

С 4 нодами и 4 дисками на каждой (16 дисков итого) MinIO создаёт erasure set на 16 дисков. По умолчанию: 8 дисков с данными + 8 с чётностью. Кластер переживает потерю до 8 дисков одновременно.

mc: клиент командной строки

# Настроить alias
mc alias set local http://localhost:9000 minioadmin supersecret

# Создать бакет
mc mb local/backups

# Загрузить файл
mc cp /path/to/file.tar.gz local/backups/

# Синхронизировать директорию
mc mirror /var/www/uploads local/media/uploads/

# Включить версионирование
mc version enable local/backups

# Политика жизненного цикла (удалять через 90 дней)
mc ilm add --expiry-days 90 local/backups

Интеграция с boto3 (Python)

import boto3

s3 = boto3.client(
    's3',
    endpoint_url='http://localhost:9000',
    aws_access_key_id='minioadmin',
    aws_secret_access_key='supersecret',
)

# Загрузить файл
s3.upload_file('backup.tar.gz', 'backups', 'backup-2026-03-22.tar.gz')

# Получить список объектов
response = s3.list_objects_v2(Bucket='backups')
for obj in response['Contents']:
    print(obj['Key'], obj['Size'])

Мониторинг через Prometheus

MinIO отдаёт метрики в формате Prometheus на /minio/v2/metrics/cluster. Добавьте в prometheus.yml:

scrape_configs:
  - job_name: 'minio'
    metrics_path: /minio/v2/metrics/cluster
    static_configs:
      - targets: ['minio.example.com:9000']

Готовые дашборды для Grafana есть на официальном сайте MinIO.

Типичные сценарии использования

  • Бэкапы: Restic, Borg, Velero — все умеют писать в S3-совместимое хранилище
  • Хранение артефактов CI/CD: образы, архивы, отчёты
  • Медиафайлы: замена локального хранилища для веб-приложений
  • Логи и аналитика: Loki, ClickHouse, Spark читают из S3

MinIO отлично вписывается в любой self-hosted стек. Если уже используете Kubernetes — есть официальный MinIO Operator с поддержкой автоматического масштабирования.

3 Ответа

  1. Используем MinIO как бэкенд для Loki и всё работает отлично — логи за несколько месяцев занимают разумное место благодаря компрессии.

  1. Важный момент: в distributed mode все ноды должны иметь одинаковое количество дисков одного размера, иначе MinIO откажется стартовать. Проверено на собственных граблях.

  1. Интеграция с boto3 вообще без каких-либо изменений в коде кроме endpoint_url — перешли с настоящего S3 на локальный MinIO за полчаса.