﻿# Кластер MinIO

> [HTML Version](minio-cluster.html)

В статье рассматривается пример развёртывания MinIO в качестве объектного хранилища S3 для программного комплекса ELMA365.

````
Начало внимание

````
Рекомендуем использовать решение [SeaweedFS](seaweedfs-cluster.md) в качестве S3‑хранилища, т. к. MinIO переведён в режим ограниченной поддержки с декабря 2025 г. Подробнее читайте в [официальной информации от MinIO](https://github.com/minio/minio/commit/27742d469462e1561c776f88ca7a1f26816d69e2).

````
Конец внимание

````


Рекомендуемой топологией MinIO для ELMA365 является [Multi-Node Multi-Drive](https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html) (MNMD) или Distributed/Распределённая конфигурация.

MinIO в конфигурации MNMD поддерживает [erasure coding](https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html#minio-ec-parity). Это позволяет допустить потерю до половины узлов или дисков в кластере, при этом продолжая обслуживать операции чтения. Используйте калькулятор [Erasure Code Calculator](https://min.io/product/erasure-code-calculator?ref=docs) при планировании и проектировании кластера MinIO.

Минимальная конфигурация MNMD, поддерживающая [erasure coding](https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html#minio-ec-parity), состоит из четырёх нод (серверов) по четыре диска в каждой. Соберите ноды в один **server pool**, при этом в MinIO нужно: 

- использовать последовательно пронумерованные имена хостов;

- использовать нотации расширения \[OBJECT\] для обозначения последовательного ряда хостов при создании пула серверов; 

- использовать нотации расширения \[OBJECT\] для обозначения последовательного ряда дисков; 

- чтобы порядок физических дисков оставался постоянным при перезапусках, чтобы заданная точка монтирования всегда указывала на один и тот же отформатированный диск.

Установка состоит из нескольких этапов:

1. [Подготовка нод (серверов)](#preparation-node).

2. [Подготовка дисков](#preparation-disk).

3. [Установка MinIO](#installation-minlo).

4. [Установка MinIO Client](#installation-minlo-client).

5. [Создание пользователя и группы minio-user](#creation-user-group).

6. [Создание файла сервиса для systemd](#creation-file-systemd).

7. [Создание файла окружения для MinIO](#creation-file-minlo).

8. [Запуск сервиса MinIO](#service-start-minlo).

9. [Настройка подключения к MinIO](#connection-setup-minlo).

10. [Создание бакета](#creation-bucket).

11. [Настройка CORS](#cors).

12. [Конфигурация HAProxy (блок s3minio)](#config-haproxy).

13. [Подключение к MinIO в ELMA365](#connection).

## Шаг 1. Подготовка нод (серверов) 

Создайте четыре ноды (сервера) с последовательно пронумерованными именами хостов:

- **minio1.example.com**;

- **minio2.example.com**;

- **minio3.example.com**;

- **minio4.example.com**. 

Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в \[OBJECT\].

## Шаг 2. Подготовка дисков

1. На каждой ноде создайте четыре каталога для монтирования четырёх дисков:

````
sudo mkdir -p /var/lib/minio/data1  
sudo mkdir -p /var/lib/minio/data2  
sudo mkdir -p /var/lib/minio/data3  
sudo mkdir -p /var/lib/minio/data4

````
Для обеспечения лучшей производительности используйте файловую систему XFS. В MinIO не различаются типы дисков и не используются смешанные типы хранилищ, поэтому на всех нодах должен использоваться одинаковый тип дисков (NVMe, SSD или HDD) с одинаковой ёмкостью, например, N ТБ. 

````
Начало внимание 

````
В MinIO ограничивается размер используемого диска до самого маленького диска в развёртывании. Например, если в развёртывании есть 15 дисков по 10 ТБ и 1 диск по 1 ТБ, в MinIO ёмкость каждого диска ограничится до 1 ТБ.

````
Конец внимание

2. ````
На каждой ноде подготовьте на дисках файловую систему XFS:

````
sudo mkfs.xfs /dev/sdb -L DISK1  
sudo mkfs.xfs /dev/sdc -L DISK2  
sudo mkfs.xfs /dev/sdd -L DISK3  
sudo mkfs.xfs /dev/sde -L DISK4

3. ````
На каждой ноде добавьте точки монтирования четырёх дисков в файле \[OBJECT\]:

````
LABEL=DISK1      /var/lib/minio/data1     xfs     defaults,noatime  0       2  
LABEL=DISK2      /var/lib/minio/data2     xfs     defaults,noatime  0       2  
LABEL=DISK3      /var/lib/minio/data3     xfs     defaults,noatime  0       2  
LABEL=DISK4      /var/lib/minio/data4     xfs     defaults,noatime  0       2

4. ````
Проверьте монтирование ранее подготовленных дисков:

````
sudo mount -av

## ````
Шаг 3. Установка MinIO

На каждой ноде загрузите последний стабильный binary-файл MinIO и установите его в систему:

````
wget https://dl.min.io/server/minio/release/linux-amd64/minio  
chmod +x minio  
sudo mv minio /usr/local/bin/

## ````
Шаг 4. Установка MinIO Client

На ноде **minio1.example.com** загрузите последний стабильный binary-файл [MinIO Client](https://min.io/docs/minio/linux/reference/minio-mc.html) и установите его в систему:

````
wget https://dl.min.io/client/mc/release/linux-amd64/mc  
chmod +x mc  
sudo mv mc /usr/local/bin/

## ````
Шаг 5. Создание пользователя и группы minio-user

1. На каждой ноде создайте пользователя и группу **minio-user**:

````
sudo groupadd -r minio-user  
sudo useradd -M -r -g minio-user minio-user

2. ````
На каждой ноде cоздайте директории для хранения TLS сертификатов, выполнив команду:

````
sudo mkdir -p /etc/minio/certs/CAs

3. ````
На каждой ноде задайте разрешения на доступ к каталогам, предназначенным для использования в MinIO:

````
sudo chown -R minio-user:minio-user /etc/minio  
sudo chown -R minio-user:minio-user /var/lib/minio

## ````
Шаг 6. Создание файла сервиса для systemd

1. На каждой ноде загрузите официальный файл сервиса MinIO:

````
sudo curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service

2. ````
Проверьте содержимое \[OBJECT\] перед его использованием и переместите этот файл в каталог конфигурации \[OBJECT\]:

````
sudo mv minio.service /etc/systemd/system

Начало внимание 

````
На этом шаге не запускайте \[OBJECT\]. 

````
Конец внимание 

## ````
Шаг 7. Создание файла окружения для MinIO

На каждой ноде создайте файл окружения в \[OBJECT\]. Служба MinIO использует этот файл в качестве источника всех переменных окружения, используемых MinIO и файлом \[OBJECT\]. 

Пример файла окружения в \[OBJECT\]: 

````
\# Set the hosts and volumes MinIO uses at startup  
\# The command uses MinIO expansion notation \{x...y\} to denote a  
\# sequential series.  
  
\# The following example covers four MinIO hosts  
\# with4 drives each at the specified hostname and drive locations.  
\# The command includes the port that each MinIO server listens on  
\# (default 9000)  
  
MINIO\_VOLUMES="http://minio-server\{1...4\}.your\_domain:9000/var/lib/minio/data\{1...4\}/minio"  
  
\# Set all MinIO server options  
  
\# The following explicitly sets the MinIO Console listen address to  
\# port 9001 on all network interfaces. The default behavior is dynamic  
\# port selection.  
  
MINIO\_OPTS="--certs-dir /etc/minio/certs --console-address :9001"  
  
MINIO\_REGION="ru-central-1"  
  
\# Set the root username. This user has unrestricted permissions to  
\# perform S3 and administrative API operations on any resource in the  
\# deployment.  
  
\# Defer to your organizations requirements for superadmin user name.  
  
MINIO\_ROOT\_USER=elma365user  
  
\# Set the root password  
  
\# Use a long, random, unique string that meets your organizations  
\# requirements for passwords.  
  
MINIO\_ROOT\_PASSWORD=SecretPassword  
  
\# Set to the URL of the load balancer for the MinIO deployment  
\# This value \*must\* match across all MinIO servers. If you do  
\# not have a load balancer, set this value to to any \*one\* of the  
\# MinIO hosts in the deployment as a temporary measure.  
  
\# MINIO\_SERVER\_URL="https://minio.example:9000"

- ````
\[OBJECT\]

	- \[OBJECT\] — ноды, объединённые в единый пул с нотацией расширения \[OBJECT\]; 

	- \[OBJECT\] — порт подключения; 

	- \[OBJECT\] — последовательный ряд дисков с нотацией расширения \[OBJECT\]; 

- \[OBJECT\] — имя пользователя администратора MinIO;

- \[OBJECT\] — пароль, в котором рекомендуется использовать не менее 16 символов.

Настройка включения TLS в MinIO

  
Для включения поддержки TLS в MinIO нужно на каждой ноде:

1. В файле окружения \[OBJECT\] изменить протокол с HTTP на HTTPS в параметре \[OBJECT\].

2. Положить файл сертификата и файл закрытого ключа в каталог** **\[OBJECT\].  
  
Все ноды имеют уникальные доменные имена. Сертификаты должны быть выпущены для каждой ноды индивидуально.

3. Переименовать файл сертификата сервера в \[OBJECT\].

4. Переименовать файл закрытого ключа в \[OBJECT\].

5. При использовании самоподписанных сертификатов положить файл корневого CA в каталог \[OBJECT\].

Подробнее о настройке TLS в MinIO читайте в официальной документации [MinIO](https://min.io/docs/minio/linux/operations/network-encryption.html).

## Шаг 8. Запуск сервиса MinIO

1. Выполните следующие команды на каждой ноде, чтобы запустить службу MinIO:

````
sudo systemctl daemon-reload  
sudo systemctl enable minio.service  
sudo systemctl start minio.service

2. ````
Убедитесь в том, что сервис minio запустился и работает без ошибок:

````
sudo systemctl status minio.service  
journalctl -f -u minio.service

## ````
Шаг 9. Настройка подключения к MinIO

Создайте \[OBJECT\] для minio на ноде **minio-server1.your\_domain**:

````
/usr/local/bin/mc alias set minio http://minio-server1.your\_domain:9000 elma365user SecretPassword

## ````
Шаг 10. Создание бакета

**Важно**: наименование бакета в S3 должно соответствовать формату \[OBJECT\].

````
начало примера

````
Примеры наименований для бакетов

1. \[OBJECT\].

2. \[OBJECT\].

3. \[OBJECT\].

````
конец примера

````
Чтобы создать для работы ELMA365 бакет c наименованием \[OBJECT\], используйте команду на ноде **minio-server1.your\_domain**:

````
/usr/local/bin/mc mb -p minio/s3elma365 --region=ru-central-1

````
Создание в S3 бакетов для работы ELMA Bot

  
Если вы планируете использовать [ELMA Bot](elma-bot.md), создайте бакеты:

- \[OBJECT\];

- \[OBJECT\];

- \[OBJECT\].

Для создания бакетов выполните следующие команды на ноде **minio-server1.your\_domain**:

````
  
/usr/local/bin/mc mb -p minio/s3elmabot --region=ru-central-1  
/usr/local/bin/mc mb -p minio/elmabot-temporary-files --region=ru-central-1  
/usr/local/bin/mc mb -p minio/elmabot-static-files --region=ru-central-1
````

## ````
Шаг 11. Настройка CORS

**Cross-Origin Resource Sharing (CORS)** — это инструмент, с помощью которого ограничивается доступ к ресурсам веб-приложения из сторонних доменов. Вы можете определить список доменов, с которых разрешено направлять запросы к приложению ELMA365, а также указать доступные заголовки и методы HTTP. 

Настройте CORS одним из способов:

1. [С помощью файла с конфигурацией CORS](#cors-file).

2. [Через веб-интерфейс сервиса для управления данными](#cors-via-service), например Yandex Object Storage.

### Задать настройки CORS в конфигурационном файле

1. Создайте файл \[OBJECT\] с конфигурацией CORS, например:

````
<?xml version="1.0" encoding="UTF-8"?>  
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">  
<CORSRule>  
<AllowedHeader>\*</AllowedHeader>  
<AllowedMethod>GET</AllowedMethod>  
<AllowedMethod>PUT</AllowedMethod>  
<AllowedMethod>HEAD</AllowedMethod>  
<AllowedMethod>POST</AllowedMethod>  
<AllowedMethod>DELETE</AllowedMethod>  
<AllowedOrigin>https://\*.elma365.ru</AllowedOrigin>  
<MaxAgeSeconds>3000</MaxAgeSeconds>  
</CORSRule>  
</CORSConfiguration>

````
Где: 

- \[OBJECT\] — заголовки, которые доступны в запросах. Чтобы разрешить все заголовки, используйте символ \[OBJECT\];

- \[OBJECT\] — разрешённые методы HTTP, например \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\];

- \[OBJECT\] — источники, из которых можно обращаться к ресурсам веб-приложения. Чтобы разрешить доступ с любых доменов, используйте символ \[OBJECT\]. Для повышения безопасности рекомендуется указать определённые домены, например **https://\*.elma365.ru**;

- \[OBJECT\] — для уменьшения количества запросов и улучшения производительности можно сохранять в кеше браузера разрешение на запросы из определённого источника. Оно проверяется в предварительном запросе, который выполняется перед основным. Укажите время в секундах, в течение которого разрешение хранится в кеше и новые предварительные запросы не отправляются.

Вы также можете задать в конфигурации CORS параметр \[OBJECT\]. В нём определяются заголовки, которые отображаются в ответах на запросы. Не указывайте этот параметр в **.xml**-файле, если заголовки в ответах показывать не нужно.

2. Примените настройки CORS к бакету с помощью команды:

````
/usr/local/bin/mc cors set minio/s3elma365 cors.xml

3. ````
Убедитесь, что настройки CORS применены правильно, выполнив команду:

````
/usr/local/bin/mc cors get minio/s3elma365 --json

### ````
Задать конфигурацию CORS через сервис управления данными

Вы можете настроить CORS через веб-интерфейс сервиса для управления данными.

Пример заполнения параметров CORS в Yandex Object Storage:

**(configure-minio-1.png)**

Подробнее о том, как настроить CORS читайте в [официальной документации Yandex Cloud](https://yandex.cloud/ru/docs/storage/operations/buckets/cors).

## Шаг 12. Конфигурация HAProxy (блок s3minio)

В рамках статьи пользовательский трафик приходит в HAProxy по \[OBJECT\] и равномерно балансируется между нодами кластера MinIO.

Балансировку нагрузки между нодами кластера MinIO осуществите с помощью HAProxy. Настройте его согласно статье [«Конфигурация HAProxy для S3 Minio»](haproxy-s3-minio.md).

## Шаг 13. Подключение к ELMA365

Параметры для подключения к MinIO:

- **address** — \[OBJECT\];

- **bucket** — \[OBJECT\];

- **region** — \[OBJECT\];

- **access key ID** — \[OBJECT\];

- **secret access key** — \[OBJECT\];

- **upload method** — \[OBJECT\];

- **enable SSL** — \[OBJECT\].

При подключении MinIO с использованием TLS укажите в **enable SSL **значение \[OBJECT\].