allow to stagger backup jobs
This commit is contained in:
parent
c2ac071c72
commit
3c9f71da0e
2 changed files with 55 additions and 17 deletions
|
@ -25,12 +25,32 @@ let
|
||||||
ghRoot = (gitHubDeclaration "ibizaman" "selfhostblocks" "").url;
|
ghRoot = (gitHubDeclaration "ibizaman" "selfhostblocks" "").url;
|
||||||
|
|
||||||
buildOptionsDocs = args@{ modules, includeModuleSystemOptions ? true, ... }:
|
buildOptionsDocs = args@{ modules, includeModuleSystemOptions ? true, ... }:
|
||||||
let options = (lib.evalModules { inherit modules; }).options;
|
let
|
||||||
|
config = {
|
||||||
|
_module.check = false;
|
||||||
|
_module.args = {};
|
||||||
|
system.stateVersion = "22.11";
|
||||||
|
};
|
||||||
|
|
||||||
|
utils = import "${pkgs.path}/nixos/lib/utils.nix" {
|
||||||
|
inherit config lib;
|
||||||
|
pkgs = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
eval = lib.evalModules {
|
||||||
|
inherit modules;
|
||||||
|
|
||||||
|
specialArgs = {
|
||||||
|
inherit utils;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
options = if includeModuleSystemOptions
|
||||||
|
then eval.options
|
||||||
|
else builtins.removeAttrs eval.options [ "_module" ];
|
||||||
in buildPackages.nixosOptionsDoc ({
|
in buildPackages.nixosOptionsDoc ({
|
||||||
options = if includeModuleSystemOptions then
|
inherit options;
|
||||||
options
|
|
||||||
else
|
|
||||||
builtins.removeAttrs options [ "_module" ];
|
|
||||||
transformOptions = opt:
|
transformOptions = opt:
|
||||||
opt // {
|
opt // {
|
||||||
# Clean up declaration sites to not refer to the Home Manager
|
# Clean up declaration sites to not refer to the Home Manager
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{ config, pkgs, lib, ... }:
|
{ config, pkgs, lib, utils, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.shb.backup;
|
cfg = config.shb.backup;
|
||||||
|
@ -37,7 +37,28 @@ let
|
||||||
|
|
||||||
repositories = lib.mkOption {
|
repositories = lib.mkOption {
|
||||||
description = "Repositories to back this instance to.";
|
description = "Repositories to back this instance to.";
|
||||||
type = lib.types.nonEmptyListOf lib.types.str;
|
type = lib.types.nonEmptyListOf (lib.types.submodule {
|
||||||
|
options = {
|
||||||
|
path = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = "Repository location";
|
||||||
|
};
|
||||||
|
|
||||||
|
timerConfig = lib.mkOption {
|
||||||
|
type = lib.types.attrsOf utils.systemdUtils.unitOptions.unitOption;
|
||||||
|
default = {
|
||||||
|
OnCalendar = "daily";
|
||||||
|
Persistent = true;
|
||||||
|
};
|
||||||
|
description = ''When to run the backup. See {manpage}`systemd.timer(5)` for details.'';
|
||||||
|
example = {
|
||||||
|
OnCalendar = "00:05";
|
||||||
|
RandomizedDelaySec = "5h";
|
||||||
|
Persistent = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
retention = lib.mkOption {
|
retention = lib.mkOption {
|
||||||
|
@ -191,15 +212,15 @@ in
|
||||||
group = cfg.group;
|
group = cfg.group;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
] ++ lib.optional ((lib.filter (lib.strings.hasPrefix "s3") instance.repositories) != []) {
|
] ++ lib.optional ((lib.filter ({path, ...}: lib.strings.hasPrefix "s3" path) instance.repositories) != []) {
|
||||||
"${instance.backend}/environmentfiles/${if isNull instance.secretName then name else instance.secretName}" = {
|
"${instance.backend}/environmentfiles/${if isNull instance.secretName then name else instance.secretName}" = {
|
||||||
sopsFile = instance.keySopsFile;
|
sopsFile = instance.keySopsFile;
|
||||||
mode = "0440";
|
mode = "0440";
|
||||||
owner = cfg.user;
|
owner = cfg.user;
|
||||||
group = cfg.group;
|
group = cfg.group;
|
||||||
};
|
};
|
||||||
} ++ lib.optionals (instance.backend == "borgmatic") (lib.flatten (map (repository: {
|
} ++ lib.optionals (instance.backend == "borgmatic") (lib.flatten (map ({path, ...}: {
|
||||||
"${instance.backend}/keys/${repoSlugName repository}" = {
|
"${instance.backend}/keys/${repoSlugName path}" = {
|
||||||
key = "${instance.backend}/keys/${if isNull instance.secretName then name else instance.secretName}";
|
key = "${instance.backend}/keys/${if isNull instance.secretName then name else instance.secretName}";
|
||||||
sopsFile = instance.keySopsFile;
|
sopsFile = instance.keySopsFile;
|
||||||
mode = "0440";
|
mode = "0440";
|
||||||
|
@ -244,7 +265,7 @@ in
|
||||||
location =
|
location =
|
||||||
{
|
{
|
||||||
source_directories = instance.sourceDirectories;
|
source_directories = instance.sourceDirectories;
|
||||||
repositories = instance.repositories;
|
repositories = map ({path, ...}: path) instance.repositories;
|
||||||
}
|
}
|
||||||
// (lib.attrsets.optionalAttrs (builtins.length instance.excludePatterns > 0) {
|
// (lib.attrsets.optionalAttrs (builtins.length instance.excludePatterns > 0) {
|
||||||
excludePatterns = instance.excludePatterns;
|
excludePatterns = instance.excludePatterns;
|
||||||
|
@ -284,9 +305,9 @@ in
|
||||||
services.restic.backups =
|
services.restic.backups =
|
||||||
let
|
let
|
||||||
mkRepositorySettings = name: instance: repository: {
|
mkRepositorySettings = name: instance: repository: {
|
||||||
"${name}_${repoSlugName repository}" = {
|
"${name}_${repoSlugName repository.path}" = {
|
||||||
inherit (cfg) user;
|
inherit (cfg) user;
|
||||||
inherit repository;
|
repository = repository.path;
|
||||||
|
|
||||||
paths = instance.sourceDirectories;
|
paths = instance.sourceDirectories;
|
||||||
|
|
||||||
|
@ -294,10 +315,7 @@ in
|
||||||
|
|
||||||
initialize = true;
|
initialize = true;
|
||||||
|
|
||||||
timerConfig = {
|
inherit (repository) timerConfig;
|
||||||
OnCalendar = "00,12:00:00";
|
|
||||||
RandomizedDelaySec = "5m";
|
|
||||||
};
|
|
||||||
|
|
||||||
pruneOpts = lib.mapAttrsToList (name: value:
|
pruneOpts = lib.mapAttrsToList (name: value:
|
||||||
"--${builtins.replaceStrings ["_"] ["-"] name} ${builtins.toString value}"
|
"--${builtins.replaceStrings ["_"] ["-"] name} ${builtins.toString value}"
|
||||||
|
|
Loading…
Reference in a new issue