2026-07-02 05:38:01 +08:00
|
|
|
//! 应用配置管理
|
|
|
|
|
//!
|
|
|
|
|
//! 优先从环境变量加载,回退到默认值。与原始 server 保持一致的配置方式。
|
|
|
|
|
|
2026-09-19 23:40:46 +08:00
|
|
|
/// JWT 密钥(必设,生产环境必须通过环境变量设置)
|
|
|
|
|
const JWT_SECRET_ENV: &str = "JWT_SECRET";
|
2026-07-02 05:38:01 +08:00
|
|
|
|
|
|
|
|
/// 应用配置
|
|
|
|
|
#[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"),
|
2026-09-19 23:40:46 +08:00
|
|
|
jwt_secret: std::env::var(JWT_SECRET_ENV)
|
|
|
|
|
.expect("JWT_SECRET must be set"),
|
2026-07-02 05:38:01 +08:00
|
|
|
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"),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|