|
@@ -0,0 +1,107 @@
|
|
|
|
|
+"""
|
|
|
|
|
+Minio对象存储连接管理
|
|
|
|
|
+"""
|
|
|
|
|
+import logging
|
|
|
|
|
+from typing import Optional
|
|
|
|
|
+from minio import Minio
|
|
|
|
|
+
|
|
|
|
|
+# 导入配置
|
|
|
|
|
+from app.core.config import config_handler
|
|
|
|
|
+
|
|
|
|
|
+logger = logging.getLogger(__name__)
|
|
|
|
|
+
|
|
|
|
|
+_minio_manager = None
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+class MinioManager:
|
|
|
|
|
+ """Minio管理器"""
|
|
|
|
|
+
|
|
|
|
|
+ def __init__(self):
|
|
|
|
|
+ self.endpoint: str = config_handler.get("admin_app", "MINIO_ENDPOINT", "192.168.91.15:19000")
|
|
|
|
|
+ self.access_key: str = config_handler.get("admin_app", "MINIO_ACCESS_KEY", "HVFOa38zUDg3X6c14hpH")
|
|
|
|
|
+ self.secret_key: str = config_handler.get("admin_app", "MINIO_SECRET_KEY", "ilVITuWEmjG0YDBAWspSG6UniHpEoMDECSuCo0f1")
|
|
|
|
|
+ self.secure: bool = config_handler.get_bool("admin_app", "MINIO_USE_SSL", False)
|
|
|
|
|
+ self.bucket_name: str = config_handler.get("admin_app", "MINIO_BUCKET_NAME", "aidata")
|
|
|
|
|
+ self.base_path: str = config_handler.get("admin_app", "MINIO_BASE_PATH", "sampledata")
|
|
|
|
|
+
|
|
|
|
|
+ logger.info(f"初始化 MinioClient: endpoint={self.endpoint}, bucket={self.bucket_name}")
|
|
|
|
|
+
|
|
|
|
|
+ # 延迟初始化 client
|
|
|
|
|
+ self._client = None
|
|
|
|
|
+
|
|
|
|
|
+ @property
|
|
|
|
|
+ def client(self) -> Minio:
|
|
|
|
|
+ """获取 Minio 客户端(延迟初始化)"""
|
|
|
|
|
+ if self._client is None:
|
|
|
|
|
+ try:
|
|
|
|
|
+ self._client = Minio(
|
|
|
|
|
+ self.endpoint,
|
|
|
|
|
+ access_key=self.access_key,
|
|
|
|
|
+ secret_key=self.secret_key,
|
|
|
|
|
+ secure=self.secure
|
|
|
|
|
+ )
|
|
|
|
|
+ logger.info("Minio客户端初始化成功")
|
|
|
|
|
+
|
|
|
|
|
+ # 确保 bucket 存在
|
|
|
|
|
+ if not self._client.bucket_exists(self.bucket_name):
|
|
|
|
|
+ self._client.make_bucket(self.bucket_name)
|
|
|
|
|
+ logger.info(f"创建Minio bucket: {self.bucket_name}")
|
|
|
|
|
+ else:
|
|
|
|
|
+ logger.info(f"Minio bucket已存在: {self.bucket_name}")
|
|
|
|
|
+
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ logger.error(f"Minio客户端初始化失败: {e}")
|
|
|
|
|
+ raise
|
|
|
|
|
+ return self._client
|
|
|
|
|
+
|
|
|
|
|
+ def close(self) -> None:
|
|
|
|
|
+ """关闭 Minio 连接(Minio SDK 不需要显式关闭)"""
|
|
|
|
|
+ if self._client:
|
|
|
|
|
+ logger.info("Minio连接已关闭")
|
|
|
|
|
+ self._client = None
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_minio_manager() -> MinioManager:
|
|
|
|
|
+ """
|
|
|
|
|
+ 获取全局唯一的 MinioManager 实例(单例模式)
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ MinioManager: Minio管理器实例
|
|
|
|
|
+ """
|
|
|
|
|
+ global _minio_manager
|
|
|
|
|
+ if _minio_manager is None:
|
|
|
|
|
+ _minio_manager = MinioManager()
|
|
|
|
|
+ return _minio_manager
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_minio_client() -> Minio:
|
|
|
|
|
+ """
|
|
|
|
|
+ 获取 Minio 客户端
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ Minio: Minio客户端实例
|
|
|
|
|
+ """
|
|
|
|
|
+ manager = get_minio_manager()
|
|
|
|
|
+ return manager.client
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_bucket_name() -> str:
|
|
|
|
|
+ """
|
|
|
|
|
+ 获取默认的 Bucket 名称
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ str: Bucket名称
|
|
|
|
|
+ """
|
|
|
|
|
+ manager = get_minio_manager()
|
|
|
|
|
+ return manager.bucket_name
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_base_path() -> str:
|
|
|
|
|
+ """
|
|
|
|
|
+ 获取默认的基础路径
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ str: 基础路径
|
|
|
|
|
+ """
|
|
|
|
|
+ manager = get_minio_manager()
|
|
|
|
|
+ return manager.base_path
|