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'ами вручную).
Когда включать и когда не нужен
- Включайте, если приложению нужно хранить файлы через S3-совместимый API, либо вы хотите держать бэкапы/артефакты в объектном хранилище на своём сервере.
- Не нужен, если файлов немного и они спокойно лежат на диске, либо вы уже используете внешнее облако (Amazon S3, Yandex Object Storage и т. п.).
- Для отказоустойчивого хранилища одного узла недостаточно — соберите распределённый набор из нескольких серверов командой
mitdev minio cluster-init(см. «Как пользоваться»).
Зависимости и требования
- Отдельных модулей mitdev не требует.
- Нужен доступ в интернет: бинарник скачивается напрямую с
https://dl.min.io. - Поддерживаемые архитектуры:
x86_64(amd64) иaarch64(arm64). На других установка прервётся с ошибкой. - Для распределённого режима — приватная сеть между узлами и рекомендуется ≥ 4 узла (для erasure coding — см. ниже).
Что именно делает
Пошагово, в порядке выполнения module_install:
- Создаёт системного пользователя
minio-user— без домашнего каталога и с оболочкой/usr/sbin/nologin(под ним нельзя войти в систему), чтобы служба работала не от root. - Скачивает бинарник MinIO под архитектуру сервера в
/usr/local/bin/minio, права755. Если бинарник уже есть — шаг пропускается. - Создаёт каталог данных
/var/lib/minio(переменнаяMINIO_DATA_DIR), права750, владелецminio-user. - Пишет файл окружения
/etc/default/minioс правами600(идемпотентно — существующий не перезаписывается, только обновляются порты прослушивания):MINIO_ROOT_USER=minioadmin;MINIO_ROOT_PASSWORD=<сгенерированный пароль>;MINIO_OPTS="--address :9000 --console-address :9001". Логин и пароль root сохраняются в файл учётных данных.
- Рендерит systemd-юнит
/etc/systemd/system/minio.serviceиз шаблона с директивами усиления безопасности (см. «Безопасность»). - Перечитывает systemd, включает автозапуск и запускает службу
minio. - Ждёт готовности: до 10 попыток с интервалом 2 секунды опрашивает
http://127.0.0.1:9000/minio/health/live. Если сервер так и не ответил — установка завершается ошибкой. - Отмечает модуль выполненным (
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:
/root/.mitdev-credentials(права600) — сюда сохраняются root-креды:minio: root_user=minioadmin minio: root_password=<сгенерированный пароль>/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 |
порт веб-консоли | при конфликте порта |
Как переопределить настройки
- Экспорт перед установкой (флаг
-Eсохраняет переменные приsudo):MINIO_DATA_DIR=/mnt/data/minio MINIO_PORT=9000 sudo -E ./install.sh - Правка
config/defaults.conf— измените строкиMINIO_DATA_DIR,MINIO_PORT,MINIO_CONSOLE_PORTи запустите установку. - После установки порты можно поменять в
/etc/default/minio(строкаMINIO_OPTS) и перезапустить:sudo systemctl restart minio. Учтите, что смена каталога данных на уже заполненном хранилище требует переноса данных вручную.
Как пользоваться
S3-эндпоинт (порт 9000) и консоль (порт 9001)
- Endpoint для приложений:
http://<хост>:9000— это адрес, который вы указываете в S3-клиенте. - Веб-консоль:
http://<хост>:9001— только localhost по умолчанию, открывайте через SSH-туннель:
затемssh -L 9001:127.0.0.1:9001 <пользователь>@<сервер>http://localhost:9001, логинminioadmin, пароль — из файла учётных данных.
Создать 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
В приложении затем укажите:
endpoint=http://<хост>:9000access key=appkeysecret key=секретный-ключ-приложенияregion= любой (напримерus-east-1), MinIO его игнорирует.
Пример (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
Типовые задачи
- Узнать root-пароль:
sudo grep '^minio: root_password' /root/.mitdev-credentials - Сменить root-креды (важно для продакшена): отредактируйте
MINIO_ROOT_USER/MINIO_ROOT_PASSWORDв/etc/default/minio, затем:
и обновите пароль вsudo systemctl restart minio/root/.mitdev-credentials. - Список bucket'ов:
mc ls local - Открыть bucket на публичное чтение (например, для статики сайта):
mc anonymous set download local/public - Собрать распределённый (отказоустойчивый) набор — на первом узле:
на каждом другом узле:sudo mitdev minio cluster-init <addr1> <addr2> <addr3> <addr4> # ВСЕ узлы, включая этот sudo mitdev minio token
Распределённый режим включает erasure coding (данные размазываются по узлам с избыточностью — кластер переживает отказ части узлов без потери данных). Набор задаётся при старте и не расширяется динамически.sudo mitdev minio join <токен> - Проверить состояние кластера:
sudo mitdev minio status
Частые ошибки
| Симптом | Причина | Что сделать |
|---|---|---|
| Установка прервалась: «неподдерживаемая архитектура» | не 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). Порты по умолчанию не открыты наружу.
Остаётся на клиенте:
- Смените root-креды
minioadminна свои — стандартный логин известен всем. - Приложениям выдавайте отдельные access/secret key с минимальными правами, а не root.
- Не публикуйте порты 9000/9001 в интернет напрямую. Если хранилище нужно снаружи — поставьте перед ним nginx с TLS (HTTPS) или включите TLS в самом MinIO; консоль оставьте только через туннель.
- Для сохранности данных используйте распределённый режим (
cluster-init, ≥ 4 узла) и регулярные бэкапы.
Откат и удаление
- Авто-откат при падении установки (
module_rollback): останавливает службу, удаляет юнит, файл окружения и бинарник. При переустановке поверх работавшего MinIO защита отката не даёт снести работавшую службу и удалить пользователя. mitdev remove minio: останавливает и удаляет службу, юнит,/etc/default/minio, бинарник и пользователяminio-user. Данные (/var/lib/minio— все bucket'ы и объекты) сохраняются.mitdev remove minio --purge: то же плюс удаление каталога данных — стираются все объекты. Действие необратимо.
См. также
- ../COMMANDS.md — команды
mitdev minio,mitdev doctor,mitdev remove. - ../HA.md — распределённый MinIO и отказоустойчивость.
- 15-rabbitmq.md — соседний модуль брокера сообщений.
- ../MODULES.md — краткий обзор всех модулей.