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
'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.