"""应用配置 从项目根目录的 .env 文件加载配置(若存在)。 API_KEY 用于保护写操作:Tailscale 内网/本机来源放行,外部来源必须携带正确密钥; 留空则外部来源一律拒绝(仅内网可用)。 """ import os from pathlib import Path from dotenv import load_dotenv BASE_DIR = Path(__file__).resolve().parent.parent.parent load_dotenv(BASE_DIR / ".env") class Settings: """应用配置项""" APP_NAME: str = os.getenv("APP_NAME", "VPS 资产管理系统") # 写操作(POST/PUT/DELETE)鉴权密钥;Tailscale 内网/本机来源忽略校验, # 外部来源必须携带 X-API-Key(留空则外部来源直接拒绝) API_KEY: str = os.getenv("API_KEY", "") # Agent 上报鉴权密钥;配置后 Agent 上报需携带 X-Agent-Key AGENT_KEY: str = os.getenv("AGENT_KEY", "") # 凭证加密主密钥(Fernet);生成:python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())' MASTER_KEY: str = os.getenv("MASTER_KEY", "") # ---- 通知渠道:Telegram ---- TELEGRAM_BOT_TOKEN: str = os.getenv("TELEGRAM_BOT_TOKEN", "") TELEGRAM_CHAT_ID: str = os.getenv("TELEGRAM_CHAT_ID", "") # ---- 通知渠道:邮件(SMTP)---- SMTP_HOST: str = os.getenv("SMTP_HOST", "") SMTP_PORT: int = int(os.getenv("SMTP_PORT", "465")) SMTP_USER: str = os.getenv("SMTP_USER", "") SMTP_PASSWORD: str = os.getenv("SMTP_PASSWORD", "") SMTP_FROM: str = os.getenv("SMTP_FROM", "") SMTP_TO: str = os.getenv("SMTP_TO", "") # ---- 续费提醒 ---- RENEWAL_THRESHOLD_DAYS: int = int(os.getenv("RENEWAL_THRESHOLD_DAYS", "30")) # ---- 监控数据保留策略(自动清理)---- # MetricPoint 时序数据保留天数(Agent 高频上报,默认 30 天) METRICS_RETENTION_DAYS: int = int(os.getenv("METRICS_RETENTION_DAYS", "30")) # SecurityCheck 安全检查历史保留天数(默认 90 天) SECURITY_RETENTION_DAYS: int = int(os.getenv("SECURITY_RETENTION_DAYS", "90")) # EventLog 事件日志保留天数(默认 180 天) EVENT_LOG_RETENTION_DAYS: int = int(os.getenv("EVENT_LOG_RETENTION_DAYS", "180")) # 自动清理间隔(小时),0 表示禁用后台自动清理 CLEANUP_INTERVAL_HOURS: int = int(os.getenv("CLEANUP_INTERVAL_HOURS", "24")) # ---- Agent 上报频率限制 ---- # 同一 asset_id 两次上报的最小间隔(秒),0 表示不限制 AGENT_REPORT_MIN_INTERVAL: int = int(os.getenv("AGENT_REPORT_MIN_INTERVAL", "30")) # ---- CORS 允许来源(逗号分隔),默认本地 + Tailscale ---- CORS_ORIGINS: str = os.getenv( "CORS_ORIGINS", "http://127.0.0.1:8000,http://localhost:8000,https://dify.taile5765c.ts.net", ) settings = Settings()