Установка и защита MinIO на Ubuntu 20.04
MinIO — совместимый с S3 объектный хранилище, которое легко развернуть на Ubuntu 20.04. В этой инструкции шаг за шагом показано, как установить сервер MinIO, подготовить диск, настроить системный сервис, получить сертификат Let’s Encrypt, подключить клиент mc и обеспечить базовую безопасность и эксплуатацию.
Введение

Объектное хранилище — это способ сохранения и извлечения неструктурированных блобов данных и метаданных через HTTP API. В отличие от классического хранения файлов, где данные разбиваются на блоки и помещаются в файловую систему, здесь мы работаем с целыми объектами, которые хранятся и обслуживаются по сети. Объект может быть изображением, видео, логом, HTML-файлом, бэкапом, образом контейнера или любым самостоятельным бинарным блоком. Объекты называют неструктурированными, потому что они не подчинены единой схеме или формату.
MinIO — популярный open-source сервер для объектного хранения, совместимый с Amazon S3. Он написан на Go, распространяется как кроссплатформенный бинарный файл, имеет клиентские утилиты и веб-интерфейс. В этом руководстве вы установите MinIO на Ubuntu 20.04, защитите доступ сертификатом от Let’s Encrypt и подключитесь к серверу с помощью командного клиента.
Важно. В примерах используется домен minio.example.com и порты по умолчанию 9000 (API) и 9001 (консоль). Перед началом замените домен и IP на реальные значения вашей инфраструктуры.
Основные понятия в одну строку
- Объект: самостоятельный бинарный файл + метаданные.
- Bucket (корзина): логическая коллекция объектов в MinIO.
- mc: клиент командной строки для MinIO.
- Консоль: веб-интерфейс управления MinIO (порт 9001).
Содержание
- Предварительные требования
- Шаг 1 — Установка MinIO
- Шаг 2 — Подготовка диска для хранения
- Шаг 3 — Конфигурация MinIO
- Шаг 4 — Установка systemd-сервиса
- Шаг 5 — Запуск сервера MinIO
- Шаг 6 — Настройка SSL от Let’s Encrypt
- Шаг 7 — Работа с консолью и создание бакетов
- Шаг 8 — Установка клиента mc и базовые команды
- Безопасность и hardening
- Резервное копирование и мониторинг
- Критерии приёмки
- Руководства и чек-листы для ролей
- Три распространённых проблемы и устранение
- Когда MinIO не подходит и альтернативы
- FAQ
- Итог
Предварительные требования
- Сервер с Ubuntu 20.04 с пользователем, имеющим sudo-привилегии (не запускать MinIO под root).
- Доменное имя, указывающее на сервер, например minio.example.com.
- Дополнительный Ubuntu 20.04 для клиента (или рабочая станция с доступом к сети).
- Обновлённая система:
$ sudo apt update- Установленные утилиты (если некоторых нет, установите):
$ sudo apt install wget curl nano ufw software-properties-common apt-transport-https ca-certificates -yНекоторые пакеты могут быть уже установлены на вашей системе.
Шаг 1 — Установка MinIO
MinIO поставляется как один исполняемый файл. Скачайте бинарник с официального сайта:
$ wget https://dl.min.io/server/minio/release/linux-amd64/minioСделайте файл исполняемым:
$ chmod +x minioПереместите бинарник в системный каталог:
$ sudo mv minio /usr/local/binПроверьте установку:
$ minio --version
minio version RELEASE.2022-01-28T02-28-16ZЕсли версия отображается — установка прошла успешно.
Шаг 2 — Подготовка диска для хранения
Для объектного хранилища рекомендуется выделить отдельный блочный диск или раздел. В примере используется второй диск /dev/sdb и точка монтирования /data.
Посмотрите список блочных устройств:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
??sda1 8:1 0 50G 0 part /
sdb 8:16 0 50G 0 diskУстановите parted для работы с разделами:
$ sudo apt install partedСоздайте GPT-таблицу и один раздел на /dev/sdb, отформатируйте ext4 и добавьте в /etc/fstab:
$ sudo parted -s -a optimal -- /dev/sdb mklabel gpt
$ sudo parted -s -a optimal -- /dev/sdb mkpart primary 0% 100%
$ sudo parted -s -- /dev/sdb align-check optimal 1
$ sudo mkfs.ext4 /dev/sdb1
$ echo "/dev/sdb1 /data ext4 defaults 0 0" | sudo tee -a /etc/fstab
$ sudo mkdir /data
$ sudo mount -aСовет. Для production окружений рассмотрите RAID, LVM или сетевые тома (EBS, Cinder) с репликацией, чтобы исключить единичную точку отказа.
Шаг 3 — Конфигурация MinIO
MinIO не должен работать под root-пользователем. Создадим системного пользователя minio-user:
$ sudo useradd -r minio-user -s /sbin/nologinИзменим владельца бинарника и каталога данных:
$ sudo chown minio-user:minio-user /usr/local/bin/minio
$ sudo chown minio-user:minio-user /data -RСоздайте каталог для конфигурации:
$ sudo mkdir /etc/minio
$ sudo chown minio-user:minio-user /etc/minioСоздайте файл окружения /etc/default/minio и добавьте переменные по умолчанию:
$ sudo nano /etc/default/minioВставьте:
MINIO_ROOT_USER="minio"
MINIO_VOLUMES="/data"
MINIO_OPTS="-C /etc/minio --address your_server_ip:9000 --console-address :9001"
MINIO_ROOT_PASSWORD="miniostorage"Пояснения:
- MINIO_ROOT_USER: access key (минимум 3 символа).
- MINIO_VOLUMES: директория(и) с данными.
- MINIO_OPTS: дополнительные опции сервера; замените your_server_ip на IP сервера или оставьте пустым, если хотите биндинг на все адреса.
- MINIO_ROOT_PASSWORD: секретный ключ (минимум 8 символов). Используйте сложный пароль или интеграцию с секретным хранилищем.
Сохраните файл (Ctrl+X, Y).
Важно. Не храните пароли в открытом виде в общедоступных репозиториях. Для production используйте HashiCorp Vault или KMS.
Шаг 4 — Установка systemd-сервиса
Скачайте готовый unit-файл:
$ curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.serviceОткройте и проверьте содержимое:
$ nano minio.serviceСодержимое (проверьте перед применением):
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local/
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${project.name})Переместите файл и перезагрузите демон systemd:
$ sudo mv minio.service /etc/systemd/system
$ sudo systemctl daemon-reload
$ sudo systemctl enable minioШаг 5 — Запуск сервера MinIO
Запустите сервис и проверьте статус:
$ sudo systemctl start minio
$ sudo systemctl status minioПример вывода статуса показывает, что MinIO активен и использует /data:
? minio.service - MinIO
Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-02-01 13:30:44 UTC; 5s ago
Docs: https://docs.min.io
Main PID: 26076 (minio)
Tasks: 6
Memory: 55.3M
CGroup: /system.slice/minio.service
??26076 /usr/local/bin/minio server -C /etc/minio --address 209.208.26.129:9000 --console-address :9001 /dataОткройте порты в UFW (если включён):
$ sudo ufw allow 9000
$ sudo ufw allow 9001
$ sudo ufw enableЗатем откройте в браузере http://your_server_ip:9001, чтобы увидеть веб-консоль.

Шаг 6 — Защита MinIO с помощью SSL
Для работы по HTTPS используем бесплатные сертификаты Let’s Encrypt и certbot. Установим snapd и certbot:
$ sudo apt install snapd
$ sudo snap install core
$ sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotПолучим сертификат в standalone-режиме (порт 80 должен быть доступен):
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d minio.example.comСертификаты будут в /etc/letsencrypt/live/minio.example.com. Копируем приватный и публичный ключи в /etc/minio/certs и устанавливаем владельца:
$ sudo mkdir -p /etc/minio/certs
$ sudo cp /etc/letsencrypt/live/minio.example.com/privkey.pem /etc/minio/certs/private.key
$ sudo cp /etc/letsencrypt/live/minio.example.com/fullchain.pem /etc/minio/certs/public.crt
$ sudo chown minio-user:minio-user /etc/minio/certs/private.key
$ sudo chown minio-user:minio-user /etc/minio/certs/public.crtРазрешите HTTP/HTTPS в файрволе:
$ sudo ufw allow 80
$ sudo ufw allow 443Добавьте URL сервера в /etc/default/minio:
$ sudo nano /etc/default/minioИ в конец добавьте:
MINIO_SERVER_URL="https://minio.example.com:9000"Перезапустите сервис:
$ sudo systemctl restart minioТеперь консоль доступна по https://minio.example.com:9001.
Шаг 7 — Подключение к консоли и создание бакетов
Войдите в веб-консоль, используя MINIO_ROOT_USER и MINIO_ROOT_PASSWORD. После входа вы увидите панель управления.

Нажмите Create Bucket, чтобы создать первый бакет.

Если MinIO запущен на одном диске, некоторые возможности кластера недоступны. Введите имя бакета и нажмите Create Bucket. После создания вы увидите список бакетов.

Для загрузки файлов нажмите Browse, затем Upload Files и выберите файлы на вашей машине.


После загрузки очистите очередь загрузки, если нужно.

Теперь у вас есть бакет и загруженные объекты.
Шаг 8 — Установка клиента mc и доступ к файлам
На отдельной машине скачайте mc (MinIO Client):
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc
$ sudo mv mc /usr/local/bin
$ mc --version
mc version RELEASE.2022-02-02T02-03-24ZДобавьте алиас для сервера:
$ mc alias set howtoforge https://minio.example.com:9000 minio miniostorageПример вывода при успешной настройке:
mc: Configuration written to `/home//.mc/config.json`. Please update your access credentials.
Added `howtoforge` successfully. Проверка состояния сервера:
$ mc admin info howtoforge
? minio.example.com:9000
Uptime: 2 minutes
Version: 2022-01-28T02:28:16Z
Network: 1/1 OK
9.6 MiB Used, 1 Bucket, 5 ObjectsСписок бакетов:
$ mc ls howtoforge
[2022-02-01 16:59:46 UTC] 0B howtoforge/Список объектов в бакете:
$ mc ls howtoforge/howtoforge
[2022-02-02 05:32:28 UTC] 2.9MiB STANDARD IMG_20160717_184947_HDR.jpg
[2022-02-02 05:32:00 UTC] 2.2MiB STANDARD IMG_20160903_220639_HDR.jpg
[2022-02-02 05:28:25 UTC] 2.4MiB STANDARD IMG_20161006_213936_HDR.jpg
[2022-02-02 05:28:07 UTC] 2.2MiB STANDARD IMG_20161015_194409_HDR.jpg
[2022-02-02 03:33:28 UTC] 25KiB STANDARD quarantine.jpgСоздание нового бакета и загрузка файла:
$ mc mb howtoforge/bucket2
$ touch test.txt
$ mc cp test.txt howtoforge/bucket2
$ mc ls howtoforge/bucket2
[2022-02-02 07:06:44 UTC] 0B STANDARD test.txtВы можете просмотреть справку по mc:
$ mc --helpБезопасность и hardening
Ключевые меры для повышения безопасности MinIO:
- Используйте TLS везде. Сертификаты должны быть валидными и автоматически обновляться (Certbot, ACME).
- Не храните root-пароли в открытом виде. Интегрируйте с секретным хранилищем или системой управления ключами.
- Настройте межсетевой экран и доступ по IP/cidr только для доверенных хостов.
- В production используйте TLS-терминацию на обратном прокси (Nginx/HAProxy) с дополнительными проверками и rate-limiting.
- Регулярно обновляйте MinIO и mc до актуальных релизов.
- Включите аудит и логирование — MinIO поддерживает события и нотификации (Kafka, NATS, webhook).
- Ограничьте права пользователя, используйте IAM-политики MinIO или интеграцию с внешним провайдером аутентификации.
- Защитите приватные ключи и сертификаты через права доступа и SELinux/AppArmor при возможности.
Пример конфигурации обратного прокси на nginx (основы):
server {
listen 443 ssl http2;
server_name minio.example.com;
ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Примечание. Если вы используете прокси, корректно настройте MINIO_SERVER_URL и прокидывайте заголовки.
Резервное копирование и мониторинг
Рекомендации:
- Регулярно синхронизируйте важные бакеты в удалённое хранилище (mc mirror, cron, репликация на уровне сервера).
- Настройте мониторинг метрик MinIO (Prometheus экспортёр) и оповещения при превышении SLO/threshold.
- Периодическое тестирование восстановления (restore) — проверяйте процедуру резервного копирования на избранных файлах.
Пример команды синхронизации локального бакета с удалённым:
$ mc mirror /local/path howtoforge/backup-bucketКритерии приёмки
- MinIO сервис запущен и активен: systemctl status minio -> active (running).
- Консоль доступна по HTTPS: https://minio.example.com:9001.
- Mc может подключиться и аутентифицироваться: mc ls howtoforge возвращает список бакетов.
- Сертификат валиден и не вызывает предупреждений браузера.
- Каталог данных /data корректно смонтирован и принадлежит minio-user.
Руководства и чек-листы для ролей
Администратор системы — чек-лист при развертывании:
- Подготовить сервер и сеть, установить Ubuntu 20.04.
- Закупить/подключить дополнительный диск для хранения данных.
- Установить MinIO и настроить systemd unit.
- Настроить TLS и автоматическое обновление сертификатов.
- Настроить мониторинг и бэкапы.
- Провести тесты производительности и восстановления.
DevOps — оперативный чек-лист для деплоймента:
- Автоматизировать установку через Ansible/Terraform.
- Интегрировать секреты в Vault.
- Настроить CI/CD для обновлений MinIO и mc.
Оператор — runbook при инциденте:
- Шаг 1: Проверить статус systemd: sudo systemctl status minio.
- Шаг 2: Посмотреть логи: sudo journalctl -u minio -n 200.
- Шаг 3: Проверить диск: df -h /data, lsblk.
- Шаг 4: Если сертификат истёк, обновить certbot: sudo certbot renew и перезапустить minio.
- Шаг 5: При проблемах с доступом — временно включить debug в mc (mc –debug).
Три распространённых проблемы и их решения
MinIO не запускается: проверьте права на /etc/minio и /data; убедитесь, что MINIO_VOLUMES задан.
Сертификат Let’s Encrypt не получается получить: проверьте, доступен ли порт 80 (firewall), и что DNS A/AAAA указывает на ваш сервер.
Клиент mc не может подключиться по HTTPS: используйте флаг –insecure для отладки, но в production устраняйте проблему с сертификатом.
Когда MinIO не подходит и альтернативы
MinIO хорошо подходит для объектного хранения в случаях, когда нужна совместимость с S3 и высокая скорость. Однако бывают сценарии, когда стоит рассмотреть другие варианты:
- Нужна встроенная многоузловая репликация и автоматическое распределение данных на аппаратном уровне в рамках облачного провайдера — рассмотрите S3, Azure Blob Storage или Google Cloud Storage.
- Требуется POSIX-совместимая файловая система и операции с блоками — используйте NFS, CephFS или GlusterFS.
- Нужен единый кластер с глубокой интеграцией в провайдера — лучше использовать managed-решение облачного провайдера.
Сравнение кратко:
- MinIO: лёгкая установка, S3-совместимость, подходит для self-hosted.
- Amazon S3: управляемый сервис, масштабируемость, SLA и интеграции.
- Ceph: глубоко распределённая система, сложнее в эксплуатации, но даёт масштаб и POSIX-интерфейсы.
Мини-методология развертывания
- Подготовить инфраструктуру (серверы, диск, DNS).
- Автоматически установить MinIO через конфигурационные инструменты.
- Настроить TLS и прокси при необходимости.
- Настроить бэкапы и мониторинг.
- Выполнить тесты работоспособности и восстановления.
- Перевести в режим поддержки и обновлений.
Decision flowchart (Mermaid)
flowchart TD
A[Начало: нужно объектное хранилище?] --> B{Требуется S3-совместимость?}
B -- Да --> C[Рассмотреть MinIO]
B -- Нет --> D[Рассмотреть другие решения]
C --> E{Self-host или managed?}
E -- Self-host --> F[Развернуть MinIO на Ubuntu]
E -- Managed --> G[Использовать S3/облачное хранилище]
F --> H{Нужна TLS?}
H -- Да --> I[Настроить Certbot/прокси]
H -- Нет --> J[Рассмотреть риски]
I --> K[Включить мониторинг и бэкапы]
K --> L[Готово]Шаблон проверки приёмки (SOP)
- Выполнить установку по шагам 1–5.
- Подтвердить доступность консоли по HTTPS.
- Создать тестовый бакет и загрузить тестовый файл.
- Сделать резервную копию данных и восстановить её на тестовом окружении.
- Выполнить нагрузочное тестирование (простые объекты и параллельные загрузки).
Советы по производительности
- Для ускорения операций PUT/GET используйте SSD-диски.
- Разбейте объекты по бакетам и применяйте подходы batched-upload для больших объёмов.
- Минимизируйте латентность сети между приложениями и MinIO (размещайте в том же регионе/subnet).
Локальные альтернативы и подводные камни
- При развертывании на виртуальных дисках проверьте IOPS и throughput, чтобы избежать «узкого места».
- Если используются контейнеры (Docker/Kubernetes), применяйте StatefulSets и PersistentVolumes, а не хостовые тома без репликации.
FAQ
Q: Нужен ли обратный прокси для MinIO?
A: Не обязателен, но обратный прокси (Nginx/HAProxy) позволяет централизовать TLS-терминацию, управление доступом и rate-limiting.
Q: Как автоматизировать обновление сертификатов Let’s Encrypt?
A: Настройте cron job для команды sudo certbot renew и перезагрузки сервиса minio после успешного обновления.
Q: Можно ли использовать MinIO в режиме распределённого кластера?
A: Да, MinIO поддерживает распределённый режим (Erasure Coding), но это требует нескольких хостов/дисков и иной конфигурации, не охваченной в этой инструкции.
Итог
Вы установили MinIO на Ubuntu 20.04, подготовили диск, создали systemd-сервис, настроили TLS через Let’s Encrypt и подключили клиент mc для управления объектами. Дополнительно рассмотрены практики безопасности, резервного копирования, мониторинга, а также чек-листы и runbook для эксплуатации. Следующие шаги: автоматизация развёртывания (Ansible/Terraform), интеграция с секретами и масштабирование в распределённый режим при необходимости.
Если нужны примеры Ansible-плейбуков, конфигурации для k8s или шаблоны для мониторинга Prometheus — напишите задачу, и я подготовлю их.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента