//! 应用配置管理 //! //! 优先从环境变量加载,回退到默认值。与原始 server 保持一致的配置方式。 /// 默认 JWT 密钥(开发环境用,生产环境必须通过环境变量覆盖) pub const JWT_SECRET_DEFAULT: &str = "pms-dev-secret-change-me-in-production"; /// 用户默认密码(创建用户或重置密码时使用) pub const DEFAULT_PASSWORD: &str = "123456"; /// 应用配置 #[allow(dead_code)] pub struct Config { pub database_url: String, pub redis_url: String, pub host: String, pub port: u16, /// JWT 签名密钥 pub jwt_secret: String, /// 导出目录 pub export_dir: String, /// 节点心跳超时(秒) pub node_heartbeat_timeout: u64, } impl Config { /// 从环境变量加载配置,优先读取 `.env` 文件 pub fn from_env() -> Self { let _ = dotenvy::dotenv(); Self { database_url: std::env::var("DATABASE_URL") .expect("DATABASE_URL must be set"), redis_url: std::env::var("REDIS_URL") .expect("REDIS_URL must be set"), host: std::env::var("HOST") .unwrap_or_else(|_| "0.0.0.0".to_string()), port: std::env::var("PORT") .unwrap_or_else(|_| "3000".to_string()) .parse() .expect("PORT must be a valid number"), jwt_secret: std::env::var("JWT_SECRET") .unwrap_or_else(|_| JWT_SECRET_DEFAULT.to_string()), export_dir: std::env::var("EXPORT_DIR") .unwrap_or_else(|_| "./exports".to_string()), node_heartbeat_timeout: std::env::var("NODE_HEARTBEAT_TIMEOUT") .unwrap_or_else(|_| "180".to_string()) .parse() .expect("NODE_HEARTBEAT_TIMEOUT must be a valid number"), } } /// 校验配置安全性 pub fn validate(&self) { if self.jwt_secret == JWT_SECRET_DEFAULT { tracing::warn!("使用默认 JWT 密钥,生产环境请设置 JWT_SECRET 环境变量"); } } }