16-minio — MinIO (S3-совместимое хранилище)

Ставит MinIO — локальное объектное хранилище с интерфейсом Amazon S3: официальный бинарник, отдельный системный пользователь, systemd-юнит с усилением безопасности и веб-консоль. ☐ опциональный.

Зачем нужен

MinIO — это S3-совместимое объектное хранилище. «Объектное хранилище» означает, что вы храните файлы («объекты») в контейнерах-«корзинах» (bucket) и обращаетесь к ним по HTTP, а не как к обычной файловой системе. «S3-совместимое» — значит, что оно понимает тот же протокол, что и Amazon S3, поэтому любые библиотеки и инструменты для S3 (AWS SDK, aws CLI, mc, boto3, minio-js и т. п.) работают с ним без изменений.

Это нужно, когда приложению надо хранить пользовательские загрузки (аватары, документы, видео), бэкапы, статику — но вы не хотите платить за облако и держать данные у себя. Приложение работает с MinIO так же, как работало бы с Amazon S3, только endpoint указывает на ваш сервер.

Модуль ставит сервер MinIO как системную службу и открывает две точки входа: S3 API (порт 9000, сюда ходят приложения) и веб-консоль (порт 9001, браузерный интерфейс для управления bucket'ами вручную).

Когда включать и когда не нужен

Зависимости и требования

Что именно делает

Пошагово, в порядке выполнения module_install:

  1. Создаёт системного пользователя minio-user — без домашнего каталога и с оболочкой /usr/sbin/nologin (под ним нельзя войти в систему), чтобы служба работала не от root.
  2. Скачивает бинарник MinIO под архитектуру сервера в /usr/local/bin/minio, права 755. Если бинарник уже есть — шаг пропускается.
  3. Создаёт каталог данных /var/lib/minio (переменная MINIO_DATA_DIR), права 750, владелец minio-user.
  4. Пишет файл окружения /etc/default/minio с правами 600 (идемпотентно — существующий не перезаписывается, только обновляются порты прослушивания):
    • MINIO_ROOT_USER=minioadmin;
    • MINIO_ROOT_PASSWORD=<сгенерированный пароль>;
    • MINIO_OPTS="--address :9000 --console-address :9001". Логин и пароль root сохраняются в файл учётных данных.
  5. Рендерит systemd-юнит /etc/systemd/system/minio.service из шаблона с директивами усиления безопасности (см. «Безопасность»).
  6. Перечитывает systemd, включает автозапуск и запускает службу minio.
  7. Ждёт готовности: до 10 попыток с интервалом 2 секунды опрашивает http://127.0.0.1:9000/minio/health/live. Если сервер так и не ответил — установка завершается ошибкой.
  8. Отмечает модуль выполненным (state_mark).

Файлы, службы и порты

Объект Значение Права / примечание
Служба systemd minio автозапуск включён
Порт 9000/tcp S3 API сюда подключаются приложения (endpoint)
Порт 9001/tcp веб-консоль браузерный интерфейс управления
/usr/local/bin/minio бинарник сервера 755
/etc/default/minio окружение: root-логин, пароль, опции 600, только root
/etc/systemd/system/minio.service systemd-юнит с усилением
/var/lib/minio каталог данных (bucket'ы и объекты) 750, владелец minio-user
Пользователь minio-user системный, nologin под ним работает служба
/var/lib/mitdev/state/minio.done отметка выполнения модуля

По умолчанию порты 9000/9001 наружу в файрволе не открываются — доступ только с самой машины.

Учётные данные

Два места, оба доступны только root:

  1. /root/.mitdev-credentials (права 600) — сюда сохраняются root-креды:
    minio: root_user=minioadmin
    minio: root_password=<сгенерированный пароль>
    
  2. /etc/default/minio (права 600) — те же самые логин и пароль в виде переменных окружения, которые читает сама служба (MINIO_ROOT_USER, MINIO_ROOT_PASSWORD). Это «рабочая копия», по которой MinIO аутентифицирует доступ.

Посмотреть:

sudo grep '^minio:' /root/.mitdev-credentials

minioadmin — это root-аккаунт MinIO (полный доступ ко всему). В приложения его отдавать не стоит — заведите отдельные ключи доступа (см. «Как пользоваться»).

Настройка

Значения берутся из config/defaults.conf:

Переменная Значения По умолчанию На что влияет Когда менять
MINIO_DATA_DIR путь /var/lib/minio где физически хранятся bucket'ы и объекты если данные должны лежать на отдельном большом/быстром диске
MINIO_PORT номер порта 9000 порт S3 API (endpoint приложений) при конфликте порта с другой службой
MINIO_CONSOLE_PORT номер порта 9001 порт веб-консоли при конфликте порта

Как переопределить настройки

  1. Экспорт перед установкой (флаг -E сохраняет переменные при sudo):
    MINIO_DATA_DIR=/mnt/data/minio MINIO_PORT=9000 sudo -E ./install.sh
    
  2. Правка config/defaults.conf — измените строки MINIO_DATA_DIR, MINIO_PORT, MINIO_CONSOLE_PORT и запустите установку.
  3. После установки порты можно поменять в /etc/default/minio (строка MINIO_OPTS) и перезапустить: sudo systemctl restart minio. Учтите, что смена каталога данных на уже заполненном хранилище требует переноса данных вручную.

Как пользоваться

S3-эндпоинт (порт 9000) и консоль (порт 9001)

Создать bucket через mc

mc — это официальный консольный клиент MinIO. Настройте «алиас» на локальный сервер и создайте bucket:

# установка клиента (один раз)
sudo curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc
sudo chmod +x /usr/local/bin/mc

# алиас 'local' на локальный MinIO (пароль — из /root/.mitdev-credentials)
mc alias set local http://127.0.0.1:9000 minioadmin <root-пароль>

# создать bucket
mc mb local/uploads

# проверить и загрузить файл
mc ls local
echo "hello" > /tmp/test.txt && mc cp /tmp/test.txt local/uploads/

Доступ из приложения (отдельные ключи вместо root)

В продакшене приложению выдают не root-аккаунт, а собственную пару ключей (access key — «логин», secret key — «пароль») с доступом только к нужному bucket:

# создать пользователя-приложение
mc admin user add local appkey 'секретный-ключ-приложения'
# дать ему право чтения/записи (готовая политика readwrite)
mc admin policy attach local readwrite --user appkey

В приложении затем укажите:

Пример (Node.js, @aws-sdk/client-s3 или minio):

const { Client } = require('minio');
const s3 = new Client({
  endPoint: '127.0.0.1', port: 9000, useSSL: false,
  accessKey: 'appkey', secretKey: 'секретный-ключ-приложения',
});

Проверка, что всё работает

module_verify считает модуль успешным, если служба minio активна и отвечает на health-check http://127.0.0.1:9000/minio/health/live.

Ручные проверки:

# служба запущена
systemctl status minio

# health-check живости (должен вернуть HTTP 200)
curl -fsS http://127.0.0.1:9000/minio/health/live && echo OK

# каталог данных и его владелец
ls -ld /var/lib/minio

# общая диагностика mitdev
sudo mitdev doctor

Типовые задачи

Частые ошибки

Симптом Причина Что сделать
Установка прервалась: «неподдерживаемая архитектура» не amd64 и не arm64 MinIO ставится только на x86_64/aarch64
Служба не стартовала, health-check не проходит занят порт 9000, нет прав на каталог данных, повреждён бинарник journalctl -u minio -n 50; проверьте порт (ss -ltnp) и владельца /var/lib/minio
Консоль 9001 не открывается в браузере порт слушает только localhost откройте через SSH-туннель, наружу не публикуйте
Приложение получает SignatureDoesNotMatch неверный secret key или рассинхрон времени сверьте ключи; проверьте время сервера (timedatectl)
В распределённом режиме «нет кворума» ещё не поднялись остальные узлы набора дождитесь запуска большинства узлов; проверьте приватную сеть и порт 9000 между ними

Безопасность и продакшен

Модуль уже закрывает: служба работает от системного пользователя minio-user (не root), файл с паролем /etc/default/minio имеет права 600, systemd-юнит усилен директивами — NoNewPrivileges=true (процесс не может повысить привилегии), ProtectSystem=full (файловая система смонтирована почти вся только для чтения), ProtectHome=true (нет доступа к /home), PrivateTmp=true (изолированный /tmp). Порты по умолчанию не открыты наружу.

Остаётся на клиенте:

Откат и удаление

См. также