2026-07-02 05:38:01 +08:00

60 lines
2.1 KiB
Rust

//! 应用配置管理
//!
//! 优先从环境变量加载,回退到默认值。与原始 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 环境变量");
}
}
}