"""Singleton MinIO клиент. MinIO SDK держит пул HTTP-соединений внутри себя — создаём один экземпляр на весь процесс. Бакеты проверяем один раз при старте приложения. """ import logging from minio import Minio from minio.error import S3Error from app.config import settings logger = logging.getLogger(__name__) _client: Minio | None = None _initialized_buckets: set[str] = set() def get_minio() -> Minio: """Вернуть singleton MinIO клиент.""" global _client if _client is None: _client = Minio( settings.MINIO_ENDPOINT, access_key=settings.MINIO_ACCESS_KEY, secret_key=settings.MINIO_SECRET_KEY, secure=settings.MINIO_SECURE, ) return _client def ensure_bucket(bucket: str) -> None: """Создать бакет если не существует. Вызывается один раз при старте.""" if bucket in _initialized_buckets: return client = get_minio() try: if not client.bucket_exists(bucket): client.make_bucket(bucket) logger.info(f"MinIO: бакет '{bucket}' создан") else: logger.info(f"MinIO: бакет '{bucket}' существует") _initialized_buckets.add(bucket) except S3Error as e: logger.error(f"MinIO: ошибка проверки бакета '{bucket}': {e}") raise