423baff73b
- Docker bridge 网络隔离(8000 端口封死) - Gunicorn 4 Worker 多进程 - Alembic 数据库迁移基线 - 日志轮转 20m×3 - JWT 密钥 + DB 密码 + CORS 收紧 - 3-2-1 备份链路(NAS + R740-B 冷备) - 连接池 pool_pre_ping + pool_recycle=3600
66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
核心配置模块
|
|
使用 Pydantic v2 Settings 管理所有环境变量,支持 .env 文件自动加载。
|
|
"""
|
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
"""应用全局配置,所有敏感信息通过环境变量注入,禁止硬编码。"""
|
|
|
|
model_config = SettingsConfigDict(
|
|
env_file=".env",
|
|
env_file_encoding="utf-8",
|
|
case_sensitive=False,
|
|
)
|
|
|
|
# ---- 应用基础 ----
|
|
APP_NAME: str = "SHBL-CRM"
|
|
APP_VERSION: str = "2.0.0"
|
|
DEBUG: bool = False
|
|
|
|
# ---- 数据库 (PostgreSQL + asyncpg) ----
|
|
DB_HOST: str = "127.0.0.1"
|
|
DB_PORT: int = 5432
|
|
DB_USER: str = "crm_admin"
|
|
DB_PASSWORD: str = "change_me_in_production"
|
|
DB_NAME: str = "shbl_crm"
|
|
|
|
@property
|
|
def DATABASE_URL(self) -> str:
|
|
"""构造异步 PostgreSQL 连接字符串 (asyncpg 驱动)"""
|
|
return (
|
|
f"postgresql+asyncpg://{self.DB_USER}:{self.DB_PASSWORD}"
|
|
f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
|
|
)
|
|
|
|
@property
|
|
def DATABASE_URL_SYNC(self) -> str:
|
|
"""同步连接字符串,仅供 Alembic 迁移使用"""
|
|
return (
|
|
f"postgresql+psycopg2://{self.DB_USER}:{self.DB_PASSWORD}"
|
|
f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
|
|
)
|
|
|
|
# ---- JWT 安全 ----
|
|
SECRET_KEY: str = "REPLACE_WITH_RANDOM_64_CHAR_HEX"
|
|
JWT_ALGORITHM: str = "HS256"
|
|
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 # 24小时
|
|
|
|
# ---- CORS 白名单 (严格模式,禁止 "*") ----
|
|
CORS_ORIGINS: list[str] = [
|
|
"http://localhost:5173", # Vite 开发服务器
|
|
"http://localhost:8080", # Nginx 生产前端
|
|
]
|
|
|
|
# ---- AI 服务 (Dify BaaS 平台) ----
|
|
DIFY_BASE_URL: str = "http://192.168.1.88/v1"
|
|
DIFY_LOG_APP_API_KEY: str = "" # 日志分析 App (completion)
|
|
DIFY_REPORT_APP_API_KEY: str = "" # 月度报告 App (completion)
|
|
|
|
|
|
# 全局单例,其他模块通过 from app.core.config import settings 引用
|
|
settings = Settings()
|