backive

backive implementation in Go

View the Project on GitHub qwc/backive

Backive

The name comes from the combination of backup and archive - silly, I know.

The initial idea

Purpose

I have a long-term backup strategy where I put some labeled hard-disk in a SATA docking station and run a backup routine. When done, this hard-disk goes back into some shelf in my attic or basement. When the time is come again to update the long-term backup the same procedure starts again.

So now there are my backup routines, which are manually currently - and that sucks.

So what this tool or service should do is the following:

What I currently see as optional:

Technical goals

Reached goals

Configuration

Here you see an example configuration, should be rather self explanatory.

devices:
  dev_test:
    uuid: 714dc1f8-00d7-44b4-b03c-b54498c7cb86
    owner: myuser
  MyFATDevice:
    uuid: 72A9-D8C5
    owner: myuser
backups:
  dev_test_backup:
    user: myuser
    targetDevice: dev_test
    frequency: 2
    scriptPath: /home/myuser/backup.sh
    sourcePath: /home/myuser/data2
    targetPath: data2
    label: "Development test backup"
  MyFATDevice_test:
    user: myuser
    targetDevice: MyFATDevice
    frequency: 0
    scriptPath: /absolute/path/to/backup.sh
    sourcePath: /home/myuser/data
    targetPath: targetdata
settings:
  systemMountPoint: /mnt/backups
  unixSocketLocation: /var/local/backive/backive.sock
  logLocation: /var/log/backive
  dbLocation: /var/lib/backive

Backup scripts

If the user in a backup configuration is NOT defined, the scripts are executed as root! This might change in the future, that execution as root is not allowed anymore.

The scripts awaited in the backup config string scriptPath are executed with the user defined in user. The sh shell is used, so if you want to switch, do not forget #!/usr/bin/env <yourshell>. The scriptPath should be absolute and should return a 0 on success.

What and how you do your backup with the script is completely up to you.

You can rely on following environment variables in your script:

BACKIVE_MOUNT     #The system mount point, where backive mounts it's known devices.
BACKIVE_TO        #The target directory as absolute path.
BACKIVE_FROM      #The source directory as absolute path.

If your backup script does not need the BACKIVE_FROM you currently still have to provide a path, just use a dummy.

systemd service

Has still to be done manually.

Things to do

Creating an install script

A script from the repo or in the “distribution” to setup with standard expectations (see systemd service).

Increasing security

Move from root execution to a backive user and backive group. Users who want to backup stuff, need to be in the group. And the permissions for the data will be given to the user and the backive group.

Creation of this group and the handling should also be done with the install script.

GUI for the icon bar

A GUI is planned, which notifies you of due backups you’ve defined, based on the last backup date.

An extension of the GUI would be an editor for the configuration or even a “wizard” dialog to add new backups or devices. This will only work if the group handling is implemented.

Final words

Thanks

To myself, finally having done this. lol…

Golang, it’s awesome and nice to learn.