import os from dataclasses import dataclass from pathlib import Path def _database_file_values() -> dict[str, str]: """Read the project's existing database note without copying credentials.""" path = Path(__file__).resolve().parents[2] / "数据库.md" if not path.exists(): return {} values: dict[str, str] = {} for line in path.read_text(encoding="utf-8").splitlines(): if ":" in line: key, value = line.split(":", 1) elif "=" in line: key, value = line.split("=", 1) else: continue values[key.strip().lower()] = value.strip() return values _database_values = _database_file_values() @dataclass(frozen=True) class Settings: # Keep credentials outside the source tree. DEMO_MODE defaults to "never": # a database failure raises an error instead of silently serving demo data. # Use DEMO_MODE=always for demo data, or DEMO_MODE=auto for fallback. db_host: str = os.getenv("DB_HOST", _database_values.get("host", "127.0.0.1")) db_port: int = int(os.getenv("DB_PORT", _database_values.get("port", "3306"))) db_user: str = os.getenv("DB_USER", _database_values.get("user", "root")) db_password: str = os.getenv("DB_PASSWORD", _database_values.get("password", "")) db_name: str = os.getenv("DB_NAME", _database_values.get("db_name", "compressorsensor")) db_connect_timeout: int = int(os.getenv("DB_CONNECT_TIMEOUT", "3")) demo_mode: str = os.getenv("DEMO_MODE", "never").strip().lower() cors_origin: str = os.getenv("CORS_ORIGIN", "http://localhost:5173") annotation_width: int = int(os.getenv("ANNOTATION_WIDTH", "10")) auth_user: str = os.getenv("AUTH_USER", "aaabbb") auth_password: str = os.getenv("AUTH_PASSWORD", "Aa*147258&cd") auth_token_ttl_seconds: int = int(os.getenv("AUTH_TOKEN_TTL_SECONDS", "43200")) settings = Settings()