109 lines
2.8 KiB
Markdown
109 lines
2.8 KiB
Markdown
|
[![image](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)
|
||
|
|
||
|
# rbackup - An rsync-based backup tool
|
||
|
|
||
|
Yet another rsync-based tool for automating backups and using plugins.
|
||
|
|
||
|
## Rationales
|
||
|
|
||
|
- \'Keep It Simple Stupid\'
|
||
|
- Automate as much of the process as possible. This includes options,
|
||
|
path selections, and managing snapshots
|
||
|
- Store backups in a format that does not require a program or script;
|
||
|
this means that backups can be browsed with a file manager
|
||
|
- Deleted files are kept in old snapshots and rotated out using the
|
||
|
rotation script
|
||
|
- Subsequent backups do not touch each other, unless specified by the
|
||
|
user. This reduces the risk of overwriting backups with corrupted
|
||
|
files
|
||
|
|
||
|
## Features
|
||
|
|
||
|
- Snapshot-based backup management
|
||
|
- Creation of installed package lists and archives of package manager
|
||
|
databases
|
||
|
- AppArmor profiles
|
||
|
|
||
|
### Advanced Features
|
||
|
|
||
|
- rbackup depends on the filesystem that stores the repository to
|
||
|
provide features such as checksumming, deduplication, and data
|
||
|
integrity verification
|
||
|
- Encryption must be handled by an external program, this is out of
|
||
|
scope for rbackup
|
||
|
- xattrs and acl\'s are handled by rsync but must be a supported
|
||
|
feature of the filesystem the repository is stored on
|
||
|
|
||
|
## Target Directories
|
||
|
|
||
|
- /boot/loader
|
||
|
- /etc
|
||
|
- /home
|
||
|
- /root
|
||
|
- /var
|
||
|
- /var/lib
|
||
|
- /var/log
|
||
|
- Plugins
|
||
|
- Installed packages
|
||
|
- Package manager databases
|
||
|
|
||
|
## Backup Directory Hierarchy
|
||
|
|
||
|
Repository
|
||
|
current -> data/snapshot2
|
||
|
data
|
||
|
snapshot1
|
||
|
.metadata
|
||
|
snapshot2
|
||
|
.metadata
|
||
|
.metadata
|
||
|
|
||
|
Assuming snapshot2 was the most recent backup and snapshot1 was the
|
||
|
backup before that:
|
||
|
|
||
|
> - \"current\" would link to snapshot2
|
||
|
> - Unchanged files files from snapshot1 backed up to snapshot2 are
|
||
|
> hardlinked to snapshot1
|
||
|
|
||
|
## Implementation Notes
|
||
|
|
||
|
- pathlib is used for path handling
|
||
|
- When hardlinking, rbackup passes the entire path to avoid needing
|
||
|
relative paths
|
||
|
- The backup script changes the process umask to 0000
|
||
|
|
||
|
## To-do
|
||
|
|
||
|
- Create a separate backup and network backup script
|
||
|
- Think about using `python-daemon` for `backupd`
|
||
|
- rbackup.script: add `do_remote_backup` function
|
||
|
- Add \_\_enter\_\_ and \_\_exit\_\_ for PackageManager lockfiles to
|
||
|
prevent transactions during backup
|
||
|
- Create snapshot manipulation script
|
||
|
- Interactive cleanup script
|
||
|
- Repository.\_\_delitem\_\_()
|
||
|
- Reconfiguring Repository.snapshot_symlink whenever a snapshot is
|
||
|
deleted
|
||
|
- Plugin API
|
||
|
- Plugin.run() and Plugin.communicate() abstract methods
|
||
|
- Plugin.run() is passed a set of specific arguments
|
||
|
- snapshot?
|
||
|
- \--dry-run touches the repository, change to make sure it doesn\'t
|
||
|
|
||
|
## Dependencies
|
||
|
|
||
|
### Runtime
|
||
|
|
||
|
- python\>=3.7
|
||
|
- rsync
|
||
|
|
||
|
### Build/Testing
|
||
|
|
||
|
- pytest
|
||
|
- setuptools
|
||
|
- hypothesis
|
||
|
|
||
|
#### License
|
||
|
|
||
|
This project is licensed under MIT. See LICENSE for more details.
|