115 lines
3 KiB
Nix
115 lines
3 KiB
Nix
|
{
|
||
|
lib,
|
||
|
pkgs,
|
||
|
config,
|
||
|
...
|
||
|
}:
|
||
|
let
|
||
|
cfg = config.services.barman;
|
||
|
iniFormat = pkgs.formats.ini { };
|
||
|
defaultUser = "barman";
|
||
|
defaultHome = "/var/lib/barman";
|
||
|
in
|
||
|
{
|
||
|
options.services.barman = {
|
||
|
enable = lib.mkEnableOption "barman";
|
||
|
package = lib.mkPackageOption pkgs "barman" { };
|
||
|
|
||
|
settings = lib.mkOption {
|
||
|
description = "Global barman configuration that goes in the `[barman]` section of `barman.conf`";
|
||
|
type = lib.types.submodule { freeformType = iniFormat.type; };
|
||
|
example = {
|
||
|
barman_user = defaultUser;
|
||
|
barman_home = defaultHome;
|
||
|
log_file = "/var/log/barman/barman.log";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
servers = lib.mkOption {
|
||
|
description = "Server configurations";
|
||
|
type = lib.types.submodule { freeformType = iniFormat.type; };
|
||
|
default = { };
|
||
|
};
|
||
|
|
||
|
# passwordsFile = lib.mkOption {
|
||
|
# description = "Path to the PostgreSQL password file. See [the documentation](https://www.postgresql.org/docs/current/libpq-pgpass.html) for the format.";
|
||
|
# type = lib.types.path;
|
||
|
# default = null;
|
||
|
# };
|
||
|
};
|
||
|
|
||
|
config = lib.mkIf cfg.enable {
|
||
|
services.barman.settings = {
|
||
|
barman = {
|
||
|
barman_user = lib.mkDefault defaultUser;
|
||
|
barman_home = lib.mkDefault defaultHome;
|
||
|
compression = lib.mkDefault "pigz";
|
||
|
backup_compression = lib.mkDefault "zstd";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
users.users."${cfg.settings.barman.barman_user}" = {
|
||
|
isSystemUser = true;
|
||
|
home = cfg.settings.barman.barman_home;
|
||
|
createHome = true;
|
||
|
group = cfg.settings.barman.barman_user;
|
||
|
};
|
||
|
|
||
|
users.groups."${cfg.settings.barman.barman_user}" = { };
|
||
|
|
||
|
environment = {
|
||
|
etc =
|
||
|
{
|
||
|
"barman.conf" = {
|
||
|
user = cfg.settings.barman.barman_user;
|
||
|
source = iniFormat.generate "barman.conf" cfg.settings;
|
||
|
};
|
||
|
}
|
||
|
// (lib.mapAttrs' (name: serverConfig: {
|
||
|
name = "barman.d/${name}.conf";
|
||
|
value = {
|
||
|
user = cfg.settings.barman.barman_user;
|
||
|
source = iniFormat.generate "${name}.conf" { "${name}" = serverConfig; };
|
||
|
};
|
||
|
}) cfg.servers);
|
||
|
|
||
|
systemPackages = [ cfg.package ];
|
||
|
};
|
||
|
systemd = {
|
||
|
timers.barman = {
|
||
|
description = "Update timer for barman";
|
||
|
partOf = [ "barman.service" ];
|
||
|
wantedBy = [ "timers.target" ];
|
||
|
timerConfig = {
|
||
|
OnCalendar = "*:*:0";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
services.barman = {
|
||
|
description = "Run barman maintenance tasks";
|
||
|
path = with pkgs; [
|
||
|
cfg.package
|
||
|
bash
|
||
|
bzip2
|
||
|
gzip
|
||
|
lz4
|
||
|
pigz
|
||
|
postgresql
|
||
|
zstd
|
||
|
];
|
||
|
# environment = {
|
||
|
# PGPASSFILE = lib.mkIf (cfg.passwordsFile != null) cfg.passwordsFile;
|
||
|
# };
|
||
|
|
||
|
serviceConfig = {
|
||
|
Type = "oneshot";
|
||
|
User = cfg.settings.barman.barman_user;
|
||
|
ExecStart = "${cfg.package}/bin/barman cron";
|
||
|
WorkingDirectory = cfg.settings.barman.barman_home;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
};
|
||
|
}
|