The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

App::SimpleBackuper - is a simple tool for backuping files and restoring it from backups.

Benefits

  • Simplicity and transparency. Few lib files and one short script. Most programmers can understand it.

  • Efficient use of disk space (incremental backup):

    • Automatic deduplication of parts of files (most modified files differ only partially).

    • All files will be compressed with archivator (compression level may be configured).

    • Incremental backup format doesn't require initial data snapshot.

  • Security:

    • All files will be encrypted with AES256 + RSA4096.

    • Encryption doing before data send to storage host.

    • For backuping you don't need to keep private RSA key accessible to this program. It needs only for restoring.

    • Thus, even with the backup data, no one can get the source files from them. And also no one can fake a backup.

  • You can specify different priorities for any files.

  • For recover your backup you need only: access to storage host, your crypting keys and some backup options.

  • You can backup to local directory or to remote sftp server.

  • Requires on backuper host: perl and some perl libs.

  • Requires on SFTP storage host: disk space only.

Installing

You can install simple-backuper from CPAN (perl packages repository) or directly from github.

From CPAN

cpan install App::SimpleBackuper

From GitHub

  • git clone https://github.com/dmitry-novozhilov/simple-backuper.git

  • cd simple-backuper

  • perl Makefile.pl

  • make

  • sudo make install

    Required libraries you can install from your distro package manager: apt install libcrypt-rijndael-perl libcrypt-openssl-rsa-perl libcompress-raw-lzma-perl libdigest-sha-perl libtext-glob-perl libtry-tiny-perl libnet-sftp-foreign-perl libconst-fast-perl libmime-base64-perl libjson-pp-perl

Configuring

You need a configuration file. By default simple-backuper trying to read ~/.simple-backuper/config, but you can use other path. In this case you need specify --cfg option on all simple-backuper run.

This file is json with comments allowed. It can be like this:

{
    "db":                   "~/.simple-backuper/db",
    // This database file changes every new backup. ~/.simple-backuper/db - is a default value.
    
    "compression_level":    9,
    // LZMA algorythm supports levels 1 to 9
    
    "public_key":           "~/.simple-backuper/key.pub",
    // This key using with "backup" command.
    // For restore-db command you need to use private key of this public key.
    
    // Creating new pair of keys:
    // Private (for restoring): openssl genrsa -out ~/.simple-backuper/key 4096
    // Public (for backuping): openssl rsa -in ~/.simple-backuper/key -pubout > ~/.simple-backuper/key.pub
    // Keep the private key as your most valuable asset. Copy it to a safe place.
    // It is desirable not in the backup storage, otherwise it will make it possible to use the backup data for someone other than you.
    
    "storage":              "/mnt/backups",
    // Use "host:path" or "user@host:path" for remote SFTP storage.
    // All transfered data already encrypted.
    // If you choose SFTP, make sure that this SFTP server works without a password.
    // This can be configured with ~/.ssh/ config and ssh key-based authorization.
    
    "space_limit":          "100G",
    // Maximum of disc space on storage.
    // While this limit has been reached, simple-backuper deletes the oldest and lowest priority file.
    // K means kilobytes, M - megabytes, G - gygabytes, T - terabytes.
    
    "files": {                              // Files globs with it's priorityes.
        "~":                            5,
        "~/.gnupg":                     50, // The higher the priority, the less likely it is to delete these files.
        "~/.bash_history":              0,  // Zero priority prohibits backup. Use it for exceptions.
        "~/.cache":                     0,
        "~/.local/share/Trash":         0,
        "~/.mozilla/firefox/*/Cache":   0,
        "~/.thumbnails":                0,
    }
}

First (initial) backup

After configuring you need to try backuping to check for it works: simple-backuper backup --backup-name initial --verbose

The initial backup will take a long time. It takes me more than a day.

The next backups will take much less time. Because usually only a small fraction of the files are changed.

Scheduled backups

You can add to crontab next command: 0 0 * * * simple-backuper backup --backup-name `date -Idate` It creates backup named as date every day.

Logging

Simple backuper is so simple that it does not log itself. You can write logs from STDOUT & STDERR: 0 0 * * * simple-backuper backup --backup-name `date -Idate` 2>&1 >> simple-backuper.log

Recovering

1. The first thing you need is a database file. If you have it, move to next step. Otherwise you can restore it from your backup storage:

simple-backuper restore-db --storage YOUR_STORAGE --priv-key KEY

  • YOUR_STORAGE - is your storage option from config. For example my_ssh_backup_host:/path/to/backup/.

  • KEY - is path to your private key!

2. Chose backup and files by exploring you storage by commands like simple-backuper info, simple-backuper info /home,..
3. Try to dry run of restoring files: simple-backuper restore --path CHOSED_PATH --backup-name CHOSED_BACKUP --storage YOUR_STORAGE --destination TARGET_DIR
  • CHOSED_PATH - is path in backup to restoring files.

  • CHOSED_BACKUP - is what version of your files must be restored.

  • YOUR_STORAGE - is your storage option from config. For example my_ssh_backup_host:/path/to/backup/.

  • TARGET_DIR - is dir for restored files.

4. If all ok, run restoring files with same command and --write argument!

AUTHOR

Dmitriy Novozhilov <Dmitry@Novozhilov.ru>

LICENSE

GPL v3