fix(bootstrap): Skip early SecretsManager init if bootstrap incomplete, add logging
- Only initialize SecretsManager early if .env and init.json exist - Fix error handling for bootstrap() - no longer silently ignores failures - Add detailed logging to trace bootstrap flow - Log component installation decisions (installed, needs_install flags)
This commit is contained in:
parent
715a60315e
commit
4ea3b76adc
2 changed files with 42 additions and 11 deletions
|
|
@ -512,6 +512,8 @@ impl BootstrapManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn bootstrap(&mut self) -> Result<()> {
|
pub async fn bootstrap(&mut self) -> Result<()> {
|
||||||
|
info!("=== BOOTSTRAP STARTING ===");
|
||||||
|
|
||||||
// Generate certificates first (including for Vault)
|
// Generate certificates first (including for Vault)
|
||||||
info!("Generating TLS certificates...");
|
info!("Generating TLS certificates...");
|
||||||
if let Err(e) = self.generate_certificates().await {
|
if let Err(e) = self.generate_certificates().await {
|
||||||
|
|
@ -552,13 +554,20 @@ impl BootstrapManager {
|
||||||
|
|
||||||
for component in required_components {
|
for component in required_components {
|
||||||
// For vault, also check if it needs initialization
|
// For vault, also check if it needs initialization
|
||||||
|
let is_installed = pm.is_installed(component);
|
||||||
let needs_install = if component == "vault" {
|
let needs_install = if component == "vault" {
|
||||||
!pm.is_installed(component) || vault_needs_setup
|
!is_installed || vault_needs_setup
|
||||||
} else {
|
} else {
|
||||||
!pm.is_installed(component)
|
!is_installed
|
||||||
};
|
};
|
||||||
|
|
||||||
|
info!(
|
||||||
|
"Component {}: installed={}, needs_install={}, vault_needs_setup={}",
|
||||||
|
component, is_installed, needs_install, vault_needs_setup
|
||||||
|
);
|
||||||
|
|
||||||
if needs_install {
|
if needs_install {
|
||||||
|
info!("Installing/configuring component: {}", component);
|
||||||
// Quick check if component might be running - don't hang on this
|
// Quick check if component might be running - don't hang on this
|
||||||
let bin_path = pm.base_path.join("bin").join(component);
|
let bin_path = pm.base_path.join("bin").join(component);
|
||||||
let binary_name = pm
|
let binary_name = pm
|
||||||
|
|
@ -630,6 +639,7 @@ impl BootstrapManager {
|
||||||
|
|
||||||
// After Vault is installed, START the server then initialize it
|
// After Vault is installed, START the server then initialize it
|
||||||
if component == "vault" {
|
if component == "vault" {
|
||||||
|
info!("=== VAULT SETUP BLOCK ENTERED ===");
|
||||||
info!("Starting Vault server...");
|
info!("Starting Vault server...");
|
||||||
match pm.start("vault") {
|
match pm.start("vault") {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
|
|
@ -697,6 +707,7 @@ impl BootstrapManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
info!("=== BOOTSTRAP COMPLETED SUCCESSFULLY ===");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
38
src/main.rs
38
src/main.rs
|
|
@ -303,15 +303,28 @@ async fn main() -> std::io::Result<()> {
|
||||||
// Load .env for VAULT_* variables only (all other secrets come from Vault)
|
// Load .env for VAULT_* variables only (all other secrets come from Vault)
|
||||||
dotenvy::dotenv().ok();
|
dotenvy::dotenv().ok();
|
||||||
|
|
||||||
// Initialize SecretsManager early - this connects to Vault if configured
|
// Check if bootstrap is complete BEFORE trying to init SecretsManager
|
||||||
// Only VAULT_ADDR, VAULT_TOKEN, and VAULT_SKIP_VERIFY should be in .env
|
let env_path_early = std::path::Path::new("./.env");
|
||||||
if let Err(e) = crate::shared::utils::init_secrets_manager().await {
|
let vault_init_path_early = std::path::Path::new("./botserver-stack/conf/vault/init.json");
|
||||||
warn!(
|
let bootstrap_ready = env_path_early.exists() && vault_init_path_early.exists() && {
|
||||||
"Failed to initialize SecretsManager: {}. Falling back to env vars.",
|
std::fs::read_to_string(env_path_early)
|
||||||
e
|
.map(|content| content.contains("VAULT_TOKEN="))
|
||||||
);
|
.unwrap_or(false)
|
||||||
|
};
|
||||||
|
|
||||||
|
// Only initialize SecretsManager early if bootstrap is complete
|
||||||
|
// Otherwise, bootstrap will handle it
|
||||||
|
if bootstrap_ready {
|
||||||
|
if let Err(e) = crate::shared::utils::init_secrets_manager().await {
|
||||||
|
warn!(
|
||||||
|
"Failed to initialize SecretsManager: {}. Falling back to env vars.",
|
||||||
|
e
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
info!("SecretsManager initialized - fetching secrets from Vault");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
info!("SecretsManager initialized - fetching secrets from Vault");
|
trace!("Bootstrap not complete - skipping early SecretsManager init");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize logger early to capture all logs with filters for noisy libraries
|
// Initialize logger early to capture all logs with filters for noisy libraries
|
||||||
|
|
@ -508,8 +521,15 @@ async fn main() -> std::io::Result<()> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
info!("Bootstrap not complete - running full bootstrap...");
|
||||||
trace!(".env file not found, running bootstrap.bootstrap()...");
|
trace!(".env file not found, running bootstrap.bootstrap()...");
|
||||||
_ = bootstrap.bootstrap().await;
|
if let Err(e) = bootstrap.bootstrap().await {
|
||||||
|
error!("Bootstrap failed: {}", e);
|
||||||
|
return Err(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::Other,
|
||||||
|
format!("Bootstrap failed: {}", e),
|
||||||
|
));
|
||||||
|
}
|
||||||
trace!("bootstrap.bootstrap() completed");
|
trace!("bootstrap.bootstrap() completed");
|
||||||
progress_tx_clone
|
progress_tx_clone
|
||||||
.send(BootstrapProgress::StartingComponent(
|
.send(BootstrapProgress::StartingComponent(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue