summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2023-12-29 22:40:38 +0100
committerGregor Kleen <gkleen@yggdrasil.li>2023-12-29 22:40:38 +0100
commitae67327df3faaf106d2bcb352d4151774576bf00 (patch)
tree9675d97cef9bc880e771d6304da44e892fc7f444
parentd4b30420812cd0b5ec97d6048e32903198b96f38 (diff)
downloadnixos-ae67327df3faaf106d2bcb352d4151774576bf00.tar
nixos-ae67327df3faaf106d2bcb352d4151774576bf00.tar.gz
nixos-ae67327df3faaf106d2bcb352d4151774576bf00.tar.bz2
nixos-ae67327df3faaf106d2bcb352d4151774576bf00.tar.xz
nixos-ae67327df3faaf106d2bcb352d4151774576bf00.zip
...
-rw-r--r--hosts/surtr/postgresql/default.nix8
-rw-r--r--hosts/vidhar/pgbackrest/default.nix8
-rw-r--r--modules/pgbackrest.nix41
3 files changed, 45 insertions, 12 deletions
diff --git a/hosts/surtr/postgresql/default.nix b/hosts/surtr/postgresql/default.nix
index faf74588..f0e42ee8 100644
--- a/hosts/surtr/postgresql/default.nix
+++ b/hosts/surtr/postgresql/default.nix
@@ -1,6 +1,11 @@
1{ pkgs, sources, config, flake, flakeInputs, ... }: 1{ pkgs, sources, config, flake, flakeInputs, ... }:
2let 2let
3 versioning = sources.psql-versioning.src; 3 versioning = sources.psql-versioning.src;
4
5 nixpkgs-pgbackrest = import (flakeInputs.nixpkgs-pgbackrest.outPath + "/pkgs/top-level") {
6 overlays = [ flake.overlays.libdscp ];
7 localSystem = config.nixpkgs.system;
8 };
4in { 9in {
5 config = { 10 config = {
6 assertions = [ 11 assertions = [
@@ -16,7 +21,8 @@ in {
16 21
17 services.pgbackrest = { 22 services.pgbackrest = {
18 enable = true; 23 enable = true;
19 package = flakeInputs.nixpkgs-pgbackrest.legacyPackages.${config.nixpkgs.system}.pgbackrest; 24 package = nixpkgs-pgbackrest.pgbackrest;
25 dscpPackage = nixpkgs-pgbackrest.libdscp;
20 26
21 settings = { 27 settings = {
22 "surtr" = { 28 "surtr" = {
diff --git a/hosts/vidhar/pgbackrest/default.nix b/hosts/vidhar/pgbackrest/default.nix
index fec0c1fb..ffb149f5 100644
--- a/hosts/vidhar/pgbackrest/default.nix
+++ b/hosts/vidhar/pgbackrest/default.nix
@@ -2,6 +2,11 @@
2 2
3let 3let
4 surtrRepoCfg = flake.nixosConfigurations."surtr".config.services.pgbackrest.settings.surtr; 4 surtrRepoCfg = flake.nixosConfigurations."surtr".config.services.pgbackrest.settings.surtr;
5
6 nixpkgs-pgbackrest = import (flakeInputs.nixpkgs-pgbackrest.outPath + "/pkgs/top-level") {
7 overlays = [ flake.overlays.libdscp ];
8 localSystem = config.nixpkgs.system;
9 };
5in { 10in {
6 config = { 11 config = {
7 assertions = [ 12 assertions = [
@@ -12,7 +17,8 @@ in {
12 17
13 services.pgbackrest = { 18 services.pgbackrest = {
14 enable = true; 19 enable = true;
15 package = flakeInputs.nixpkgs-pgbackrest.legacyPackages.${config.nixpkgs.system}.pgbackrest; 20 package = nixpkgs-pgbackrest.pgbackrest;
21 dscpPackage = nixpkgs-pgbackrest.libdscp;
16 22
17 tlsServer = { 23 tlsServer = {
18 enable = true; 24 enable = true;
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
36 } "="; 36 } "=";
37 }; 37 };
38 38
39 mkDSCPOption = options: mkOption {
40 type = types.numbers.between 0 63;
41 } // options;
42
39 loglevelType = types.enum ["off" "error" "warn" "info" "detail" "debug" "trace"]; 43 loglevelType = types.enum ["off" "error" "warn" "info" "detail" "debug" "trace"];
40 inherit (utils.systemdUtils.unitOptions) unitOption; 44 inherit (utils.systemdUtils.unitOptions) unitOption;
41in { 45in {
@@ -44,6 +48,10 @@ in {
44 enable = mkEnableOption "pgBackRest"; 48 enable = mkEnableOption "pgBackRest";
45 49
46 package = mkPackageOption pkgs "pgbackrest" {}; 50 package = mkPackageOption pkgs "pgbackrest" {};
51 dscpPackage = mkPackageOption pkgs "libdscp" { nullable = true; default = null; };
52
53 dscp.archive-push = mkDSCPOption { default = 24; };
54 dscp.backup = mkDSCPOption { default = 8; };
47 55
48 configurePostgresql = { 56 configurePostgresql = {
49 enable = mkEnableOption "configuring PostgreSQL for sending WAL to pgBackRest" // { 57 enable = mkEnableOption "configuring PostgreSQL for sending WAL to pgBackRest" // {
@@ -145,14 +153,32 @@ in {
145 environment.systemPackages = [ cfg.package ]; 153 environment.systemPackages = [ cfg.package ];
146 154
147 services.postgresql.settings = mkIf cfg.configurePostgresql.enable { 155 services.postgresql.settings = mkIf cfg.configurePostgresql.enable {
148 archive_command = "pgbackrest --stanza ${escapeSystemdExecArg cfg.configurePostgresql.stanza} archive-push %p"; 156 archive_command = let
157 pgbackrest-dscp-wrapped = pkgs.writeShellApplication {
158 name = "pgbackrest-dscp";
159 runtimeInputs = [ cfg.package ];
160 text = ''
161 export LD_PRELOAD
162 LD_PRELOAD=''${LD_PRELOAD:+':'$LD_PRELOAD':'}
163 if [[ $LD_PRELOAD != *':'''${cfg.dscpPackage}/lib/libdscp.so''':'* ]]; then
164 LD_PRELOAD='${cfg.dscpPackage}/lib/libdscp.so'$LD_PRELOAD
165 fi
166 LD_PRELOAD=''${LD_PRELOAD#':'}
167 LD_PRELOAD=''${LD_PRELOAD%':'}
168
169 : "''${DSCP:=${toString cfg.dscp.archive-push}}"
170
171 exec -- pgbackrest "$@"
172 '';
173 };
174 pgbackrest = if cfg.dscpPackage != null then "${pgbackrest-dscp-wrapped}/bin/pgbackrest-dscp" else "${cfg.package}/bin/pgbackrest";
175 in "${pgbackrest} --stanza ${escapeShellArg cfg.configurePostgresql.stanza} archive-push %p";
149 archive_mode = true; 176 archive_mode = true;
150 max_wal_senders = mkDefault 3; 177 max_wal_senders = mkDefault 3;
151 wal_level = "replica"; 178 wal_level = "replica";
152 }; 179 };
153 180
154 systemd.services = { 181 systemd.services = {
155 postgresql.path = mkIf cfg.configurePostgresql.enable [ cfg.package ];
156 pgbackrest-tls-server = mkIf cfg.tlsServer.enable { 182 pgbackrest-tls-server = mkIf cfg.tlsServer.enable {
157 description = "pgBackRest TLS-Server"; 183 description = "pgBackRest TLS-Server";
158 wantedBy = [ "multi-user.target" ]; 184 wantedBy = [ "multi-user.target" ];
@@ -172,11 +198,6 @@ in {
172 Group = cfg.tlsServer.group; 198 Group = cfg.tlsServer.group;
173 ExecStart = "${cfg.package}/bin/pgbackrest server"; 199 ExecStart = "${cfg.package}/bin/pgbackrest server";
174 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; 200 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
175
176 Environment = [
177 "LD_PRELOAD=${pkgs.libdscp}/lib/libdscp.so"
178 "DSCP=8"
179 ];
180 }; 201 };
181 }; 202 };
182 } // mapAttrs' (name: backupCfg: nameValuePair "pgbackrest-backup@${escapeSystemdPath name}" { 203 } // mapAttrs' (name: backupCfg: nameValuePair "pgbackrest-backup@${escapeSystemdPath name}" {
@@ -189,9 +210,9 @@ in {
189 Restart = "on-failure"; 210 Restart = "on-failure";
190 RestartSec = "5min"; 211 RestartSec = "5min";
191 212
192 Environment = [ 213 Environment = mkIf (cfg.dscpPackage != null) [
193 "LD_PRELOAD=${pkgs.libdscp}/lib/libdscp.so" 214 "LD_PRELOAD=\"${cfg.dscpPackage}/lib/libdscp.so\""
194 "DSCP=8" 215 "DSCP=\"${toString cfg.dscp.backup}\""
195 ]; 216 ];
196 }; 217 };
197 }) cfg.backups; 218 }) cfg.backups;