До основного вмісту

MinIO на VPS: власне S3-сховище за 15 хвилин

Хмара та DevOps · 19.04.2026 · 4 хв читання
Ілюстрація до статті «MinIO на VPS: власне S3-сховище за 15 хвилин»

MinIO: власне S3-сховище на VPS

MinIO — високопродуктивне об'єктне сховище з повною сумісністю з Amazon S3 API. Ідеально для зберігання медіафайлів, резервних копій, статики та ML-датасетів прямо на вашому VPS.

Встановлення через Docker Compose

# /opt/minio/docker-compose.yml
version: '3.8'
services:
  minio:
    image: minio/minio:latest
    container_name: minio
    ports:
      - "9000:9000"   # S3 API
      - "9001:9001"   # Web Console
    volumes:
      - /data/minio:/data
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: StrongPassword123!
      MINIO_VOLUMES: "/data"
    command: server /data --console-address ":9001"
    restart: unless-stopped
mkdir -p /data/minio
docker compose up -d

Nginx Reverse Proxy + SSL

server {
    listen 443 ssl;
    server_name s3.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/s3.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/s3.yourdomain.com/privkey.pem;

    # S3 API
    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        client_max_body_size 0;  # без ліміту розміру файлу
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

server {
    listen 443 ssl;
    server_name minio-console.yourdomain.com;
    # ... аналогічний блок для порту 9001
    location / {
        proxy_pass http://127.0.0.1:9001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Створення бакетів і користувачів через CLI

# Встановити mc (MinIO Client)
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc && mv mc /usr/local/bin/

# Підключитися до сервера
mc alias set myminio https://s3.yourdomain.com minioadmin StrongPassword123!

# Створити бакет
mc mb myminio/website-uploads
mc mb myminio/backups

# Зробити бакет публічним (для статики)
mc policy set public myminio/website-uploads

# Створити користувача
mc admin user add myminio appuser AppUserPass123
mc admin policy attach myminio readwrite --user appuser

Інтеграція з PHP (AWS SDK)

composer require aws/aws-sdk-php
<?php
use Aws\S3\S3Client;

$s3 = new S3Client([
    'version'  => 'latest',
    'region'   => 'us-east-1',  // MinIO не використовує регіон, але параметр обов'язковий
    'endpoint' => 'https://s3.yourdomain.com',
    'use_path_style_endpoint' => true,
    'credentials' => [
        'key'    => 'appuser',
        'secret' => 'AppUserPass123',
    ],
]);

// Завантажити файл
$result = $s3->putObject([
    'Bucket'     => 'website-uploads',
    'Key'        => 'images/photo.jpg',
    'SourceFile' => '/tmp/photo.jpg',
    'ACL'        => 'public-read',
]);

echo $result['ObjectURL'];
Порада: MinIO підтримує версіонування файлів, lifecycle-політики та реплікацію між кількома серверами. Увімкніть версіонування командою mc version enable myminio/backups.

Розбір реальних помилок

Дві проблеми трапляються майже у кожного, хто розгортає MinIO на VPS вперше.

Диск недоступний для запису

ERROR Unable to use the drive /data: Drive is not writable, please fix the file system permissions

Директорія /data/minio на хості належить root, а процес всередині контейнера працює від непривілейованого користувача. Перевірте власника командою ls -la /data/minio і виправте через chown -R 1000:1000 /data/minio, або явно вкажіть user: "1000:1000" у docker-compose.yml.

Самопідписаний сертифікат під час підключення mc

mc: <ERROR> Unable to initialize new alias from the provided credentials. Get "https://s3.yourdomain.com/probe-bucket-sign...": x509: certificate signed by unknown authority

Зазвичай означає, що nginx перед MinIO ще не отримав справжній сертифікат Let's Encrypt і видає тимчасовий self-signed. Перевірте certbot certificates і шлях до файлів у конфігурації nginx — до випуску сертифіката mc alias set можна тимчасово перевірити з прапорцем --insecure, але не використовувати його в постійних скриптах.

MinIO проти керованих S3-провайдерів

КритерійMinIO на своєму VPSHetzner Object Storage / R2
Контроль над данимиПовний, фізично на вашому дискуДані у провайдера
Обслуговування та оновленняВаша відповідальністьПровайдер сам оновлює і патчить
Масштабування обсягуОбмежено фізичним диском сервераРосте автоматично без вашої участі
Сертифікація SOC2/ISO сховищаВідповідальність цілком на васУ великих провайдерів зазвичай є

Коли MinIO на VPS не підходить

  • Потрібна геророзподілена відмовостійкість із коробки — налаштування multi-site реплікації MinIO вручну складніше, ніж взяти готовий managed S3.
  • Немає ресурсів стежити за оновленнями, дисковим простором і резервними копіями самого MinIO — керований сервіс знімає цей клопіт повністю.
  • Обсяг даних має зростати без фізичного апгрейду диска — MinIO на VPS обмежений реальним диском сервера, managed-сховище масштабується саме.
  • Потрібен CDN перед об'єктами з мережею edge-точок по всьому світу — Cloudflare R2 і AWS S3 інтегруються з CDN нативно, для MinIO CDN доведеться налаштовувати окремо.
  • Compliance вимагає офіційної сертифікації провайдера сховища (SOC2, ISO 27001) — самостійно піднятий MinIO не проходить цю сертифікацію автоматично, відповідальність на вас.

Перевірка результату

# Стан кластера і дисків
mc admin info myminio

# Повний цикл: завантаження, читання, видалення тестового об'єкта
echo "test" > test.txt
mc cp test.txt myminio/website-uploads/test.txt
mc cat myminio/website-uploads/test.txt
mc rm myminio/website-uploads/test.txt

# Публічний доступ через nginx працює ззовні
curl -I https://s3.yourdomain.com/website-uploads/photo.jpg

Якщо mc admin info показує диск у статусі offline — перевірте логи контейнера через docker logs minio, зазвичай причина в тій самій проблемі з правами на директорію. Для регулярних резервних копій самого MinIO логічно використовувати rclone з окремим віддаленим сховищем, а не покладатися лише на диск одного сервера.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці