К основному содержимому

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

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке