Сегодня мы разберем, как быстро поднять и использовать собственное облачное хранилище MinIO S3.
MinIO — это полностью совместимый с S3-протоколом объектный сторедж для хранения файлов, резервных копий и больших датасетов.
MinIO поддерживает S3 API (операции GET, PUT, DELETE ), а также:
✔️Управление бакетами: Bucket policy, versioning и lifecycle rules
✔️Безопасность: шифрование на стороне сервера и клиента
✔️Поддержку Multi-user / Multi-tenant окружений
✔️Простую интеграцию с любыми S3-SDK и библиотеками
Он совместим с разными S3-инструментами, легко масштабируется благодаря архитектуре Shared-Nothing, обрабатывает запросы параллельно, использует Erasure Coding для надежности и восстановления данных, а целостность хранения обеспечивается криптографическими хэшами.
Для чего можно использовать MinIO:
▪️Приватное облако — хранение изображений и файлов пользователей
▪️AI/ML и Big Data — хранение больших наборов данных
▪️Бэкапы — резервное копирование баз данных и виртуальных машин
Использование MinIO во Flutter
Благодаря S3-совместимости, MinIO можно использовать как локальное S3 для быстрой разработки приложений на Flutter.
Для работы подходит пакет minio, совместимый с MinIO, AWS S3 и Firebase Storage.
Чтобы начать работу, достаточно создать клиент, передав данные S3-сервера:
import 'package:minio/minio.dart';
MinioClient minio = MinioClient (
endPoint : 'your-s3-endpoint-url.com', // Замените на адрес вашего MinIO
accessKey : 'your-access-key', // Лучше передавать через переменные окружения (env)
secretKey : 'your-secret-key', // Лучше передавать через переменные окружения (env)
useSSL : false, // Установите true, если ваш сервер S3 использует HTTPS
);
Библиотека предоставляет удобные методы для работы с объектами. Рассмотрим некоторые из них:
◽️Загрузка объекта в S3
Метод putObject позволяет загружать объекты из потока байтов (Stream<Uint8List>).
Future<AppFileLink> uploadFile({
required String bucket,
required String object,
required Stream<Uint8List> data,
}) async {
// putObject выполняет загрузку
return minio
.putObject(
bucket,
object,
data,
)
// После успешной загрузки получаем публичную ссылку
.then((_) => getPublicUrl(bucket: bucket, object: object));
}◽️Загрузка с прогрессом
Для больших файлов можно отслеживать ход загрузки с помощью колбэка onProgress:
await minio.putObject(
'mybucket',
'myobject',
Stream<Uint8List>.value(Uint8List(1024)),
onProgress: (bytes) {
print('$bytes uploaded');
},
);
◽️Получение временно подписанной ссылки (Presigned URL)
Для безопасного предоставления доступа к файлу без публичного доступа к бакету используется временно подписанная ссылка.
Future<AppFileLink> getPublicUrl({
required String bucket,
required String object,
Duration expires = const Duration(days: 7), // Срок действия ссылки
}) async {
final link = await minio.presignedGetObject(
bucket,
object,
expires: expires.inSeconds, // Срок действия в секундах
);
// Возвращаем ссылку
// ...
}📎С полным списком методов можно ознакомиться в документации библиотеки
Продолжение — в комментариях 👇
