config.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from __future__ import annotations
  2. from functools import lru_cache
  3. from pathlib import Path
  4. from urllib.parse import quote_plus
  5. from pydantic import Field
  6. from pydantic_settings import BaseSettings, SettingsConfigDict
  7. # supply_infra/config.py -> project root; avoid depending on process cwd
  8. _PROJECT_ROOT = Path(__file__).resolve().parent.parent
  9. _ENV_FILE = _PROJECT_ROOT / ".env"
  10. class InfraSettings(BaseSettings):
  11. """Shared infrastructure settings."""
  12. model_config = SettingsConfigDict(
  13. env_file=str(_ENV_FILE),
  14. env_file_encoding="utf-8",
  15. extra="ignore",
  16. )
  17. # MySQL
  18. mysql_host: str = Field(default="127.0.0.1", alias="MYSQL_HOST")
  19. mysql_port: int = Field(default=3306, alias="MYSQL_PORT")
  20. mysql_user: str = Field(default="root", alias="MYSQL_USER")
  21. mysql_password: str = Field(default="", alias="MYSQL_PASSWORD")
  22. mysql_database: str = Field(default="supply_agent", alias="MYSQL_DATABASE")
  23. mysql_pool_size: int = Field(default=5, alias="MYSQL_POOL_SIZE")
  24. mysql_echo: bool = Field(default=False, alias="MYSQL_ECHO")
  25. # ODPS (MaxCompute)
  26. odps_access_id: str = Field(default="", alias="ODPS_ACCESS_ID")
  27. odps_access_key: str = Field(default="", alias="ODPS_ACCESS_KEY")
  28. odps_project: str = Field(default="", alias="ODPS_PROJECT")
  29. odps_endpoint: str = Field(
  30. default="https://service.cn.maxcompute.aliyun.com/api",
  31. alias="ODPS_ENDPOINT",
  32. )
  33. # Scheduler
  34. scheduler_timezone: str = Field(default="Asia/Shanghai", alias="SCHEDULER_TIMEZONE")
  35. scheduler_enabled: bool = Field(default=True, alias="SCHEDULER_ENABLED")
  36. # Aliyun OSS (agent run log publishing)
  37. aliyun_oss_access_key_id: str = Field(default="", alias="ALIYUN_OSS_ACCESS_KEY_ID")
  38. aliyun_oss_access_key_secret: str = Field(default="", alias="ALIYUN_OSS_ACCESS_KEY_SECRET")
  39. aliyun_oss_region: str = Field(default="cn-hangzhou", alias="ALIYUN_OSS_REGION")
  40. aliyun_oss_bucket: str = Field(default="art-pubbucket", alias="ALIYUN_OSS_BUCKET")
  41. aliyun_oss_root_prefix: str = Field(default="supply_agent", alias="ALIYUN_OSS_ROOT_PREFIX")
  42. aliyun_oss_manual_log_prefix: str = Field(
  43. default="supply_agent/manual_logs",
  44. alias="ALIYUN_OSS_MANUAL_LOG_PREFIX",
  45. )
  46. aliyun_oss_public_base_url: str = Field(
  47. default="http://rescdn.yishihui.com",
  48. alias="ALIYUN_OSS_PUBLIC_BASE_URL",
  49. )
  50. log_oss_upload_enabled: bool = Field(default=True, alias="LOG_OSS_UPLOAD_ENABLED")
  51. @property
  52. def mysql_url(self) -> str:
  53. user = quote_plus(self.mysql_user)
  54. password = quote_plus(self.mysql_password)
  55. return (
  56. f"mysql+pymysql://{user}:{password}"
  57. f"@{self.mysql_host}:{self.mysql_port}/{self.mysql_database}"
  58. f"?charset=utf8mb4"
  59. )
  60. @lru_cache
  61. def get_infra_settings() -> InfraSettings:
  62. return InfraSettings()