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
Request part of the backup contract.
Options set by the requester module enforcing how to backup files.
Type: submodule
Default:
""
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.afterBackup
Hooks to run after backup.
Type: list of string
Default:
[ ]
Declared by:
<selfhostblocks/modules/contracts/backup/dummyModule.nix>
|
shb.contracts.backup.request.hooks.beforeBackup
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)
Default:
[
"/var/lib/example"
]
Example:
"/var/lib/vaultwarden"
Declared by:
<selfhostblocks/modules/contracts/backup/dummyModule.nix>
|
shb.contracts.backup.request.user
Unix user doing the backups.
Type: string
Default:
""
Example:
"vaultwarden"
Declared by:
<selfhostblocks/modules/contracts/backup/dummyModule.nix>
|
shb.contracts.backup.result
Result part of the backup contract.
Options set by the provider module that indicates the name of the backup and restor scripts.
Type: submodule
Default:
""
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 backup.service
Type: string
Default:
"backup.service"
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:
$ restore snapshots
And restore the database with:
$ restore restore latest
Type: string
Default:
"restore"
Declared by:
<selfhostblocks/modules/contracts/backup/dummyModule.nix>
|
shb.contracts.backup.settings
Optional attribute set with options specific to the provider.
Type: anything
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)