Comparison between rustic and restic

General differences

resticrustic
programming languageGoRust
test coverage❌ (only few tests implemented)
config profile support❌ (wrapper tools available)
lockinglock files in repositorylock-free operations, two-phase pruning
cold storage❌ (no direct support, may work in special cases)✅ (full support including warm-up of needed data)
in-repo config✅ (see below for details)
logging-v or --quiet, no log-file support--log-level, supports log-file output
returns error code
available as library✅ rustic_core

Storage backends

backendresticrustic
local✅ (built-in)✅ (built-in)
sftp✅ (using external ssh command)✅ (built-in using opendal, windows not supported)
rest✅ (built-in)✅ (built-in)
s3✅ (built-in)✅ (built-in using opendal)
swift✅ (built-in)✅ (built-in using opendal)
b2✅ (built-in)✅ (built-in using opendal)
azure✅ (built-in)✅ (built-in using opendal)
gs✅ (built-in)✅ (built-in using opendal)
dropbox✅ (built-in using opendal)
ftp✅ (built-in using opendal)
gdrive✅ (built-in using opendal)
onedrive✅ (built-in using opendal)
webdav✅ (built-in using opendal)
opendal (other services)✅ (built-in using opendal)
rclone✅ (via stdin, using external rclone command)✅ (via http on localhost, using external rclone command)

Commands

commandresticrustic
backup
cache
cat
config❌ (no in-repo config)
check
copy
diff
dump
find
forget
generatecompletions
init
key list
key add
key remove
key passwd
list
ls
merge
migrate❌ (not needed; repo version migration via config)
mount❌ (WIP)
prune
recover
repair index
repair packs
repair snapshots
repoinfo
restore
rewrite
self-update
show-config
snapshots
stats❌ (but there is repoinfo)
tag
unlocklock-free
webdav

Information saved in snapshots

informationresticrustic
from repo design info
program version used
summary (size,…)❌ (WIP)
used command
label
description
delete (protection)

General options

optionresticrustic
--cacert
--cache-dir✅ (or in config profile)
--cleanup-cache
--compression✅ (auto,max,off); needed in every call✅ (-7..22) configure once in in-repo config
--dry-run✅ (or in config profile)
--json
--key-hint
--limit-download
--limit-upload
--log-file✅ (or in config profile)
--no-cache✅ (or in config profile)
--no-extra-verify✅ needed in every call✅ configure once using config
--no-lock✅ all operations are lock-free
--no-progress✅ (or in config profile)
--progress-intervall✅ (via env variable)✅ (or in config profile)
--option✅ as cmd arg or env variable✅ via config profile or env variable
--pack-size✅ fix limit; needed in every call✅ fix or dynamic limit, configure once in in-repo config
--password-command✅ (or in config profile)
--password-file✅ (or in config profile)
--quiet
--repo✅ (or in config profile)
--repo-hot❌ (no cold-storage support)✅ (or in config profile)
--repository-file❌ (use repository in config profile instead)
--retry-locknot needed; lock-free
--tls-client-cert
--use-profile❌ (no config profile support)✅ (or in config profile for recursively using profiles)
--verbose (multiple times)--log-level
--warm-up❌ (no cold-storage support)✅ (or in config profile)

rustic in-repo config options

optionresticrustic
append_only
compression✅ (by --compression)
treepack_size❌ (only all packs: --pack-size)
treepack_growfactor
treepack_size_limit
datapack_size❌ (only all packs: --pack-size)
datapack_growfactor
datapack_size_limit
min_packsize_tolerate_percent❌ (hardcoded 80% for prune --repack-small)
max_packsize_tolerate_percent
extra_verify✅ (default, can be unset using --no-extra-verify)✅ (default)

Snapshot filtering

filterresticrustic (options also in config profile)
by host--host--filter-host
by label--filter-label
by paths--paths--filter-paths
by tags--tags--filter-tags
custom--filter-fn (using Rhai)

Comparison of important commands

init

optionresticrustic
--copy-chunker-params❌ (not needed, see copy command)
--from-*❌ (not needed, see copy command)
--hostname❌ (always sets hostname)
--repository-version✅ (use --set-version)
--set-*❌ (no in-repo config support)
--username❌ (always sets username)
--with-created❌ (always sets creation time)

backup

generalresticrustic
allow to backup relative paths
optionresticrustic (options also in config profile)
--as-path
--command
--custom-ignorefile
--description
--description-from
--delete-never
--delete-after
--exclude--glob
--exclude-file--glob-file
--exclude-caches❌ (use --exclude-if-present)
--exclude-if-present✅ (+ support for header parsing)✅ (no header parsing)
--exclude-larger-than
--files-from
--files-from-raw
--files-from-verbatim
--force
--git-ignore❌ (roadmap: 0.19)
--group-by✅ (host/paths/tags)✅ (host/label/paths/tags)
--host
--iexclude--iglob
--iexclude-file--iglob-file
--ignore-ctime
--ignore-inode
--ignore-devid
--init
--label
--no-require-git❌ (no --git-ignore)
--no-scan
--one-file-system
--parent
--read-concurrency❌ (hardcoded)
--skip-identical-parent
--stdin✅ (use - as backup source)
--stdin-filename
--tag
--time
--with-atime

restore

generalresticrustic
scan and use already existing files❌ (roadmap: 0.17)
resumable restore❌ (roadmap: 0.17)
restore hard links
<snapshotID>:<subfolder> syntax
<snapshotID>:<subfolder>/file syntax
optionresticrustic
filtering options for latest
--delete
--exclude--glob
--iexclude--iglob
--iinclude--iglob
--include--glob
--no-ownership
--numeric-id
--sparse
--target✅ (give target as second CLI argument)
--verify❌ (but diff can be used to verify after)
--verify-existing❌ (no scanning of existing files)

dump

generalresticrustic
dump files
dump dirs
optionresticrustic
snapshot filtering options for latest
--archive❌ (no dumping of dirs)

forget

generalresticrustic
allow to keep all XXX
respect “no delete” options in snapshot
optionresticrustic (options also in config profile)
snapshot filtering options
--keep-last
--keep-daily
--keep-weekly
--keep-monthly
--keep-quarter-yearly
--keep-half-yearly
--keep-yearly
--keep-within
--keep-within-hourly
--keep-within-daily
--keep-within-weekly
--keep-within-monthly
--keep-within-quarter-yearly
--keep-within-half-yearly
--keep-within-yearly
--keep-tag
--compact
--group-by✅ (host/paths/tags)✅ (host/label/paths/tags)
--prune

prune

generalresticrustic
prune plan without reading pack files
prune parallel to backup (two-phase prune)❌ (roadmap: 0.19)
different pack sizes for tree/data packs
resumable prune❌ (roadmap: 0.17)
(option to) resize packs
optionresticrustic
--fast-repack
--instant-delete✅ (default, no two-phase)
--keep-pack
--keep-delete❌ (no two-phase)
--max-repack-size--max-repack (size/%/unlimited)
--max-unused
--repack-all
--repack-cacheable-only
--repack-small✅ (default behavior; to unset use --no-resize)
--repack-uncompressed
--unsafe-recover-no-free-space--early-delete-index

check

generalresticrustic
check index files
check index vs packs
check snapshot files
(optionally) check pack files
cache policycreate temporary (use existing: roadmap 0.18)use existing
check cache integrity
check hot/cold integrity❌ (no cold storage support)
optionresticrustic
--read-data
--read-data-subset
--trust-cache❌ (no cache integrity check)
--with-cache✅ (default behavior)

copy

generalresticrustic
source/target given byCLI optionsin config profile
multiple targets
check for matching chunker parameters
optionresticrustic
snapshot filtering options
--from-*✅ (target is --repository)✅ (source is --repository, target in config profile)
--init❌ (extra run of init --copy-chunker-params)

snapshots

generalresticrustic
summarize identical snapshots (like +3)
show summary information (sizes)❌ (WIP)
optionresticrustic
snapshot filtering options
--all
--compact
--group-by✅ (host/paths/tags)✅ (host/label/paths/tags)
--latest
--long

ls

optionresticrustic
snapshot filtering options for latest
--glob
--glob-file
--human-readable
--iglob
--iglob-file
--long
--numeric-uid-gid
--summary
--recursive

diff

generalresticrustic
allow latest
diff with local files
<snapshotID>:<subfolder> syntax
<snapshotID>:<subfolder>/file syntax
optionresticrustic
snapshot filtering options for latest❌ (no latest support)
--glob
--glob-file
--iglob
--iglob-file
--metadata
--no-content
exclude options for local files❌ (no diff with local files)
Last change: 2024-04-28, commit: e8a890b