diff --git a/server_manager/src/core/secrets.rs b/server_manager/src/core/secrets.rs index d78702b..0115118 100644 --- a/server_manager/src/core/secrets.rs +++ b/server_manager/src/core/secrets.rs @@ -16,6 +16,7 @@ pub struct Secrets { pub gitea_db_password: Option, pub roundcube_db_password: Option, pub yourls_admin_password: Option, + pub vaultwarden_admin_token: Option, } impl Secrets { @@ -65,6 +66,10 @@ impl Secrets { secrets.yourls_admin_password = Some(generate_hex(16)?); changed = true; } + if secrets.vaultwarden_admin_token.is_none() { + secrets.vaultwarden_admin_token = Some(generate_hex(16)?); + changed = true; + } if changed { info!("Generated new secrets."); diff --git a/server_manager/src/main.rs b/server_manager/src/main.rs index 86eec0a..c92dc2f 100644 --- a/server_manager/src/main.rs +++ b/server_manager/src/main.rs @@ -88,6 +88,7 @@ async fn run_install() -> Result<()> { if status.success() { info!("Server Manager Stack Deployed Successfully! 🚀"); + print_deployment_summary(&secrets); } else { error!("Docker Compose failed."); } @@ -95,6 +96,36 @@ async fn run_install() -> Result<()> { Ok(()) } +fn print_deployment_summary(secrets: &secrets::Secrets) { + println!("\n================================================================================="); + println!(" DEPLOYMENT SUMMARY 🚀"); + println!("================================================================================="); + println!("{:<15} | {:<25} | {:<15} | {}", "Service", "URL", "User", "Password / Info"); + println!("{:<15} | {:<25} | {:<15} | {}", "-------", "---", "----", "---------------"); + + let print_row = |service: &str, url: &str, user: &str, pass: &str| { + println!("{:<15} | {:<25} | {:<15} | {}", service, url, user, pass); + }; + + // Helper to format Option + let pass = |opt: &Option| opt.clone().unwrap_or_else(|| "ERROR".to_string()); + + print_row("Nginx Proxy", "http://:81", "admin@example.com", "changeme"); + print_row("Portainer", "http://:9000", "admin", "Set on first login"); + print_row("Nextcloud", "https://:4443", "admin", &pass(&secrets.nextcloud_admin_password)); + print_row("Vaultwarden", "http://:8001/admin", "(Token)", &pass(&secrets.vaultwarden_admin_token)); + print_row("Gitea", "http://:3000", "Register", "DB pre-configured"); + print_row("GLPI", "http://:8088", "glpi", "glpi (Change immediately!)"); + print_row("Yourls", "http://:8003/admin", "admin", &pass(&secrets.yourls_admin_password)); + print_row("Roundcube", "http://:8090", "-", "Login with Mail creds"); + print_row("MailServer", "PORTS: 25, 143...", "CLI", "docker exec -ti mailserver setup ..."); + print_row("Plex", "http://:32400/web", "-", "Follow Web Setup"); + print_row("ArrStack", "http://:8989 (Sonarr)", "-", "No auth by default"); + + println!("=================================================================================\n"); + println!("NOTE: Replace with your server's IP address."); +} + fn run_status() { let hw = hardware::HardwareInfo::detect(); println!("=== System Status ==="); diff --git a/server_manager/src/services/apps.rs b/server_manager/src/services/apps.rs index 7e37e82..434e0c4 100644 --- a/server_manager/src/services/apps.rs +++ b/server_manager/src/services/apps.rs @@ -11,6 +11,11 @@ impl Service for VaultwardenService { fn name(&self) -> &'static str { "vaultwarden" } fn image(&self) -> &'static str { "vaultwarden/server:latest" } fn ports(&self) -> Vec { vec!["8001:80".to_string()] } + fn env_vars(&self, _hw: &HardwareInfo, secrets: &Secrets) -> HashMap { + let mut vars = HashMap::new(); + vars.insert("ADMIN_TOKEN".to_string(), secrets.vaultwarden_admin_token.clone().unwrap_or_default()); + vars + } fn volumes(&self, _hw: &HardwareInfo) -> Vec { vec!["./config/vaultwarden:/data".to_string()] } @@ -64,6 +69,15 @@ impl Service for GiteaService { fn name(&self) -> &'static str { "gitea" } fn image(&self) -> &'static str { "gitea/gitea:latest" } fn ports(&self) -> Vec { vec!["3000:3000".to_string(), "2222:22".to_string()] } + fn env_vars(&self, _hw: &HardwareInfo, secrets: &Secrets) -> HashMap { + let mut vars = HashMap::new(); + vars.insert("GITEA__database__DB_TYPE".to_string(), "mysql".to_string()); + vars.insert("GITEA__database__HOST".to_string(), "mariadb:3306".to_string()); + vars.insert("GITEA__database__NAME".to_string(), "gitea".to_string()); + vars.insert("GITEA__database__USER".to_string(), "gitea".to_string()); + vars.insert("GITEA__database__PASSWD".to_string(), secrets.gitea_db_password.clone().unwrap_or_default()); + vars + } fn volumes(&self, _hw: &HardwareInfo) -> Vec { vec![ "./config/gitea:/data".to_string(), diff --git a/server_manager/tests/integration_tests.rs b/server_manager/tests/integration_tests.rs index a9cfb6b..d3e4578 100644 --- a/server_manager/tests/integration_tests.rs +++ b/server_manager/tests/integration_tests.rs @@ -24,6 +24,7 @@ fn test_generate_compose_structure() { mailserver_password: Some("mailpass".to_string()), nextcloud_admin_password: Some("nextcloudadmin".to_string()), roundcube_db_password: Some("roundcubepass".to_string()), + vaultwarden_admin_token: Some("token".to_string()), }; // 2. Build Structure