Налаштування MinIO для self-hosted S3-сумісного сховища

Зберігання великих обсягів даних у хмарі коштує дорого, а залежність від вендора заважає розвитку. Ми налаштовуємо self-hosted S3-сумісне сховище на базі MinIO, яке повністю повторює Amazon S3 API. Наша команда реалізує проєкт під ключ — від аудиту інфраструктури до розгортання distributed-кластера з erasure coding та подальшою підтримкою.
Часті запитання

Self-hosted MinIO знижує витрати на зберігання до 70% порівняно з AWS S3 при великих обсягах даних. Ми розгортаємо self-hosted S3-сумісне сховище, що повністю повторює Amazon S3 API. Наші інженери мають 5+ років досвіду з MinIO у production і розгорнули понад 50 distributed-кластерів для проєктів з навантаженням до 100 ТБ. MinIO — це не просто S3-проксі, а повноцінна система з erasure coding для відмовостійкості. У цій статті розберемо, як розгорнути MinIO на bare-metal або в Kubernetes, налаштувати TLS, політики доступу та моніторинг. Якщо вам потрібно розгорнути MinIO у production — почніть з оцінки вашої інфраструктури.

Чому distributed MinIO кращий за single-node для production?

Single-node MinIO ставиться за годину і підходить для розробки, CI/CD-кешів і невеликих проєктів. Для продакшену потрібен distributed-режим з кількома нодами: він дає відмовостійкість через erasure coding. Кластер з 4 нод з двома дисками кожна (8 дисків) витримує втрату до 4 дисків без втрати даних. Erasure coding MinIO у 2 рази економніший, ніж реплікація 3x в AWS S3, при тому ж рівні відмовостійкості. При типовому сценарії з 50 ТБ даних витрати на обладнання окупаються за 12-18 місяців, а економія порівняно з AWS S3 досягає 70%.

Параметр Single-Node Distributed (4+ нод)
Відмовостійкість Немає Erasure coding, до 50% дисків
Продуктивність Обмежена одним вузлом Лінійне масштабування
Складність розгортання 4–8 годин 2–3 дні
Підходить для Dev, CI/CD, кешування Production

Як MinIO замінює AWS S3 у self-hosted середовищі?

MinIO використовує стандартний S3 API, тому будь-які SDK (boto3, AWS SDK for PHP, Java, Go) працюють без змін. Достатньо вказати endpoint_url і use_path_style_endpoint = true для роботи через шлях (path-style). Це дозволяє перенести існуючі застосунки на self-hosted MinIO без переписування коду.

Розгортання distributed MinIO: покрокова інструкція

Крок 1: Підготовка нод і дисків

Підготуйте 4 ноди з двома додатковими дисками кожна (наприклад, NVMe по 500 ГБ). Переконайтеся, що ОС — Ubuntu 22.04 або CentOS 9. На кожній ноді створіть користувача minio-user і змонтуйте диски в /mnt/disk1 і /mnt/disk2.

Крок 2: Встановлення MinIO

Завантажте бінарник, встановіть і налаштуйте systemd unit:

Приклад systemd unit для MinIO
# Встановлення
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/
useradd -r minio-user -s /sbin/nologin
chown minio-user:minio-user /mnt/disk1 /mnt/disk2

# systemd unit
cat > /etc/systemd/system/minio.service << 'UNIT'
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local/bin/
User=minio-user
Group=minio-user
EnvironmentFile=/etc/minio/minio.env
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/minio/minio.env\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
UNIT

Крок 3: Налаштування оточення та запуск

Створіть файл /etc/minio/minio.env:

MINIO_ROOT_USER=minioadmin \
MINIO_ROOT_PASSWORD=strong-password \
MINIO_VOLUMES="https://minio{1...4}.internal:9000/mnt/disk{1...2}/minio" \
MINIO_OPTS="--console-address :9001" \
MINIO_SITE_NAME=datacenter-1

Запустіть і активуйте сервіс: systemctl start minio && systemctl enable minio.

Крок 4: TLS і безпека

Згідно з офіційною документацією MinIO, у продакшені сервер повинен працювати тільки по TLS. Розмістіть сертифікати:

mkdir -p /etc/minio/certs
cp /etc/letsencrypt/live/minio.company.com/fullchain.pem /etc/minio/certs/public.crt
cp /etc/letsencrypt/live/minio.company.com/privkey.pem /etc/minio/certs/private.key
chown minio-user: /etc/minio/certs/private.key
chmod 600 /etc/minio/certs/private.key

Для внутрішнього PKI або self-signed сертифікатів — покладіть CA в /etc/minio/certs/CAs/.

Крок 5: Налаштування політик доступу через mc

MinIO Client (mc) — основний інструмент управління:

mc alias set prod https://minio.company.com:9000 minioadmin пароль
mc mb prod/app-uploads
mc admin user add prod app-service сервісний-пароль
cat > /tmp/app-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": ["arn:aws:s3:::app-uploads/*"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::app-uploads"]
    }
  ]
}
EOF
mc admin policy create prod app-policy /tmp/app-policy.json
mc admin policy attach prod app-policy --user app-service

Інтеграція з застосунками

Python (boto3):

import boto3
s3 = boto3.client(
    's3',
    endpoint_url='https://minio.company.com:9000',
    aws_access_key_id='app-service',
    aws_secret_access_key='сервісний-пароль',
    region_name='us-east-1',
)
s3.upload_file('localfile.pdf', 'app-uploads', 'path/to/remote.pdf')

Для Laravel достатньо вказати endpoint у конфігу та увімкнути use_path_style_endpoint. use_path_style_endpoint обов'язковий — без нього SDK намагається звернутися до bucket.minio.company.com, що не працює без wildcard DNS.

Kubernetes: Для розгортання в Kubernetes використовуйте Helm-чарт minio-operator і StatefulSet з виділеними PVC для кожної ноди. Це забезпечує коректне відновлення після збоїв.

Моніторинг і спостережуваність

MinIO експортує метрики у форматі Prometheus на /minio/v2/metrics/cluster. Ключові метрики: minio_cluster_capacity_usable_free_bytes, minio_cluster_nodes_online_total, minio_s3_requests_errors_total. Ми налаштовуємо дашборди Grafana з офіційного репозиторію та алерти на основі SLO (доступність не нижче 99.9%). Для збору метрик використовуємо sidecar-контейнер з OpenTelemetry Collector (опціонально).

Що входить у нашу роботу

Ви отримуєте:

  • готовий distributed-кластер MinIO з TLS;
  • налаштовані політики доступу та сервісні акаунти;
  • документацію з експлуатації та резервного копіювання;
  • інтеграцію з вашими застосунками (Laravel, Python, Java, Go);
  • навчання команди основам адміністрування;
  • моніторинг і алертинг у Prometheus/Grafana;
  • гарантійну підтримку 30 днів після запуску.

Терміни

Сценарій Час
Single-node MinIO з TLS 4–8 годин
Distributed (4 ноди) з політиками 2–3 дні
Налаштування реплікації між датацентрами +1 день

Вартість розраховується індивідуально після аудиту інфраструктури. Оцінимо проєкт за 1 день. Отримайте консультацію з налаштування MinIO.

Гарантія та підтримка

5+ років досвіду з MinIO у production, 50+ проєктів з об'єктним зберіганням. Використовуємо GitOps-підхід: всю конфігурацію зберігаємо в Terraform і Ansible. Гарантований uptime 99.9% для distributed-кластера. Для резервного копіювання MinIO можна використовувати mc mirror в іншу S3-сумісну систему або rsync. Рекомендується налаштувати щоденні знімки конфігурації та даних.

Зв'яжіться з нами для детального аудиту вашої інфраструктури. Ми підготуємо індивідуальну пропозицію з розгортання MinIO. Замовте аудит вашої інфраструктури для точної оцінки вартості та термінів впровадження MinIO.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141