Table of Contents
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.
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>
|
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
!
Borgbackup block [WIP].
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)
*arr (no manual yet)