mirror of
https://github.com/Portabase/agent.git
synced 2026-09-10 01:57:10 +00:00
b2b2733c4d
refactor: move build_tar to utils::compress refactor: move choose_restore_path to utils::common docs: remove docker-volume README section fix: keep archive path for multi-file non-docker-volume restores docs: trim docker-volume README section to essentials refactor: run docker-volume backup/restore inside spawn_blocking like other providers docs: enable docker socket, add volume example and security notes feat: sweep orphaned ephemeral helper containers on startup feat: docker-volume clean-replace restore via upload_to_container fix: serialize env-var access in docker-volume tests to avoid setenv/getenv UB feat: docker-volume backup via download_from_container feat: docker-volume ping via inspect_volume fix: return extraction dir for multi-file restore archives feat: gzip already-tar inputs directly instead of double-wrapping feat: docker helper (client, self-image, container lifecycle, sweep) feat: docker-volume provider
47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
use super::service::RestoreService;
|
|
use crate::services::backup::logger::JobLogger;
|
|
use crate::services::config::DatabaseConfig;
|
|
use anyhow::Result;
|
|
use std::sync::Arc;
|
|
use std::time::Instant;
|
|
use tempfile::TempDir;
|
|
|
|
impl RestoreService {
|
|
pub async fn execute_restore(
|
|
&self,
|
|
cfg: DatabaseConfig,
|
|
file_url: String,
|
|
expected_size: Option<String>,
|
|
) -> Result<()> {
|
|
let logger = Arc::new(JobLogger::new());
|
|
let start = Instant::now();
|
|
|
|
logger.log("info", "Database restoration job started".to_string());
|
|
|
|
let temp_dir = TempDir::new()?;
|
|
let tmp_path = temp_dir.path();
|
|
|
|
logger.log("info", format!("Created temp directory {}", tmp_path.display()));
|
|
|
|
let downloaded = self
|
|
.download_backup(&file_url, tmp_path, Arc::clone(&logger), expected_size)
|
|
.await?;
|
|
|
|
let backup_file = self
|
|
.prepare_archive(downloaded, tmp_path, &cfg.db_type, Arc::clone(&logger))
|
|
.await?;
|
|
|
|
let result = self.run_restore(cfg, backup_file, Arc::clone(&logger)).await?;
|
|
|
|
logger.log("info", "Database restore job finished".to_string());
|
|
|
|
let duration_ms = start.elapsed().as_millis() as f64;
|
|
let logs = Arc::try_unwrap(logger)
|
|
.unwrap_or_else(|_| JobLogger::new())
|
|
.into_entries();
|
|
self.send_result(result, logs, duration_ms).await?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|