2026-02-05 13:56:39 +08:00
|
|
|
|
"""
|
|
|
|
|
|
配置管理
|
|
|
|
|
|
"""
|
2026-02-02 09:40:02 +08:00
|
|
|
|
import os
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class DatabaseConfig:
|
2026-02-05 13:56:39 +08:00
|
|
|
|
"""数据库配置"""
|
2026-02-02 09:40:02 +08:00
|
|
|
|
url: str = "sqlite:///./data/alert_platform.db"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2026-02-09 17:47:35 +08:00
|
|
|
|
class COSConfig:
|
|
|
|
|
|
"""腾讯云 COS 存储配置"""
|
|
|
|
|
|
secret_id: str = ""
|
|
|
|
|
|
secret_key: str = ""
|
|
|
|
|
|
region: str = "ap-beijing"
|
|
|
|
|
|
bucket: str = "" # 格式: bucketname-appid
|
|
|
|
|
|
upload_prefix: str = "alerts" # 对象 Key 前缀
|
|
|
|
|
|
presign_expire: int = 1800 # 预签名URL有效期(秒),默认30分钟
|
|
|
|
|
|
sts_expire: int = 1800 # STS 临时凭证有效期(秒)
|
|
|
|
|
|
enabled: bool = False # 是否启用 COS(False 时使用本地存储)
|
2026-02-02 09:40:02 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class AppConfig:
|
2026-02-05 13:56:39 +08:00
|
|
|
|
"""应用配置"""
|
2026-02-02 09:40:02 +08:00
|
|
|
|
host: str = "0.0.0.0"
|
|
|
|
|
|
port: int = 8000
|
|
|
|
|
|
debug: bool = True
|
2026-02-06 16:39:53 +08:00
|
|
|
|
dev_mode: bool = True # 开发模式:跳过认证验证,返回超级管理员权限
|
2026-02-02 09:40:02 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class AIModelConfig:
|
2026-02-05 13:56:39 +08:00
|
|
|
|
"""AI 模型配置"""
|
2026-02-02 09:40:02 +08:00
|
|
|
|
endpoint: str = ""
|
|
|
|
|
|
api_key: str = ""
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-02-05 13:56:39 +08:00
|
|
|
|
@dataclass
|
|
|
|
|
|
class MQTTConfig:
|
2026-02-10 15:22:01 +08:00
|
|
|
|
"""MQTT 配置 (已废弃 - 告警上报已改为 HTTP + COS)"""
|
2026-02-05 13:56:39 +08:00
|
|
|
|
broker_host: str = "localhost"
|
|
|
|
|
|
broker_port: int = 1883
|
|
|
|
|
|
client_id: str = "alert_platform"
|
|
|
|
|
|
username: str = ""
|
|
|
|
|
|
password: str = ""
|
|
|
|
|
|
alert_topic: str = "edge/alert/#"
|
|
|
|
|
|
heartbeat_topic: str = "edge/alert/heartbeat/#"
|
|
|
|
|
|
qos: int = 1
|
2026-02-10 15:22:01 +08:00
|
|
|
|
enabled: bool = False # 默认禁用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class RedisConfig:
|
|
|
|
|
|
"""Redis 配置"""
|
|
|
|
|
|
host: str = "localhost"
|
|
|
|
|
|
port: int = 6379
|
|
|
|
|
|
password: str = ""
|
|
|
|
|
|
db: int = 0
|
|
|
|
|
|
max_connections: int = 50
|
|
|
|
|
|
decode_responses: bool = True
|
2026-02-05 13:56:39 +08:00
|
|
|
|
enabled: bool = True
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-02-02 09:40:02 +08:00
|
|
|
|
class Settings(BaseModel):
|
2026-02-05 13:56:39 +08:00
|
|
|
|
"""全局配置"""
|
2026-02-02 09:40:02 +08:00
|
|
|
|
database: DatabaseConfig = DatabaseConfig()
|
2026-02-09 17:47:35 +08:00
|
|
|
|
cos: COSConfig = COSConfig()
|
2026-02-02 09:40:02 +08:00
|
|
|
|
app: AppConfig = AppConfig()
|
|
|
|
|
|
ai_model: AIModelConfig = AIModelConfig()
|
2026-02-05 13:56:39 +08:00
|
|
|
|
mqtt: MQTTConfig = MQTTConfig()
|
2026-02-10 15:22:01 +08:00
|
|
|
|
redis: RedisConfig = RedisConfig()
|
2026-02-02 09:40:02 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_settings() -> Settings:
|
2026-02-05 13:56:39 +08:00
|
|
|
|
"""从环境变量加载配置"""
|
2026-02-02 09:40:02 +08:00
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
load_dotenv()
|
|
|
|
|
|
|
|
|
|
|
|
return Settings(
|
|
|
|
|
|
database=DatabaseConfig(
|
|
|
|
|
|
url=os.getenv("DATABASE_URL", "sqlite:///./data/alert_platform.db"),
|
|
|
|
|
|
),
|
2026-02-09 17:47:35 +08:00
|
|
|
|
cos=COSConfig(
|
|
|
|
|
|
secret_id=os.getenv("COS_SECRET_ID", ""),
|
|
|
|
|
|
secret_key=os.getenv("COS_SECRET_KEY", ""),
|
|
|
|
|
|
region=os.getenv("COS_REGION", "ap-beijing"),
|
|
|
|
|
|
bucket=os.getenv("COS_BUCKET", ""),
|
|
|
|
|
|
upload_prefix=os.getenv("COS_UPLOAD_PREFIX", "alerts"),
|
|
|
|
|
|
presign_expire=int(os.getenv("COS_PRESIGN_EXPIRE", "1800")),
|
|
|
|
|
|
sts_expire=int(os.getenv("COS_STS_EXPIRE", "1800")),
|
|
|
|
|
|
enabled=os.getenv("COS_ENABLED", "false").lower() == "true",
|
2026-02-02 09:40:02 +08:00
|
|
|
|
),
|
|
|
|
|
|
app=AppConfig(
|
|
|
|
|
|
host=os.getenv("APP_HOST", "0.0.0.0"),
|
|
|
|
|
|
port=int(os.getenv("APP_PORT", "8000")),
|
|
|
|
|
|
debug=os.getenv("DEBUG", "true").lower() == "true",
|
2026-02-06 16:39:53 +08:00
|
|
|
|
dev_mode=os.getenv("DEV_MODE", "true").lower() == "true",
|
2026-02-02 09:40:02 +08:00
|
|
|
|
),
|
|
|
|
|
|
ai_model=AIModelConfig(
|
|
|
|
|
|
endpoint=os.getenv("AI_MODEL_ENDPOINT", ""),
|
|
|
|
|
|
api_key=os.getenv("AI_MODEL_API_KEY", ""),
|
|
|
|
|
|
),
|
2026-02-05 13:56:39 +08:00
|
|
|
|
mqtt=MQTTConfig(
|
|
|
|
|
|
broker_host=os.getenv("MQTT_BROKER_HOST", "localhost"),
|
|
|
|
|
|
broker_port=int(os.getenv("MQTT_BROKER_PORT", "1883")),
|
|
|
|
|
|
client_id=os.getenv("MQTT_CLIENT_ID", "alert_platform"),
|
|
|
|
|
|
username=os.getenv("MQTT_USERNAME", ""),
|
|
|
|
|
|
password=os.getenv("MQTT_PASSWORD", ""),
|
|
|
|
|
|
alert_topic=os.getenv("MQTT_ALERT_TOPIC", "edge/alert/#"),
|
|
|
|
|
|
heartbeat_topic=os.getenv("MQTT_HEARTBEAT_TOPIC", "edge/alert/heartbeat/#"),
|
|
|
|
|
|
qos=int(os.getenv("MQTT_QOS", "1")),
|
2026-02-10 15:22:01 +08:00
|
|
|
|
enabled=os.getenv("MQTT_ENABLED", "false").lower() == "true",
|
|
|
|
|
|
),
|
|
|
|
|
|
redis=RedisConfig(
|
|
|
|
|
|
host=os.getenv("REDIS_HOST", "localhost"),
|
|
|
|
|
|
port=int(os.getenv("REDIS_PORT", "6379")),
|
|
|
|
|
|
password=os.getenv("REDIS_PASSWORD", ""),
|
|
|
|
|
|
db=int(os.getenv("REDIS_DB", "0")),
|
|
|
|
|
|
max_connections=int(os.getenv("REDIS_MAX_CONNECTIONS", "50")),
|
|
|
|
|
|
enabled=os.getenv("REDIS_ENABLED", "true").lower() == "true",
|
2026-02-05 13:56:39 +08:00
|
|
|
|
),
|
2026-02-02 09:40:02 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
settings = load_settings()
|