from pathlib import Path from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): PROJECT_NAME: str = "TJWater Server" API_V1_STR: str = "/api/v1" # JWT 配置 SECRET_KEY: str = ( "your-secret-key-here-change-in-production-use-openssl-rand-hex-32" ) ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 REFRESH_TOKEN_EXPIRE_DAYS: int = 7 # 数据加密密钥 (使用 Fernet) ENCRYPTION_KEY: str = "" # 必须从环境变量设置 # Database Config (PostgreSQL) DB_NAME: str = "tjwater" DB_HOST: str = "localhost" DB_PORT: str = "5432" DB_USER: str = "postgres" DB_PASSWORD: str = "password" # Database Config (TimescaleDB) TIMESCALEDB_DB_NAME: str = "tjwater" TIMESCALEDB_DB_HOST: str = "localhost" TIMESCALEDB_DB_PORT: str = "5433" TIMESCALEDB_DB_USER: str = "postgres" TIMESCALEDB_DB_PASSWORD: str = "password" # InfluxDB INFLUXDB_URL: str = "http://localhost:8086" INFLUXDB_TOKEN: str = "token" INFLUXDB_ORG: str = "org" INFLUXDB_BUCKET: str = "bucket" # Metadata Database Config (PostgreSQL) METADATA_DB_NAME: str = "system_hub" METADATA_DB_HOST: str = "localhost" METADATA_DB_PORT: str = "5432" METADATA_DB_USER: str = "postgres" METADATA_DB_PASSWORD: str = "password" METADATA_DB_POOL_SIZE: int = 5 METADATA_DB_MAX_OVERFLOW: int = 10 PROJECT_PG_CACHE_SIZE: int = 50 PROJECT_TS_CACHE_SIZE: int = 50 PROJECT_PG_POOL_SIZE: int = 5 PROJECT_PG_MAX_OVERFLOW: int = 10 PROJECT_TS_POOL_MIN_SIZE: int = 1 PROJECT_TS_POOL_MAX_SIZE: int = 10 # Keycloak JWT (optional override) KEYCLOAK_PUBLIC_KEY: str = "" KEYCLOAK_ALGORITHM: str = "RS256" KEYCLOAK_AUDIENCE: str = "" @property def SQLALCHEMY_DATABASE_URI(self) -> str: return f"postgresql://{self.DB_USER}:{self.DB_PASSWORD}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" @property def METADATA_DATABASE_URI(self) -> str: return ( f"postgresql+psycopg://{self.METADATA_DB_USER}:{self.METADATA_DB_PASSWORD}" f"@{self.METADATA_DB_HOST}:{self.METADATA_DB_PORT}/{self.METADATA_DB_NAME}" ) model_config = SettingsConfigDict( env_file=Path(__file__).resolve().parents[2] / ".env", extra="ignore", ) settings = Settings()