rustic-rs
rustic_core
Rust

rustic_core - library for fast, encrypted, deduplicated backups that powers rustic-rs

Last updated Jun 20, 2026
81
Stars
41
Forks
70
Issues
0
Stars/day
Attention Score
50
Language breakdown
Rust 99.8%
Just 0.2%
โ–ธ Files click to expand
README

Library for fast, encrypted, and deduplicated backups


About

This library is powering rustic-rs. A backup tool that provides fast, encrypted, deduplicated backups. It reads and writes the restic repository format, which is described in their design document.

Note: rustic_core is in an early development stage and its API is subject to change in the next releases. If you want to give feedback on that, please open a thread in our discussions.

Contact

You can ask questions in the Discussions or have a look at the FAQ.

| Contact | Where? | | ------------- | --------------------------------------------------------------------------------------------------------------- | | Issue Tracker | GitHub Issues | | Discord | Discord | | Discussions | GitHub Discussions |

Usage

Add this to your Cargo.toml:

[dependencies]
rustic_core = "0"

Crate features

This crate exposes a few features for controlling dependency usage:

  • cli - Enables support for CLI features by enabling merge and clap
features. This feature is disabled by default.
  • merge - Enables support for merging multiple values into one, which
enables the conflate dependency. This is needed for parsing commandline arguments and merging them into one (e.g. config). *This feature is disabled by default*.
  • clap - Enables a dependency on the clap crate and enables parsing from
the commandline. This feature is disabled by default.

Examples

Example: Initializing a new repository

use rustic_backend::BackendOptions;
use rustic_core::{ConfigOptions, KeyOptions, Repository, RepositoryOptions};
use simplelog::{Config, LevelFilter, SimpleLogger};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> { // Display info logs let _ = SimpleLogger::init(LevelFilter::Info, Config::default());

// Initialize Backends let backends = BackendOptions::default() .repository("/tmp/repo") .to_backends()?;

// Init repository let repo_opts = RepositoryOptions::default().password("test"); let key_opts = KeyOptions::default(); let config_opts = ConfigOptions::default(); let repo = Repository::new(&repoopts, &backends)?.init(&keyopts, &configopts)?;

// -> use _repo for any operation on an open repository Ok(()) }

Example: Creating a new snapshot

use rustic_backend::BackendOptions;
use rustic_core::{BackupOptions, PathList, Repository, RepositoryOptions, SnapshotOptions};
use simplelog::{Config, LevelFilter, SimpleLogger};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> { // Display info logs let _ = SimpleLogger::init(LevelFilter::Info, Config::default());

// Initialize Backends let backends = BackendOptions::default() .repository("/tmp/repo") .repo_hot("/tmp/repo2") .to_backends()?;

// Open repository let repo_opts = RepositoryOptions::default().password("test");

let repo = Repository::new(&repo_opts, &backends)? .open()? .toindexedids()?;

let backup_opts = BackupOptions::default(); let source = PathList::from_string(".")?.sanitize()?; let snap = SnapshotOptions::default() .add_tags("tag1,tag2")? .to_snapshot()?;

// Create snapshot let snap = repo.backup(&backup_opts, &source, snap)?;

println!("successfully created snapshot:\n{snap:#?}"); Ok(()) }

Example: Restoring a snapshot

use rustic_backend::BackendOptions;
use rustic_core::{LocalDestination, LsOptions, Repository, RepositoryOptions, RestoreOptions};
use simplelog::{Config, LevelFilter, SimpleLogger};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> { // Display info logs let _ = SimpleLogger::init(LevelFilter::Info, Config::default());

// Initialize Backends let backends = BackendOptions::default() .repository("/tmp/repo") .to_backends()?;

// Open repository let repo_opts = RepositoryOptions::default().password("test"); let repo = Repository::new(&repo_opts, &backends)? .open()? .to_indexed()?;

// use latest snapshot without filtering snapshots let node = repo.nodefromsnapshotpath("latest", || true)?;

// use list of the snapshot contents using no additional filtering let streamer_opts = LsOptions::default(); let ls = repo.ls(&node, &streamer_opts)?;

let destination = "./restore/"; // restore to this destination dir let create = true; // create destination dir, if it doesn't exist let dest = LocalDestination::new(destination, create, !node.is_dir())?;

let opts = RestoreOptions::default(); let dry_run = false; // create restore infos. Note: this also already creates needed dirs in the destination let restoreinfos = repo.preparerestore(&opts, ls.clone(), &dest, dry_run)?;

repo.restore(restore_infos, &opts, ls, &dest)?; Ok(()) }

Example: Checking a repository

use rustic_backend::BackendOptions;
use rustic_core::{CheckOptions, Repository, RepositoryOptions};
use simplelog::{Config, LevelFilter, SimpleLogger};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> { // Display info logs let _ = SimpleLogger::init(LevelFilter::Info, Config::default());

// Initialize Backends let backends = BackendOptions::default() .repository("/tmp/repo") .to_backends()?;

// Open repository let repo_opts = RepositoryOptions::default().password("test"); let repo = Repository::new(&repo_opts, &backends)?.open()?;

// Check repository with standard options but omitting cache checks let opts = CheckOptions::default().trust_cache(true); repo.check(opts)?; Ok(()) }

Contributing

Found a bug? Open an issue!

Got an idea for an improvement? Don't keep it to yourself!

features via a pull requests!

Please make sure, that you read the contribution guide.

Minimum Rust version policy

This crate's minimum supported rustc version is 1.88.0.

The current policy is that the minimum Rust version required to use this crate can be increased in minor version updates. For example, if crate 1.0 requires Rust 1.20.0, then crate 1.0.z for all values of z will also require Rust 1.20.0 or newer. However, crate 1.y for y > 0 may require a newer minimum version of Rust.

In general, this crate will be conservative with respect to the minimum supported version of Rust.

License

Licensed under either of:

๐Ÿ”— More in this category

ยฉ 2026 GitRepoTrend ยท rustic-rs/rustic_core ยท Updated daily from GitHub