From ae67327df3faaf106d2bcb352d4151774576bf00 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Fri, 29 Dec 2023 22:40:38 +0100 Subject: ... --- modules/pgbackrest.nix | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'modules') diff --git a/modules/pgbackrest.nix b/modules/pgbackrest.nix index cc865bca..e02849f5 100644 --- a/modules/pgbackrest.nix +++ b/modules/pgbackrest.nix @@ -36,6 +36,10 @@ let } "="; }; + mkDSCPOption = options: mkOption { + type = types.numbers.between 0 63; + } // options; + loglevelType = types.enum ["off" "error" "warn" "info" "detail" "debug" "trace"]; inherit (utils.systemdUtils.unitOptions) unitOption; in { @@ -44,6 +48,10 @@ in { enable = mkEnableOption "pgBackRest"; package = mkPackageOption pkgs "pgbackrest" {}; + dscpPackage = mkPackageOption pkgs "libdscp" { nullable = true; default = null; }; + + dscp.archive-push = mkDSCPOption { default = 24; }; + dscp.backup = mkDSCPOption { default = 8; }; configurePostgresql = { enable = mkEnableOption "configuring PostgreSQL for sending WAL to pgBackRest" // { @@ -145,14 +153,32 @@ in { environment.systemPackages = [ cfg.package ]; services.postgresql.settings = mkIf cfg.configurePostgresql.enable { - archive_command = "pgbackrest --stanza ${escapeSystemdExecArg cfg.configurePostgresql.stanza} archive-push %p"; + archive_command = let + pgbackrest-dscp-wrapped = pkgs.writeShellApplication { + name = "pgbackrest-dscp"; + runtimeInputs = [ cfg.package ]; + text = '' + export LD_PRELOAD + LD_PRELOAD=''${LD_PRELOAD:+':'$LD_PRELOAD':'} + if [[ $LD_PRELOAD != *':'''${cfg.dscpPackage}/lib/libdscp.so''':'* ]]; then + LD_PRELOAD='${cfg.dscpPackage}/lib/libdscp.so'$LD_PRELOAD + fi + LD_PRELOAD=''${LD_PRELOAD#':'} + LD_PRELOAD=''${LD_PRELOAD%':'} + + : "''${DSCP:=${toString cfg.dscp.archive-push}}" + + exec -- pgbackrest "$@" + ''; + }; + pgbackrest = if cfg.dscpPackage != null then "${pgbackrest-dscp-wrapped}/bin/pgbackrest-dscp" else "${cfg.package}/bin/pgbackrest"; + in "${pgbackrest} --stanza ${escapeShellArg cfg.configurePostgresql.stanza} archive-push %p"; archive_mode = true; max_wal_senders = mkDefault 3; wal_level = "replica"; }; systemd.services = { - postgresql.path = mkIf cfg.configurePostgresql.enable [ cfg.package ]; pgbackrest-tls-server = mkIf cfg.tlsServer.enable { description = "pgBackRest TLS-Server"; wantedBy = [ "multi-user.target" ]; @@ -172,11 +198,6 @@ in { Group = cfg.tlsServer.group; ExecStart = "${cfg.package}/bin/pgbackrest server"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; - - Environment = [ - "LD_PRELOAD=${pkgs.libdscp}/lib/libdscp.so" - "DSCP=8" - ]; }; }; } // mapAttrs' (name: backupCfg: nameValuePair "pgbackrest-backup@${escapeSystemdPath name}" { @@ -189,9 +210,9 @@ in { Restart = "on-failure"; RestartSec = "5min"; - Environment = [ - "LD_PRELOAD=${pkgs.libdscp}/lib/libdscp.so" - "DSCP=8" + Environment = mkIf (cfg.dscpPackage != null) [ + "LD_PRELOAD=\"${cfg.dscpPackage}/lib/libdscp.so\"" + "DSCP=\"${toString cfg.dscp.backup}\"" ]; }; }) cfg.backups; -- cgit v1.2.3