mirror of
https://github.com/Portabase/agent.git
synced 2026-09-11 14:00:14 +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
46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
use anyhow::Result;
|
|
use async_trait::async_trait;
|
|
use std::path::{Path, PathBuf};
|
|
use std::sync::Arc;
|
|
|
|
use super::{backup, ping, restore};
|
|
use crate::domain::factory::Database;
|
|
use crate::services::backup::logger::JobLogger;
|
|
use crate::services::config::DatabaseConfig;
|
|
use crate::utils::locks::{DbOpLock, FileLock};
|
|
|
|
pub struct DockerVolumeDatabase {
|
|
cfg: DatabaseConfig,
|
|
}
|
|
|
|
impl DockerVolumeDatabase {
|
|
pub fn new(cfg: DatabaseConfig) -> Self {
|
|
Self { cfg }
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl Database for DockerVolumeDatabase {
|
|
fn file_extension(&self) -> &'static str {
|
|
".tar"
|
|
}
|
|
|
|
async fn ping(&self) -> Result<bool> {
|
|
ping::run(self.cfg.clone()).await
|
|
}
|
|
|
|
async fn backup(&self, dir: &Path, logger: Arc<JobLogger>) -> Result<PathBuf> {
|
|
FileLock::acquire(&self.cfg.generated_id, DbOpLock::Backup.as_str()).await?;
|
|
let res = backup::run(self.cfg.clone(), dir.to_path_buf(), logger).await;
|
|
FileLock::release(&self.cfg.generated_id).await?;
|
|
res
|
|
}
|
|
|
|
async fn restore(&self, file: &Path, logger: Arc<JobLogger>) -> Result<()> {
|
|
FileLock::acquire(&self.cfg.generated_id, DbOpLock::Restore.as_str()).await?;
|
|
let res = restore::run(self.cfg.clone(), file.to_path_buf(), logger).await;
|
|
FileLock::release(&self.cfg.generated_id).await?;
|
|
res
|
|
}
|
|
}
|