Содержание:
Если вам требуется хранить загрузки пользователей, бэкапы, медиа и при этом не хотите платить за AWS S3 или зависеть от стороннего сервиса, MinIO решает именно эту задачу. Это самостоятельное S3-совместимое хранилище, которое разворачивается на вашем VDS за 10 минут и работает с любым кодом, написанным под Amazon S3.
Любая библиотека, которая умеет работать с AWS S3 (boto3 в Python, aws-sdk в Node.js, S3Client в Java), будет работать с MinIO без изменений в коде.
MinIO не требует много ресурсов для старта
sudo apt update && sudo apt upgrade -y
С MinIO не рекомендуется работать от root. Создаём отдельного пользователя:
sudo useradd --no-create-home --shell /bin/false minio-user
sudo mkdir -p /var/lib/minio/data
Сюда MinIO будет складывать все загружаемые файлы. Если у вас подключён отдельный диск, лучше указать путь к нему.
Назначаем владельца:
sudo chown -R minio-user:minio-user /var/lib/minio
Скачиваем последний стабильный бинарник напрямую с официального сайта:
cd /tmp
curl -LO https://dl.min.io/server/minio/release/linux-amd64/minio
Копируем в /usr/local/bin и делаем исполняемым:
sudo cp minio /usr/local/bin/
sudo chmod +x /usr/local/bin/minio
sudo chown minio-user:minio-user /usr/local/bin/minio
Проверяем, что бинарник работает:
minio --version
Должна вернуться строка с версией.

Вместо того чтобы передавать все параметры через аргументы командной строки, вынесем их в отдельный файл. Так удобнее управлять настройками и не светить пароль в списке процессов.
sudo nano /etc/default/minio
Вставляем:
# Директория для хранения данных
MINIO_VOLUMES="/var/lib/minio/data"
# Адрес и порт API (S3-совместимый интерфейс)
MINIO_OPTS="--address :9000 --console-address :9001"
# Логин и пароль администратора
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=ВашНадёжныйПароль
MINIO_VOLUMES — путь к данным. Можно указать несколько директорий через пробел для распределённого режима, но для одного сервера одной директории достаточно.
--address :9000 — порт S3 API. Именно его указывают в коде приложений как endpoint.
--console-address :9001 — порт веб-консоли. Через неё управляете хранилищем через браузер.
MINIO_ROOT_USER / MINIO_ROOT_PASSWORD — замените на свои. Пароль должен быть не короче 8 символов, иначе MinIO откажется запускаться.
Закрываем файл и ставим правильные права — пароль не должен быть виден другим пользователям:
sudo chmod 600 /etc/default/minio
sudo chown minio-user:minio-user /etc/default/minio
sudo nano /etc/systemd/system/minio.service
Вставляем:
[Unit]
Description=MinIO Object Storage
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
LimitNOFILE=65536 — увеличиваем лимит открытых файлов.
Запускаем и добавляем в автозагрузку:
sudo systemctl daemon-reload
sudo systemctl start minio
sudo systemctl enable minio
Проверяем статус:
sudo systemctl status minio

Ищем Active: active (running). Если что-то пошло не так — смотрим логи:
sudo journalctl -u minio -n 50
Чаще всего проблема в правах на директорию или слишком коротком пароле.
sudo ufw allow 9000/tcp
sudo ufw allow 9001/tcp
Порт 9000 — для приложений (S3 API).
Порт 9001 — для веб-консоли.
Совет: если MinIO используется только вашим приложением на том же сервере, порт 9000 наружу открывать не нужно, приложение подключится через
localhost:9000. Наружу достаточно открыть только 9001 для управления, и то лучше ограничить по IP.
Открываем в браузере: http://ваш_ip:9001
Вводим логин и пароль из файла конфигурации. Попадаем в веб-интерфейс.

Здесь можно:
uploadsBucket создан. Теперь можно загружать файлы через интерфейс или через API.


Это главное преимущество MinIO, стандартный S3 API. Покажем, как подключиться из Python и Node.js
pip install boto3
import boto3
s3 = boto3.client(
's3',
endpoint_url='http://ваш_ip:9000',
aws_access_key_id='minioadmin',
aws_secret_access_key='ВашНадёжныйПароль',
region_name='us-east-1' # MinIO не использует регионы, но boto3 требует значение
)
# Загружаем файл
s3.upload_file('local_file.txt', 'uploads', 'remote_file.txt')
# Скачиваем файл
s3.download_file('uploads', 'remote_file.txt', 'downloaded_file.txt')
# Список файлов в bucket
response = s3.list_objects_v2(Bucket='uploads')
for obj in response.get('Contents', []):
print(obj['Key'])
npm install @aws-sdk/client-s3
import { S3Client, PutObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3';
import { readFileSync } from 'fs';
const client = new S3Client({
endpoint: 'http://ваш_ip:9000',
region: 'us-east-1',
credentials: {
accessKeyId: 'minioadmin',
secretAccessKey: 'ВашНадёжныйПароль',
},
forcePathStyle: true, // Обязательно для MinIO
});
// Загружаем файл
await client.send(new PutObjectCommand({
Bucket: 'uploads',
Key: 'remote_file.txt',
Body: readFileSync('local_file.txt'),
}));
Важно: параметр
forcePathStyle: trueобязателен при работе с MinIO в Node.js SDK. Без него SDK будет формировать URL в форматеbucket.ваш_ip, что не работает с MinIO по умолчанию.
Если MinIO доступен извне, то проще всего поставить Nginx как обратный прокси и выпустить SSL-сертификат через Let's Encrypt.
Устанавливаем Nginx и Certbot:
sudo apt install -y nginx certbot python3-certbot-nginx
Создаём конфиг Nginx для MinIO API:
sudo nano /etc/nginx/sites-available/minio
server {
listen 80;
server_name minio.ваш_домен.ru;
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Для загрузки больших файлов
client_max_body_size 1000m;
proxy_request_buffering off;
}
}
server {
listen 80;
server_name console.ваш_домен.ru;
location / {
proxy_pass http://localhost:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Активируем конфиг:
sudo ln -s /etc/nginx/sites-available/minio /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Выпускаем SSL-сертификаты:
sudo certbot --nginx -d minio.ваш_домен.ru -d console.ваш_домен.ru
После этого API будет доступен по https://minio.ваш_домен.ru, консоль — по https://console.ваш_домен.ru.
Установить MinIO Client (mc), утилиту для управления MinIO из командной строки:
curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc
sudo cp mc /usr/local/bin/
sudo chmod +x /usr/local/bin/mc
Добавить MinIO в mc:
mc alias set local http://localhost:9000 minioadmin ВашНадёжныйПароль
Список всех bucket:
mc ls local
Создать bucket:
mc mb local/my-bucket
Загрузить файл:
mc cp local_file.txt local/my-bucket/
Зеркалировать папку в bucket (удобно для бэкапов):
mc mirror /var/backups/ local/backups/
Посмотреть статистику использования:
mc du local/my-bucket

MinIO подходит когда нужно S3-хранилище без зависимости от облачных провайдеров. Разворачивается быстро, работает надёжно, совместим со всем экосистемой AWS S3.