|
@@ -1,45 +1,70 @@
|
|
|
|
|
+from pydantic import field_validator
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
from typing import Any, Dict, List
|
|
from typing import Any, Dict, List
|
|
|
from dotenv import load_dotenv
|
|
from dotenv import load_dotenv
|
|
|
from urllib.parse import quote
|
|
from urllib.parse import quote
|
|
|
import os
|
|
import os
|
|
|
-load_dotenv()
|
|
|
|
|
|
|
+
|
|
|
|
|
+# Docker/Jenkins 挂载 /app/.env.produ;本地开发可同路径或环境变量覆盖
|
|
|
|
|
+load_dotenv(".env.produ")
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _strip_env_quotes(value: str | None) -> str | None:
|
|
|
|
|
+ if value is None:
|
|
|
|
|
+ return None
|
|
|
|
|
+ v = value.strip()
|
|
|
|
|
+ if len(v) >= 2 and v[0] == v[-1] and v[0] in ('"', "'"):
|
|
|
|
|
+ return v[1:-1].strip()
|
|
|
|
|
+ return v
|
|
|
|
|
+
|
|
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
class Settings(BaseSettings):
|
|
|
# 基础配置
|
|
# 基础配置
|
|
|
PROJECT_NAME: str = "Alien Cloud Python"
|
|
PROJECT_NAME: str = "Alien Cloud Python"
|
|
|
API_V1_STR: str = "/api/v1"
|
|
API_V1_STR: str = "/api/v1"
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
# 鉴权配置 (原 alien-gateway 职责)
|
|
# 鉴权配置 (原 alien-gateway 职责)
|
|
|
- SECRET_KEY: str = os.getenv("SECRET_KEY")
|
|
|
|
|
- ALGORITHM: str = os.getenv("ALGORITHM")
|
|
|
|
|
- ACCESS_TOKEN_EXPIRE_MINUTES: int = os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES") # 7天
|
|
|
|
|
-
|
|
|
|
|
- # 数据库配置
|
|
|
|
|
- DB_USER: str = os.getenv("DB_USER")
|
|
|
|
|
- DB_PASSWORD: str = os.getenv("DB_PASSWORD")
|
|
|
|
|
- DB_HOST: str = os.getenv("DB_HOST")
|
|
|
|
|
- DB_PORT: int = os.getenv("DB_PORT")
|
|
|
|
|
- DB_NAME: str = os.getenv("DB_NAME")
|
|
|
|
|
|
|
+ SECRET_KEY: str = ""
|
|
|
|
|
+ ALGORITHM: str = "HS256"
|
|
|
|
|
+ ACCESS_TOKEN_EXPIRE_MINUTES: int = 10080
|
|
|
|
|
+
|
|
|
|
|
+ # 数据库配置(生产须与 Java alien_produ 一致)
|
|
|
|
|
+ DB_USER: str = "root"
|
|
|
|
|
+ DB_PASSWORD: str = ""
|
|
|
|
|
+ DB_HOST: str = ""
|
|
|
|
|
+ DB_PORT: int = 3306
|
|
|
|
|
+ DB_NAME: str = "alien_produ"
|
|
|
|
|
|
|
|
# Redis Sentinel 高可用配置
|
|
# Redis Sentinel 高可用配置
|
|
|
- # 例: REDIS_SENTINELS=192.168.2.251:36379,192.168.2.252:36379,192.168.2.253:36379
|
|
|
|
|
- REDIS_SENTINELS: str = os.getenv("REDIS_SENTINELS", "")
|
|
|
|
|
- REDIS_MASTER_NAME: str = os.getenv("REDIS_MASTER_NAME", "mymaster")
|
|
|
|
|
- REDIS_PASSWORD: str = os.getenv("REDIS_PASSWORD", "")
|
|
|
|
|
- REDIS_DB: int = int(os.getenv("REDIS_DB", "0"))
|
|
|
|
|
- REDIS_SENTINEL_USERNAME: str = os.getenv("REDIS_SENTINEL_USERNAME", "")
|
|
|
|
|
- REDIS_SENTINEL_PASSWORD: str = os.getenv("REDIS_SENTINEL_PASSWORD", "")
|
|
|
|
|
- REDIS_SOCKET_TIMEOUT: float = float(os.getenv("REDIS_SOCKET_TIMEOUT", "0.5"))
|
|
|
|
|
- REDIS_CONNECT_TIMEOUT: float = float(os.getenv("REDIS_CONNECT_TIMEOUT", "1.0"))
|
|
|
|
|
- # 下游服务地址
|
|
|
|
|
- STORE_BASE_URL: str = os.getenv("STORE_BASE_URL") # alien_store 服务地址
|
|
|
|
|
-
|
|
|
|
|
- # 阿里云短信配置
|
|
|
|
|
- ALIYUN_SMS_SIGN_NAME_CONTRACT: str = os.getenv("ALIYUN_SMS_SIGN_NAME_CONTRACT")
|
|
|
|
|
- ALIYUN_SMS_TEMPLATE_CODE_CONTRACT: str = os.getenv("ALIYUN_SMS_TEMPLATE_CODE_CONTRACT")
|
|
|
|
|
- ALIYUN_ACCESS_KEY_ID: str = os.getenv("ALIYUN_ACCESS_KEY_ID")
|
|
|
|
|
- ALIYUN_ACCESS_KEY_SECRET: str = os.getenv("ALIYUN_ACCESS_KEY_SECRET")
|
|
|
|
|
|
|
+ REDIS_SENTINELS: str = ""
|
|
|
|
|
+ REDIS_MASTER_NAME: str = "mymaster"
|
|
|
|
|
+ REDIS_PASSWORD: str = ""
|
|
|
|
|
+ REDIS_DB: int = 0
|
|
|
|
|
+ REDIS_SENTINEL_USERNAME: str = ""
|
|
|
|
|
+ REDIS_SENTINEL_PASSWORD: str = ""
|
|
|
|
|
+ REDIS_SOCKET_TIMEOUT: float = 0.5
|
|
|
|
|
+ REDIS_CONNECT_TIMEOUT: float = 1.0
|
|
|
|
|
+ STORE_BASE_URL: str = ""
|
|
|
|
|
+
|
|
|
|
|
+ ALIYUN_SMS_SIGN_NAME_CONTRACT: str = ""
|
|
|
|
|
+ ALIYUN_SMS_TEMPLATE_CODE_CONTRACT: str = ""
|
|
|
|
|
+ ALIYUN_ACCESS_KEY_ID: str = ""
|
|
|
|
|
+ ALIYUN_ACCESS_KEY_SECRET: str = ""
|
|
|
|
|
+
|
|
|
|
|
+ @field_validator(
|
|
|
|
|
+ "DB_HOST",
|
|
|
|
|
+ "DB_USER",
|
|
|
|
|
+ "DB_NAME",
|
|
|
|
|
+ "DB_PASSWORD",
|
|
|
|
|
+ "SECRET_KEY",
|
|
|
|
|
+ "STORE_BASE_URL",
|
|
|
|
|
+ mode="before",
|
|
|
|
|
+ )
|
|
|
|
|
+ @classmethod
|
|
|
|
|
+ def strip_quoted_env(cls, value: Any) -> Any:
|
|
|
|
|
+ if isinstance(value, str):
|
|
|
|
|
+ return _strip_env_quotes(value) or ""
|
|
|
|
|
+ return value
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -111,6 +136,7 @@ class Settings(BaseSettings):
|
|
|
model_config = SettingsConfigDict(
|
|
model_config = SettingsConfigDict(
|
|
|
case_sensitive=True,
|
|
case_sensitive=True,
|
|
|
env_file=".env.produ",
|
|
env_file=".env.produ",
|
|
|
|
|
+ extra="ignore",
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
settings = Settings()
|
|
settings = Settings()
|