Locations

Locations must define:

  • What to backup from

  • Which backend to backup to

Optionally they can also define:

  • A forget policy

  • Forget flags to pass to restic forget (e.g. prune)

  • Cludes (advanced include/exclude policy)

Location configs are just files under the dir:

$XDG_CONFIG_DIR/bashtic/locations

Currently we only support one location which should be called default.

Backup from

The from array let’s you define what to backup:

from=("$HOME")

To specify multiple directories:

from=("$HOME" "/opt/gamesaves")

The value of from is passed directly to restic as the arguments for the backup command.

Note

It could be valid to have an empty from if you are using other means to specify what to backup (e.g. --exclude-file).

Backup to

The to array specifies which backends this location can be backed up to:

to=("usb")

Backends are specified by user-defined labels, they can be whatever you need.

To specify more than one:

to=("usb" "cloud")

Whatever labels you use will need to be defined as backends.

backup_flags

The backup_flags array can be used to specify additional flags to pass to the restic backup operation. For example to use verbose mode and turn off change detection we might use:

backup_flags=("--verbose" "--force")

These flags are passed as-is to restic so you can use anything it will understand.

forget policy

The forget associative array defines the forget policy for a location:

forget=(
  ["keep-last"]="10"
  ["keep-hourly"]="5"
  ["keep-daily"]="30"
  ["keep-weekly"]="8"
  ["keep-monthly"]="24"
  ["keep-yearly"]="100"
)

At the moment we only support the keys above. You don’t have to specify every key, only those that you want to use. So this is equally valid:

forget=(
  ["keep-last"]="99"
)

forget_flags

The forget_flags array can be used to specify additional flags to pass to the restic forget operation. For example to use quiet mode, enable prune and group by tags we might use:

forget_flags=("-q" "--prune" "--group-by" "tags")

These flags are passed as-is to restic so you can use anything it will understand.

cludes include/exclude rules

The cludes array allows you to specify complex include/exclude rules at any depth. This is more powerful than anything that can be achieved with restic’s various other inclusion/exclusion flags.

If you want to know more about the background of this feature see cludes. However you do not need to understand the background in order to use it. In brief bashtic will take your cludes config, generate a carefully crafted exclude file and pass it to restic backup with the --exclude-file flag.

By default all files under the paths specified in your from array are considered included. For example to exclude a few files and dirs from our $HOME we could specify:

cludes=(
"$HOME/.bash_history#x"
"$HOME/.lesshst#x"
"$HOME/Downloads#x"
"$HOME/bin#x"
)

Each entry in the cludes array is simply a path with one of two suffixes:

  • #x - to eXclude the path recursively.

  • #i - to Include the path recursively.

No wildcards are allowed in paths (for the moment).

Rules can be nested. For example, if we are a flatpak user we might want to ignore everything under .var except for certain dirs with config/data:

cludes=(
"$HOME/.var#x"
"$HOME/.var/app/net.minetest.Minetest/.minetest/worlds#i"
)

The above config will backup any Minetest worlds but ignore everything else under .var.

You can nest these rules however you like, repeatedly including/excluding at any depths. For example, if we wanted to exclude a particular Minetest world from those we backed up above we could add another deeper rule:

cludes=(
"$HOME/.var#x"
"$HOME/.var/app/net.minetest.Minetest/.minetest/worlds#i"
"$HOME/.var/app/net.minetest.Minetest/.minetest/worlds/MineClone2#x"
)

Now we back up all our Minetest worlds except for our MineClone2 one.