""" 核心配置 集中管理环境变量和应用配置,遵循 12-factor 原则。 """ import os from pathlib import Path from typing import Optional from dotenv import load_dotenv # 仅从项目根目录 .env 加载,作为唯一配置源 BACKEND_DIR = Path(__file__).resolve().parents[2] PROJECT_ROOT = BACKEND_DIR.parent load_dotenv(PROJECT_ROOT / ".env", override=False) # 默认数据库固定到 Docker PostgreSQL,不再提供 SQLite 回落 DEFAULT_DB_HOST = os.getenv("DB_HOST", "127.0.0.1") DEFAULT_DB_PORT = os.getenv("DB_PORT", "5435") DEFAULT_DB_NAME = os.getenv("POSTGRES_DB", "pmflow") DEFAULT_DB_USER = os.getenv("POSTGRES_USER", "pmflow") DEFAULT_DB_PASSWORD = os.getenv("POSTGRES_PASSWORD", "pmflow_pass") DEFAULT_DATABASE_URL = ( f"postgresql+asyncpg://{DEFAULT_DB_USER}:{DEFAULT_DB_PASSWORD}" f"@{DEFAULT_DB_HOST}:{DEFAULT_DB_PORT}/{DEFAULT_DB_NAME}" ) class Settings: """应用配置(从环境变量读取)""" # 应用 app_name: str = os.getenv("APP_NAME", "Neural Sync API") debug: bool = os.getenv("DEBUG", "false").lower() in ("true", "1", "yes") # 数据库 database_url: str = os.getenv("DATABASE_URL", DEFAULT_DATABASE_URL) db_pool_size: int = int(os.getenv("DB_POOL_SIZE", "20")) db_max_overflow: int = int(os.getenv("DB_MAX_OVERFLOW", "40")) db_pool_timeout: int = int(os.getenv("DB_POOL_TIMEOUT", "30")) db_pool_recycle: int = int(os.getenv("DB_POOL_RECYCLE", "1800")) # JWT secret_key: str = os.getenv("SECRET_KEY", "your-secret-key-change-in-production") algorithm: str = os.getenv("JWT_ALGORITHM", "HS256") access_token_expire_minutes: int = int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", str(60 * 24 * 7))) # CORS cors_origins: str = os.getenv("CORS_ORIGINS", "*") # LLM llm_provider: str = os.getenv("LLM_PROVIDER", "ollama").lower() ollama_host: str = os.getenv("OLLAMA_HOST", "http://127.0.0.1:11434") business_context: Optional[str] = os.getenv("BUSINESS_CONTEXT") # Redis(可选,用于 AI 结果缓存) redis_url: Optional[str] = os.getenv("REDIS_URL") # 多租户(预留) default_tenant_id: str = os.getenv("DEFAULT_TENANT_ID", "default") # 全局配置实例 settings = Settings()