Backup Contract

Table of Contents

Contract Reference
Usage
Providers of the Backup Contract
Requester Blocks and Services

This NixOS contract represents a backup job that will backup one or more files or directories on a regular schedule.

It is a contract between a service that has files to be backed up and a service that backs up files.

Contract Reference

These are all the options that are expected to exist for this contract to be respected.

shb.contracts.backup

Contract for backing up files between a requester module and a provider module.

The requester communicates to the provider what files to backup through the request options.

The provider reads from the request options and backs up the requested files. It communicates to the requester what script is used to backup and restore the files through the result options.

Type: submodule

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.request

Options set by a requester module of the backup contract.

Type: submodule

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.request.excludePatterns

File patterns to exclude.

Type: list of string

Default: [ ]

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.request.hooks

Hooks to run around the backup.

Type: submodule

Default: { }

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.request.hooks.after_backup

Hooks to run after backup.

Type: list of string

Default: [ ]

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.request.hooks.before_backup

Hooks to run before backup.

Type: list of string

Default: [ ]

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.request.sourceDirectories

Directories to backup.

Type: non-empty (list of string)

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.request.user

Unix user doing the backups.

Type: string

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.result

Options set by a provider module of the backup contract.

Type: submodule

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.result.backupService

Name of service backing up the database.

This script can be ran manually to backup the database:

$ systemctl start my_backup_service.service

Type: string

Default: null

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>
shb.contracts.backup.result.restoreScript

Name of script that can restore the database. One can then list snapshots with:

$ my_restore_script snapshots

And restore the database with:

$ my_restore_script restore latest

Type: string

Default: null

Declared by:

<selfhostblocks/modules/contracts/backup/dummyModule.nix>

Usage

A service that can be backed up will provide a backup option. Such a service is a requester providing a request for a module provider of this contract.

What this option defines is, from the user perspective - that is you - an implementation detail but it will at least define what directories to backup, the user to backup with and possibly hooks to run before or after the backup job runs.

Here is an example module defining such a backup option:

{
  options = {
    myservice.backup = mkOption {
      type = contracts.backup.request;
      default = {
        user = "myservice";
        sourceDirectories = [
          "/var/lib/myservice"
        ];
      };
    };
  };
};

Now, on the other side we have a service that uses this backup option and actually backs up files. This service is a provider of this contract and will provide a result option.

Let’s assume such a module is available under the backupservice option and that one can create multiple backup instances under backupservice.instances. Then, to actually backup the myservice service, one would write:

backupservice.instances.myservice = {
  request = myservice.backup;
  
  settings = {
    enable = true;

    repository = {
      path = "/srv/backup/myservice";
    };

    # ... Other options specific to backupservice like scheduling.
  };
};

It is advised to backup files to different location, to improve redundancy. Thanks to using contracts, this can be made easily either with the same backupservice:

backupservice.instances.myservice_2 = {
  request = myservice.backup;
  
  settings = {
    enable = true;
  
    repository = {
      path = "<remote path>";
    };
  };
};

Or with another module backupservice_2!

Providers of the Backup Contract

Requester Blocks and Services

  • Audiobookshelf (no manual yet)

  • Deluge (no manual yet)

  • Grocy (no manual yet)

  • Hledger (no manual yet)

  • Home Assistant (no manual yet)

  • Jellyfin (no manual yet)

  • LLDAP (no manual yet)

  • Nextcloud.

  • Vaultwarden.

  • *arr (no manual yet)