diff --git a/nixos/modules/services/databases/postgresql.nix b/nixos/modules/services/databases/postgresql.nix
index c726a08e34f..5056d50153f 100644
--- a/nixos/modules/services/databases/postgresql.nix
+++ b/nixos/modules/services/databases/postgresql.nix
@@ -11,23 +11,23 @@ let
then cfg.package
else cfg.package.withPackages (_: cfg.extraPlugins);
+ toStr = value:
+ if true == value then "yes"
+ else if false == value then "no"
+ else if isString value then "'${lib.replaceStrings ["'"] ["''"] value}'"
+ else toString value;
+
# The main PostgreSQL configuration file.
- configFile = pkgs.writeText "postgresql.conf"
- ''
- hba_file = '${pkgs.writeText "pg_hba.conf" cfg.authentication}'
- ident_file = '${pkgs.writeText "pg_ident.conf" cfg.identMap}'
- log_destination = 'stderr'
- log_line_prefix = '${cfg.logLinePrefix}'
- listen_addresses = '${if cfg.enableTCPIP then "*" else "localhost"}'
- port = ${toString cfg.port}
- ${cfg.extraConfig}
- '';
+ configFile = pkgs.writeText "postgresql.conf" (concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${toStr v}") cfg.settings));
groupAccessAvailable = versionAtLeast postgresql.version "11.0";
in
{
+ imports = [
+ (mkRemovedOptionModule [ "services" "postgresql" "extraConfig" ] "Use services.postgresql.settings instead.")
+ ];
###### interface
@@ -212,10 +212,28 @@ in
'';
};
- extraConfig = mkOption {
- type = types.lines;
- default = "";
- description = "Additional text to be appended to postgresql.conf.";
+ settings = mkOption {
+ type = with types; attrsOf (oneOf [ bool float int str ]);
+ default = {};
+ description = ''
+ PostgreSQL configuration. Refer to
+
+ for an overview of postgresql.conf.
+
+
+ String values will automatically be enclosed in single quotes. Single quotes will be
+ escaped with two single quotes as described by the upstream documentation linked above.
+
+ '';
+ example = literalExample ''
+ {
+ log_connections = true;
+ log_statement = "all";
+ logging_collector = true
+ log_disconnections = true
+ log_destination = lib.mkForce "syslog";
+ }
+ '';
};
recoveryConfig = mkOption {
@@ -245,6 +263,16 @@ in
config = mkIf cfg.enable {
+ services.postgresql.settings =
+ {
+ hba_file = "${pkgs.writeText "pg_hba.conf" cfg.authentication}";
+ ident_file = "${pkgs.writeText "pg_ident.conf" cfg.identMap}";
+ log_destination = "stderr";
+ log_line_prefix = cfg.logLinePrefix;
+ listen_addresses = if cfg.enableTCPIP then "*" else "localhost";
+ port = cfg.port;
+ };
+
services.postgresql.package =
# Note: when changing the default, make it conditional on
# ‘system.stateVersion’ to maintain compatibility with existing
diff --git a/nixos/tests/postgresql-wal-receiver.nix b/nixos/tests/postgresql-wal-receiver.nix
index 3be95187fe2..432b46234f9 100644
--- a/nixos/tests/postgresql-wal-receiver.nix
+++ b/nixos/tests/postgresql-wal-receiver.nix
@@ -14,13 +14,10 @@ let
baseBackupDir = "/tmp/pg_basebackup";
walBackupDir = "/tmp/pg_wal";
atLeast12 = lib.versionAtLeast pkg.version "12.0";
- restoreCommand = ''
- restore_command = 'cp ${walBackupDir}/%f %p'
- '';
recoveryFile = if atLeast12
then pkgs.writeTextDir "recovery.signal" ""
- else pkgs.writeTextDir "recovery.conf" "${restoreCommand}";
+ else pkgs.writeTextDir "recovery.conf" "restore_command = 'cp ${walBackupDir}/%f %p'";
in {
name = "postgresql-wal-receiver-${postgresqlPackage}";
@@ -30,14 +27,17 @@ let
services.postgresql = {
package = pkg;
enable = true;
- extraConfig = ''
- wal_level = archive # alias for replica on pg >= 9.6
- max_wal_senders = 10
- max_replication_slots = 10
- '' + lib.optionalString atLeast12 ''
- ${restoreCommand}
- recovery_end_command = 'touch recovery.done'
- '';
+ settings = lib.mkMerge [
+ {
+ wal_level = "archive"; # alias for replica on pg >= 9.6
+ max_wal_senders = 10;
+ max_replication_slots = 10;
+ }
+ (lib.mkIf atLeast12 {
+ restore_command = "cp ${walBackupDir}/%f %p";
+ recovery_end_command = "touch recovery.done";
+ })
+ ];
authentication = ''
host replication ${replicationUser} all trust
'';