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-stoppedmkdir -p /data/minio
docker compose up -dNginx 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'];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 на своєму VPS | Hetzner 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 з окремим віддаленим сховищем, а не покладатися лише на диск одного сервера.