ok buster run and stop working well

This commit is contained in:
dal 2025-05-07 17:27:04 -06:00
parent e616c4a166
commit c62d09536c
No known key found for this signature in database
GPG Key ID: 16F4B0E1E9F61122
1 changed files with 51 additions and 51 deletions

View File

@ -4,8 +4,8 @@ use std::process::{Command, Stdio};
use crate::error::BusterError;
use indicatif::{ProgressBar, ProgressStyle};
use std::time::Duration;
use tempfile::TempDir;
use rust_embed::RustEmbed;
use dirs;
#[derive(RustEmbed)]
#[folder = "../../"]
@ -18,16 +18,24 @@ use rust_embed::RustEmbed;
#[exclude = "supabase/docker-compose.override.yml"]
struct StaticAssets;
async fn setup_temporary_compose_environment() -> Result<TempDir, BusterError> {
let temp_dir = TempDir::new().map_err(|e| {
BusterError::CommandError(format!("Failed to create temporary directory: {}", e))
async fn setup_persistent_app_environment() -> Result<PathBuf, BusterError> {
let home_dir = dirs::home_dir()
.ok_or_else(|| BusterError::CommandError("Failed to get home directory. Cannot set up persistent app path.".to_string()))?;
let app_base_dir = home_dir.join(".buster");
fs::create_dir_all(&app_base_dir).map_err(|e| {
BusterError::CommandError(format!(
"Failed to create persistent app directory at {}: {}",
app_base_dir.display(),
e
))
})?;
let base_path = temp_dir.path();
for filename_cow in StaticAssets::iter() {
let filename = filename_cow.as_ref();
let asset = StaticAssets::get(filename).ok_or_else(|| BusterError::CommandError(format!("Failed to get embedded asset: {}", filename)))?;
let target_file_path = base_path.join(filename);
let asset = StaticAssets::get(filename)
.ok_or_else(|| BusterError::CommandError(format!("Failed to get embedded asset: {}", filename)))?;
let target_file_path = app_base_dir.join(filename);
if let Some(parent) = target_file_path.parent() {
fs::create_dir_all(parent).map_err(|e| {
@ -49,12 +57,12 @@ async fn setup_temporary_compose_environment() -> Result<TempDir, BusterError> {
})?;
}
let supabase_volumes_path = base_path.join("supabase/volumes");
fs::create_dir_all(supabase_volumes_path.join("functions")).map_err(|e| BusterError::CommandError(format!("Failed to create supabase/volumes/functions: {}", e)))?;
let supabase_volumes_functions_path = app_base_dir.join("supabase/volumes/functions");
fs::create_dir_all(supabase_volumes_functions_path).map_err(|e| BusterError::CommandError(format!("Failed to create supabase/volumes/functions in persistent app dir: {}", e)))?;
let local_dotenv_path = PathBuf::from("/Users/dallin/buster/buster/.env");
if local_dotenv_path.exists() {
let target_dotenv_path = base_path.join(".env");
let target_dotenv_path = app_base_dir.join(".env");
fs::copy(&local_dotenv_path, &target_dotenv_path).map_err(|e| {
BusterError::CommandError(format!(
"Failed to copy local .env from {} to {}: {}",
@ -67,20 +75,19 @@ async fn setup_temporary_compose_environment() -> Result<TempDir, BusterError> {
println!("Warning: Specified .env file not found at {}. Services might not configure correctly if .env is required by docker-compose.yml.", local_dotenv_path.display());
}
Ok(temp_dir)
Ok(app_base_dir)
}
async fn run_docker_compose_command(args: &[&str], operation_name: &str) -> Result<(), BusterError> {
let temp_dir = setup_temporary_compose_environment().await?;
let temp_dir_path = temp_dir.path();
let persistent_app_dir = setup_persistent_app_environment().await?;
let persistent_project_path = PathBuf::from("/Users/dallin/buster/buster");
let data_db_path = persistent_app_dir.join("supabase/volumes/db/data");
fs::create_dir_all(&data_db_path)
.map_err(|e| BusterError::CommandError(format!("Failed to create persistent data directory at {}: {}", data_db_path.display(), e)))?;
let supabase_volumes_persistent_path = persistent_project_path.join("supabase/volumes");
fs::create_dir_all(supabase_volumes_persistent_path.join("db/data"))
.map_err(|e| BusterError::CommandError(format!("Failed to create persistent supabase/volumes/db/data: {}", e)))?;
fs::create_dir_all(supabase_volumes_persistent_path.join("storage"))
.map_err(|e| BusterError::CommandError(format!("Failed to create persistent supabase/volumes/storage: {}", e)))?;
let data_storage_path = persistent_app_dir.join("supabase/volumes/storage");
fs::create_dir_all(&data_storage_path)
.map_err(|e| BusterError::CommandError(format!("Failed to create persistent data directory at {}: {}", data_storage_path.display(), e)))?;
let pb = ProgressBar::new_spinner();
pb.enable_steady_tick(Duration::from_millis(120));
@ -97,22 +104,19 @@ async fn run_docker_compose_command(args: &[&str], operation_name: &str) -> Resu
}
let mut cmd = Command::new("docker");
cmd.current_dir(&persistent_app_dir);
cmd.arg("compose")
.arg("-p")
.arg("buster")
.arg("--project-directory")
.arg(persistent_project_path)
.arg("-f")
.arg(temp_dir_path.join("docker-compose.yml"))
.args(args)
.stdout(Stdio::null())
.stderr(Stdio::null());
.arg("docker-compose.yml")
.args(args);
let status_result = cmd.status();
let output = cmd.output().map_err(|e| {
BusterError::CommandError(format!("Failed to execute docker compose {}: {}", args.join(" "), e))
})?;
match status_result {
Ok(status) => {
if status.success() {
if output.status.success() {
pb.finish_with_message(format!(
"Buster services {} successfully.",
operation_name.to_lowercase()
@ -120,22 +124,18 @@ async fn run_docker_compose_command(args: &[&str], operation_name: &str) -> Resu
Ok(())
} else {
let err_msg = format!(
"docker compose {} failed (status: {}). Check Docker logs for details (context: {}).",
"docker compose {} failed (status: {}). Logs:\nWorking directory: {}\nStdout:\n{}\nStderr:\n{}",
args.join(" "),
status,
temp_dir_path.display()
output.status,
persistent_app_dir.display(),
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr)
);
pb.abandon_with_message(format!("Error: {}", err_msg));
pb.abandon_with_message(format!("Error: docker compose {} failed. See console for details.", args.join(" ")));
println!("\nDocker Compose Error Details:\n{}", err_msg);
Err(BusterError::CommandError(err_msg))
}
}
Err(e) => {
let err_msg = format!("Failed to execute docker compose {}: {}", args.join(" "), e);
pb.abandon_with_message(format!("Error: {}", err_msg));
Err(BusterError::CommandError(err_msg))
}
}
}
pub async fn start() -> Result<(), BusterError> {
run_docker_compose_command(&["up", "-d"], "Starting").await