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 vs управляемые 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 с отдельным удалённым хранилищем, а не полагаться только на диск одного сервера.