mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-15 22:27:26 +08:00
199 lines
6.5 KiB
Rust
199 lines
6.5 KiB
Rust
use std::env;
|
|
use std::net::{IpAddr, SocketAddr};
|
|
use std::path::PathBuf;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct AppConfig {
|
|
pub server: ServerConfig,
|
|
pub database: DatabaseConfig,
|
|
pub health_check: HealthCheckConfig,
|
|
pub logging: LoggingConfig,
|
|
pub cors: CorsConfig,
|
|
pub security: SecurityConfig,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct ServerConfig {
|
|
pub host: String,
|
|
pub port: u16,
|
|
pub addr: SocketAddr,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct DatabaseConfig {
|
|
pub path: PathBuf,
|
|
pub max_connections: u32,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct HealthCheckConfig {
|
|
pub interval_seconds: u64,
|
|
pub timeout_seconds: u64,
|
|
pub max_retries: u32,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct LoggingConfig {
|
|
pub level: String,
|
|
pub rust_log: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct CorsConfig {
|
|
pub allowed_origins: Vec<String>,
|
|
pub allowed_methods: Vec<String>,
|
|
pub allowed_headers: Vec<String>,
|
|
pub enabled: bool,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct SecurityConfig {
|
|
pub enable_compression: bool,
|
|
pub secret_key: String,
|
|
pub jwt_secret: String,
|
|
pub admin_password: String,
|
|
}
|
|
|
|
impl Default for AppConfig {
|
|
fn default() -> Self {
|
|
Self::from_env().unwrap_or_else(|_| Self::default_config())
|
|
}
|
|
}
|
|
|
|
impl AppConfig {
|
|
pub fn from_env() -> Result<Self, env::VarError> {
|
|
let server_config = ServerConfig {
|
|
host: env::var("SERVER_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()),
|
|
port: env::var("SERVER_PORT")
|
|
.map(|s| s.parse().unwrap_or(8080))
|
|
.unwrap_or(8080),
|
|
addr: SocketAddr::from((
|
|
env::var("SERVER_HOST")
|
|
.unwrap_or_else(|_| "127.0.0.1".to_string())
|
|
.parse::<IpAddr>()
|
|
.unwrap(),
|
|
env::var("SERVER_PORT")
|
|
.map(|s| s.parse().unwrap_or(8080))
|
|
.unwrap_or(8080),
|
|
)),
|
|
};
|
|
|
|
let database_config = DatabaseConfig {
|
|
path: PathBuf::from(
|
|
env::var("DATABASE_PATH").unwrap_or_else(|_| "uptime.db".to_string()),
|
|
),
|
|
max_connections: env::var("DATABASE_MAX_CONNECTIONS")
|
|
.map(|s| s.parse().unwrap_or(10))
|
|
.unwrap_or(10),
|
|
};
|
|
|
|
let health_check_config = HealthCheckConfig {
|
|
interval_seconds: env::var("HEALTH_CHECK_INTERVAL")
|
|
.map(|s| s.parse().unwrap_or(30))
|
|
.unwrap_or(30),
|
|
timeout_seconds: env::var("HEALTH_CHECK_TIMEOUT")
|
|
.map(|s| s.parse().unwrap_or(10))
|
|
.unwrap_or(10),
|
|
max_retries: env::var("HEALTH_CHECK_RETRIES")
|
|
.map(|s| s.parse().unwrap_or(3))
|
|
.unwrap_or(3),
|
|
};
|
|
|
|
let logging_config = LoggingConfig {
|
|
level: env::var("LOG_LEVEL").unwrap_or_else(|_| "info".to_string()),
|
|
rust_log: env::var("RUST_LOG").unwrap_or_else(|_| "info".to_string()),
|
|
};
|
|
|
|
let cors_config = CorsConfig {
|
|
allowed_origins: env::var("CORS_ALLOWED_ORIGINS")
|
|
.unwrap_or_else(|_| "http://localhost:3000,http://localhost:8080".to_string())
|
|
.split(',')
|
|
.map(|s| s.trim().to_string())
|
|
.collect(),
|
|
allowed_methods: env::var("CORS_ALLOWED_METHODS")
|
|
.unwrap_or_else(|_| "GET,POST,PUT,DELETE,OPTIONS".to_string())
|
|
.split(',')
|
|
.map(|s| s.trim().to_string())
|
|
.collect(),
|
|
allowed_headers: env::var("CORS_ALLOWED_HEADERS")
|
|
.unwrap_or_else(|_| "content-type,authorization".to_string())
|
|
.split(',')
|
|
.map(|s| s.trim().to_string())
|
|
.collect(),
|
|
enabled: env::var("ENABLE_CORS")
|
|
.map(|s| s.parse().unwrap_or(true))
|
|
.unwrap_or(true),
|
|
};
|
|
|
|
let security_config = SecurityConfig {
|
|
enable_compression: env::var("ENABLE_COMPRESSION")
|
|
.map(|s| s.parse().unwrap_or(true))
|
|
.unwrap_or(true),
|
|
secret_key: env::var("SECRET_KEY").unwrap_or_else(|_| "default-secret-key".to_string()),
|
|
jwt_secret: env::var("JWT_SECRET").unwrap_or_else(|_| "default-jwt-secret".to_string()),
|
|
admin_password: env::var("ADMIN_PASSWORD").unwrap_or_else(|_| "admin123".to_string()),
|
|
};
|
|
|
|
Ok(AppConfig {
|
|
server: server_config,
|
|
database: database_config,
|
|
health_check: health_check_config,
|
|
logging: logging_config,
|
|
cors: cors_config,
|
|
security: security_config,
|
|
})
|
|
}
|
|
|
|
pub fn default_config() -> Self {
|
|
Self {
|
|
server: ServerConfig {
|
|
host: "127.0.0.1".to_string(),
|
|
port: 8080,
|
|
addr: SocketAddr::from(([127, 0, 0, 1], 8080)),
|
|
},
|
|
database: DatabaseConfig {
|
|
path: PathBuf::from("uptime.db"),
|
|
max_connections: 10,
|
|
},
|
|
health_check: HealthCheckConfig {
|
|
interval_seconds: 30,
|
|
timeout_seconds: 10,
|
|
max_retries: 3,
|
|
},
|
|
logging: LoggingConfig {
|
|
level: "info".to_string(),
|
|
rust_log: "info".to_string(),
|
|
},
|
|
cors: CorsConfig {
|
|
allowed_origins: vec![
|
|
"http://localhost:3000".to_string(),
|
|
"http://localhost:8080".to_string(),
|
|
],
|
|
allowed_methods: vec![
|
|
"GET".to_string(),
|
|
"POST".to_string(),
|
|
"PUT".to_string(),
|
|
"DELETE".to_string(),
|
|
"OPTIONS".to_string(),
|
|
],
|
|
allowed_headers: vec!["content-type".to_string(), "authorization".to_string()],
|
|
enabled: true,
|
|
},
|
|
security: SecurityConfig {
|
|
enable_compression: true,
|
|
secret_key: "default-secret-key".to_string(),
|
|
jwt_secret: "default-jwt-secret".to_string(),
|
|
admin_password: "admin123".to_string(),
|
|
},
|
|
}
|
|
}
|
|
|
|
pub fn is_development(&self) -> bool {
|
|
env::var("NODE_ENV").unwrap_or_else(|_| "development".to_string()) == "development"
|
|
}
|
|
|
|
pub fn is_production(&self) -> bool {
|
|
env::var("NODE_ENV").unwrap_or_else(|_| "development".to_string()) == "production"
|
|
}
|
|
}
|