switch backup contract to new contract style (#367)

Co-authored-by: ibizaman <ibizapeanut@gmail.com>
This commit is contained in:
Pierre Penninckx 2024-11-26 20:59:07 +01:00 committed by GitHub
parent ba1e60a45e
commit 47dffd2a2f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 336 additions and 380 deletions

View file

@ -602,6 +602,9 @@
"contracts-backup-options-shb.contracts.backup.result.restoreScript": [ "contracts-backup-options-shb.contracts.backup.result.restoreScript": [
"contracts-backup.html#contracts-backup-options-shb.contracts.backup.result.restoreScript" "contracts-backup.html#contracts-backup-options-shb.contracts.backup.result.restoreScript"
], ],
"contracts-backup-options-shb.contracts.backup.settings": [
"contracts-backup.html#contracts-backup-options-shb.contracts.backup.settings"
],
"contracts-databasebackup-options-shb.contracts.databasebackup": [ "contracts-databasebackup-options-shb.contracts.databasebackup": [
"contracts-databasebackup.html#contracts-databasebackup-options-shb.contracts.databasebackup" "contracts-databasebackup.html#contracts-databasebackup-options-shb.contracts.databasebackup"
], ],
@ -851,23 +854,35 @@
"services-forgejo-options-shb.forgejo.backup": [ "services-forgejo-options-shb.forgejo.backup": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup" "services-forgejo.html#services-forgejo-options-shb.forgejo.backup"
], ],
"services-forgejo-options-shb.forgejo.backup.excludePatterns": [ "services-forgejo-options-shb.forgejo.backup.request": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.excludePatterns" "services-forgejo.html#services-forgejo-options-shb.forgejo.backup.request"
], ],
"services-forgejo-options-shb.forgejo.backup.hooks": [ "services-forgejo-options-shb.forgejo.backup.request.excludePatterns": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.hooks" "services-forgejo.html#services-forgejo-options-shb.forgejo.backup.request.excludePatterns"
], ],
"services-forgejo-options-shb.forgejo.backup.hooks.afterBackup": [ "services-forgejo-options-shb.forgejo.backup.request.hooks": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.hooks.afterBackup" "services-forgejo.html#services-forgejo-options-shb.forgejo.backup.request.hooks"
], ],
"services-forgejo-options-shb.forgejo.backup.hooks.beforeBackup": [ "services-forgejo-options-shb.forgejo.backup.request.hooks.afterBackup": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.hooks.beforeBackup" "services-forgejo.html#services-forgejo-options-shb.forgejo.backup.request.hooks.afterBackup"
], ],
"services-forgejo-options-shb.forgejo.backup.sourceDirectories": [ "services-forgejo-options-shb.forgejo.backup.request.hooks.beforeBackup": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.sourceDirectories" "services-forgejo.html#services-forgejo-options-shb.forgejo.backup.request.hooks.beforeBackup"
], ],
"services-forgejo-options-shb.forgejo.backup.user": [ "services-forgejo-options-shb.forgejo.backup.request.sourceDirectories": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.user" "services-forgejo.html#services-forgejo-options-shb.forgejo.backup.request.sourceDirectories"
],
"services-forgejo-options-shb.forgejo.backup.request.user": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.request.user"
],
"services-forgejo-options-shb.forgejo.backup.result": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.result"
],
"services-forgejo-options-shb.forgejo.backup.result.backupService": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.result.backupService"
],
"services-forgejo-options-shb.forgejo.backup.result.restoreScript": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.backup.result.restoreScript"
], ],
"services-forgejo-options-shb.forgejo.databasePassword": [ "services-forgejo-options-shb.forgejo.databasePassword": [
"services-forgejo.html#services-forgejo-options-shb.forgejo.databasePassword" "services-forgejo.html#services-forgejo-options-shb.forgejo.databasePassword"
@ -1325,23 +1340,35 @@
"services-nextcloudserver-options-shb.nextcloud.backup": [ "services-nextcloudserver-options-shb.nextcloud.backup": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup"
], ],
"services-nextcloudserver-options-shb.nextcloud.backup.excludePatterns": [ "services-nextcloudserver-options-shb.nextcloud.backup.request": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.excludePatterns" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.request"
], ],
"services-nextcloudserver-options-shb.nextcloud.backup.hooks": [ "services-nextcloudserver-options-shb.nextcloud.backup.request.excludePatterns": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.hooks" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.request.excludePatterns"
], ],
"services-nextcloudserver-options-shb.nextcloud.backup.hooks.afterBackup": [ "services-nextcloudserver-options-shb.nextcloud.backup.request.hooks": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.hooks.afterBackup" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.request.hooks"
], ],
"services-nextcloudserver-options-shb.nextcloud.backup.hooks.beforeBackup": [ "services-nextcloudserver-options-shb.nextcloud.backup.request.hooks.afterBackup": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.hooks.beforeBackup" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.request.hooks.afterBackup"
], ],
"services-nextcloudserver-options-shb.nextcloud.backup.sourceDirectories": [ "services-nextcloudserver-options-shb.nextcloud.backup.request.hooks.beforeBackup": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.sourceDirectories" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.request.hooks.beforeBackup"
], ],
"services-nextcloudserver-options-shb.nextcloud.backup.user": [ "services-nextcloudserver-options-shb.nextcloud.backup.request.sourceDirectories": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.user" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.request.sourceDirectories"
],
"services-nextcloudserver-options-shb.nextcloud.backup.request.user": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.request.user"
],
"services-nextcloudserver-options-shb.nextcloud.backup.result": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.result"
],
"services-nextcloudserver-options-shb.nextcloud.backup.result.backupService": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.result.backupService"
],
"services-nextcloudserver-options-shb.nextcloud.backup.result.restoreScript": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.backup.result.restoreScript"
], ],
"services-nextcloudserver-options-shb.nextcloud.dataDir": [ "services-nextcloudserver-options-shb.nextcloud.dataDir": [
"services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.dataDir" "services-nextcloud.html#services-nextcloudserver-options-shb.nextcloud.dataDir"
@ -1475,23 +1502,35 @@
"services-vaultwarden-options-shb.vaultwarden.backup": [ "services-vaultwarden-options-shb.vaultwarden.backup": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup"
], ],
"services-vaultwarden-options-shb.vaultwarden.backup.excludePatterns": [ "services-vaultwarden-options-shb.vaultwarden.backup.request": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.excludePatterns" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.request"
], ],
"services-vaultwarden-options-shb.vaultwarden.backup.hooks": [ "services-vaultwarden-options-shb.vaultwarden.backup.request.excludePatterns": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.hooks" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.request.excludePatterns"
], ],
"services-vaultwarden-options-shb.vaultwarden.backup.hooks.afterBackup": [ "services-vaultwarden-options-shb.vaultwarden.backup.request.hooks": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.hooks.afterBackup" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.request.hooks"
], ],
"services-vaultwarden-options-shb.vaultwarden.backup.hooks.beforeBackup": [ "services-vaultwarden-options-shb.vaultwarden.backup.request.hooks.afterBackup": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.hooks.beforeBackup" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.request.hooks.afterBackup"
], ],
"services-vaultwarden-options-shb.vaultwarden.backup.sourceDirectories": [ "services-vaultwarden-options-shb.vaultwarden.backup.request.hooks.beforeBackup": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.sourceDirectories" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.request.hooks.beforeBackup"
], ],
"services-vaultwarden-options-shb.vaultwarden.backup.user": [ "services-vaultwarden-options-shb.vaultwarden.backup.request.sourceDirectories": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.user" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.request.sourceDirectories"
],
"services-vaultwarden-options-shb.vaultwarden.backup.request.user": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.request.user"
],
"services-vaultwarden-options-shb.vaultwarden.backup.result": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.result"
],
"services-vaultwarden-options-shb.vaultwarden.backup.result.backupService": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.result.backupService"
],
"services-vaultwarden-options-shb.vaultwarden.backup.result.restoreScript": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.backup.result.restoreScript"
], ],
"services-vaultwarden-options-shb.vaultwarden.databasePassword": [ "services-vaultwarden-options-shb.vaultwarden.databasePassword": [
"services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.databasePassword" "services-vaultwarden.html#services-vaultwarden-options-shb.vaultwarden.databasePassword"

View file

@ -1,7 +1,7 @@
{ pkgs, lib }: { pkgs, lib }:
let let
inherit (builtins) isAttrs hasAttr; inherit (builtins) isAttrs hasAttr;
inherit (lib) concatMapStringsSep concatStringsSep mapAttrsToList; inherit (lib) any concatMapStringsSep concatStringsSep mapAttrsToList;
in in
rec { rec {
# Replace secrets in a file. # Replace secrets in a file.
@ -292,4 +292,6 @@ rec {
"${concatStringsSep "_" secret.path}:${secret.${sourceField}}"; "${concatStringsSep "_" secret.path}:${secret.${sourceField}}";
in in
map genLoadCredentials allSecrets; map genLoadCredentials allSecrets;
anyNotNull = any (x: x != null);
} }

View file

@ -103,24 +103,11 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."lldap" = {
request = config.shb.lldap.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
# TODO: is there a workaround that avoid needing to use root? # TODO: is there a workaround that avoid needing to use root?
# root because otherwise we cannot access the private StateDiretory # root because otherwise we cannot access the private StateDiretory
user = "root"; user = "root";
@ -131,6 +118,7 @@ in
}; };
}; };
}; };
};
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {

View file

@ -111,17 +111,7 @@ in
description = "Files to backup following the [backup contract](./contracts-backup.html)."; description = "Files to backup following the [backup contract](./contracts-backup.html).";
default = {}; default = {};
type = attrsOf (submodule ({ name, config, ... }: { type = attrsOf (submodule ({ name, config, ... }: {
options = { options = contracts.backup.mkProvider {
request = mkOption {
description = ''
Request part of the backup contract.
Accepts values from a requester.
'';
type = contracts.backup.request;
};
settings = mkOption { settings = mkOption {
description = '' description = ''
Settings specific to the Restic provider. Settings specific to the Restic provider.
@ -132,27 +122,13 @@ in
}; };
}; };
result = mkOption { resultCfg = {
description = '' restoreScript = fullName name config.settings.repository;
Result part of the backup contract. restoreScriptText = "${fullName "<name>" { path = "path/to/repository"; }}";
Contains the output of the Restic provider.
'';
default = {
restoreScript = fullName name config.settings.repository;
backupService = "${fullName name config.settings.repository}.service"; backupService = "${fullName name config.settings.repository}.service";
};
defaultText = {
restoreScriptText = "${fullName "<name>" { path = "path/to/repository"; }}";
backupServiceText = "${fullName "<name>" { path = "path/to/repository"; }}.service"; backupServiceText = "${fullName "<name>" { path = "path/to/repository"; }}.service";
}; };
type = contracts.backup.result {
restoreScript = fullName name config.settings.repository;
backupService = "${fullName name config.settings.repository}.service";
restoreScriptText = "${fullName "<name>" { path = "path/to/repository"; }}";
backupServiceText = "${fullName "<name>" { path = "path/to/repository"; }}.service";
};
};
}; };
})); }));
}; };

View file

@ -1,27 +1,82 @@
{ lib, ... }: { pkgs, lib, ... }:
let let
inherit (lib) mkOption; inherit (lib) concatStringsSep literalMD mkOption optionalAttrs optionalString;
inherit (lib.types) listOf nonEmptyListOf submodule str; inherit (lib.types) listOf nonEmptyListOf submodule str;
shblib = pkgs.callPackage ../../lib {};
inherit (shblib) anyNotNull;
in in
{ {
request = submodule { mkRequest =
{ user ? "",
userText ? null,
sourceDirectories ? [ "/var/lib/example" ],
sourceDirectoriesText ? null,
excludePatterns ? [],
excludePatternsText ? null,
beforeBackup ? [],
beforeBackupText ? null,
afterBackup ? [],
afterBackupText ? null,
}: mkOption {
description = ''
Request part of the backup contract.
Options set by the requester module
enforcing how to backup files.
'';
default = {
inherit user sourceDirectories excludePatterns;
hooks = {
inherit beforeBackup afterBackup;
};
};
defaultText = optionalString (anyNotNull [
userText
sourceDirectoriesText
excludePatternsText
beforeBackupText
afterBackupText
]) (literalMD ''
{
user = ${if userText != null then userText else user};
sourceDirectories = ${if sourceDirectoriesText != null then sourceDirectoriesText else "[ " + concatStringsSep " " sourceDirectories + " ]"};
excludePatterns = ${if excludePatternsText != null then excludePatternsText else "[ " + concatStringsSep " " excludePatterns + " ]"};
hooks.beforeBackup = ${if beforeBackupText != null then beforeBackupText else "[ " + concatStringsSep " " beforeBackup + " ]"};
hooks.afterBackup = ${if afterBackupText != null then afterBackupText else "[ " + concatStringsSep " " afterBackup + " ]"};
};
'');
type = submodule {
options = { options = {
user = mkOption { user = mkOption {
description = '' description = ''
Unix user doing the backups. Unix user doing the backups.
''; '';
type = str; type = str;
example = "vaultwarden";
default = user;
} // optionalAttrs (userText != null) {
defaultText = literalMD userText;
}; };
sourceDirectories = mkOption { sourceDirectories = mkOption {
description = "Directories to backup."; description = "Directories to backup.";
type = nonEmptyListOf str; type = nonEmptyListOf str;
example = "/var/lib/vaultwarden";
default = sourceDirectories;
} // optionalAttrs (sourceDirectoriesText != null) {
defaultText = literalMD sourceDirectoriesText;
}; };
excludePatterns = mkOption { excludePatterns = mkOption {
description = "File patterns to exclude."; description = "File patterns to exclude.";
type = listOf str; type = listOf str;
default = []; default = excludePatterns;
} // optionalAttrs (excludePatternsText != null) {
defaultText = literalMD excludePatternsText;
}; };
hooks = mkOption { hooks = mkOption {
@ -32,13 +87,18 @@ in
beforeBackup = mkOption { beforeBackup = mkOption {
description = "Hooks to run before backup."; description = "Hooks to run before backup.";
type = listOf str; type = listOf str;
default = []; default = beforeBackup;
} // optionalAttrs (beforeBackupText != null) {
defaultText = literalMD beforeBackupText;
}; };
afterBackup = mkOption { afterBackup = mkOption {
description = "Hooks to run after backup."; description = "Hooks to run after backup.";
type = listOf str; type = listOf str;
default = []; default = afterBackup;
} // optionalAttrs (afterBackupText != null) {
defaultText = literalMD afterBackupText;
};
}; };
}; };
}; };
@ -46,12 +106,32 @@ in
}; };
}; };
result = { mkResult = {
restoreScript, restoreScript ? "restore",
restoreScriptText ? null, restoreScriptText ? null,
backupService, backupService ? "backup.service",
backupServiceText ? null, backupServiceText ? null,
}: submodule { }: mkOption {
description = ''
Result part of the backup contract.
Options set by the provider module that indicates the name of the backup and restor scripts.
'';
default = {
inherit restoreScript backupService;
};
defaultText = optionalString (anyNotNull [
restoreScriptText
backupServiceText
]) (literalMD ''
{
restoreScript = ${if restoreScriptText != null then restoreScriptText else restoreScript};
backupService = ${if backupServiceText != null then backupServiceText else backupService};
}
'');
type = submodule {
options = { options = {
restoreScript = mkOption { restoreScript = mkOption {
description = '' description = ''
@ -70,7 +150,8 @@ in
''; '';
type = str; type = str;
default = restoreScript; default = restoreScript;
defaultText = restoreScriptText; } // optionalAttrs (restoreScriptText != null) {
defaultText = literalMD restoreScriptText;
}; };
backupService = mkOption { backupService = mkOption {
@ -85,7 +166,9 @@ in
''; '';
type = str; type = str;
default = backupService; default = backupService;
defaultText = backupServiceText; } // optionalAttrs (backupServiceText != null) {
defaultText = literalMD backupServiceText;
};
}; };
}; };
}; };

View file

@ -3,7 +3,7 @@ let
contracts = pkgs.callPackage ../. {}; contracts = pkgs.callPackage ../. {};
inherit (lib) mkOption; inherit (lib) mkOption;
inherit (lib.types) anything submodule; inherit (lib.types) submodule;
in in
{ {
options.shb.contracts.backup = mkOption { options.shb.contracts.backup = mkOption {
@ -23,24 +23,7 @@ in
''; '';
type = submodule { type = submodule {
options = { options = contracts.backup.contract;
request = mkOption {
description = ''
Options set by a requester module of the backup contract.
'';
type = contracts.backup.request;
};
result = mkOption {
description = ''
Options set by a provider module of the backup contract.
'';
type = contracts.backup.result {
restoreScript = "my_restore_script";
backupService = "my_backup_service.service";
};
};
};
}; };
}; };
} }

View file

@ -48,7 +48,7 @@ in
inherit mkContractFunctions; inherit mkContractFunctions;
databasebackup = import ./databasebackup.nix { inherit lib; }; databasebackup = import ./databasebackup.nix { inherit lib; };
backup = import ./backup.nix { inherit lib; }; backup = importContract ./backup.nix;
mount = import ./mount.nix { inherit lib; }; mount = import ./mount.nix { inherit lib; };
secret = importContract ./secret.nix; secret = importContract ./secret.nix;
ssl = import ./ssl.nix { inherit lib; }; ssl = import ./ssl.nix { inherit lib; };

View file

@ -316,24 +316,11 @@ let
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."${name}" = {
request = config.shb.${name}.backup;
settings = {
enable = true;
};
}
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = name; user = name;
sourceDirectories = [ sourceDirectories = [
cfg.${name}.dataDir cfg.${name}.dataDir
@ -341,6 +328,7 @@ let
excludePatterns = [".db-shm" ".db-wal" ".mono"]; excludePatterns = [".db-shm" ".db-wal" ".mono"];
}; };
}; };
};
} // (c.moreOptions or {}); } // (c.moreOptions or {});
}; };
}); });

View file

@ -88,30 +88,18 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."audiobookshelf" = {
request = config.shb.audiobookshelf.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = "audiobookshelf"; user = "audiobookshelf";
sourceDirectories = [ sourceDirectories = [
"/var/lib/audiobookshelf" "/var/lib/audiobookshelf"
]; ];
}; };
}; };
};
logLevel = lib.mkOption { logLevel = lib.mkOption {
type = lib.types.nullOr (lib.types.enum ["critical" "error" "warning" "info" "debug"]); type = lib.types.nullOr (lib.types.enum ["critical" "error" "warning" "info" "debug"]);

View file

@ -244,30 +244,18 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."vaultwarden" = {
request = config.shb.vaultwarden.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = "deluge"; user = "deluge";
sourceDirectories = [ sourceDirectories = [
cfg.dataDir cfg.dataDir
]; ];
}; };
}; };
};
logLevel = lib.mkOption { logLevel = lib.mkOption {
type = lib.types.nullOr (lib.types.enum ["critical" "error" "warning" "info" "debug"]); type = lib.types.nullOr (lib.types.enum ["critical" "error" "warning" "info" "debug"]);

View file

@ -241,24 +241,11 @@ in
}; };
backup = mkOption { backup = mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."forgejo" = {
request = config.shb.forgejo.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = options.services.forgejo.user.value; user = options.services.forgejo.user.value;
sourceDirectories = [ sourceDirectories = [
options.services.forgejo.dump.backupDir.value options.services.forgejo.dump.backupDir.value
@ -267,6 +254,7 @@ in
]; ];
}; };
}; };
};
mount = mkOption { mount = mkOption {
type = contracts.mount; type = contracts.mount;

View file

@ -63,30 +63,19 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."grocy" = {
request = config.shb.grocy.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; readOnly = true;
default = { type = lib.types.submodule {
options = contracts.backup.mkRequester {
user = "grocy"; user = "grocy";
sourceDirectories = [ sourceDirectories = [
cfg.dataDir cfg.dataDir
]; ];
}; };
}; };
};
logLevel = lib.mkOption { logLevel = lib.mkOption {
type = lib.types.nullOr (lib.types.enum ["critical" "error" "warning" "info" "debug"]); type = lib.types.nullOr (lib.types.enum ["critical" "error" "warning" "info" "debug"]);

View file

@ -55,24 +55,11 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."hledger" = {
request = config.shb.hledger.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = "hledger"; user = "hledger";
sourceDirectories = [ sourceDirectories = [
cfg.dataDir cfg.dataDir
@ -80,6 +67,7 @@ in
}; };
}; };
}; };
};
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
services.hledger-web = { services.hledger-web = {

View file

@ -140,24 +140,11 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."home-assistant" = {
request = config.shb.home-assistant.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = "hass"; user = "hass";
# No need for backup hooks as we use an hourly automation job in home assistant directly with a cron job. # No need for backup hooks as we use an hourly automation job in home assistant directly with a cron job.
sourceDirectories = [ sourceDirectories = [
@ -166,6 +153,7 @@ in
}; };
}; };
}; };
};
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
services.home-assistant = { services.home-assistant = {

View file

@ -151,24 +151,11 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."jellyfin" = {
request = config.shb.jellyfin.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = "jellyfin"; user = "jellyfin";
sourceDirectories = [ sourceDirectories = [
"/var/lib/jellyfin" "/var/lib/jellyfin"
@ -176,6 +163,7 @@ in
}; };
}; };
}; };
};
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
services.jellyfin.enable = true; services.jellyfin.enable = true;

View file

@ -519,24 +519,11 @@ in
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."nextcloud" = {
request = config.shb.nextcloud.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = "nextcloud"; user = "nextcloud";
sourceDirectories = [ sourceDirectories = [
cfg.dataDir cfg.dataDir
@ -544,6 +531,7 @@ in
excludePatterns = [".rnd"]; excludePatterns = [".rnd"];
}; };
}; };
};
debug = lib.mkOption { debug = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;

View file

@ -128,30 +128,18 @@ in
}; };
backup = lib.mkOption { backup = lib.mkOption {
type = contracts.backup.request;
description = '' description = ''
Backup configuration. This is an output option. Backup configuration.
Use it to initialize a block implementing the "backup" contract.
For example, with the restic block:
```
shb.restic.instances."vaultwarden" = {
request = config.shb.vaultwarden.backup;
settings = {
enable = true;
};
};
```
''; '';
readOnly = true; type = lib.types.submodule {
default = { options = contracts.backup.mkRequester {
user = "vaultwarden"; user = "vaultwarden";
sourceDirectories = [ sourceDirectories = [
dataFolder dataFolder
]; ];
}; };
}; };
};
debug = lib.mkOption { debug = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;
@ -162,6 +150,10 @@ in
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
# Seems superfluous but otherwise we get:
# The option `shb.vaultwarden.backup' was accessed but has no value defined.
shb.vaultwarden.backup = {};
services.vaultwarden = { services.vaultwarden = {
enable = true; enable = true;
dbBackend = "postgresql"; dbBackend = "postgresql";

View file

@ -1,4 +1,4 @@
{ pkgs, lib, ... }: { pkgs, ... }:
let let
pkgs' = pkgs; pkgs' = pkgs;
in in

View file

@ -99,7 +99,7 @@ let
../../modules/blocks/restic.nix ../../modules/blocks/restic.nix
]; ];
shb.restic.instances."testinstance" = { shb.restic.instances."testinstance" = {
request = config.shb.vaultwarden.backup; request = config.shb.vaultwarden.backup.request;
settings = { settings = {
enable = true; enable = true;
passphrase.result = config.shb.hardcodedsecret.backupPassphrase.result; passphrase.result = config.shb.hardcodedsecret.backupPassphrase.result;