2014-04-14 14:26:48 +00:00
|
|
|
|
{ config, lib, pkgs, ... }:
|
2009-12-03 12:20:24 +00:00
|
|
|
|
|
2014-04-14 14:26:48 +00:00
|
|
|
|
with lib;
|
2009-03-06 12:27:02 +00:00
|
|
|
|
|
2007-12-03 04:48:31 +00:00
|
|
|
|
let
|
|
|
|
|
|
2008-02-18 11:56:43 +00:00
|
|
|
|
cfg = config.services.postgresql;
|
|
|
|
|
|
2019-07-21 19:05:41 +00:00
|
|
|
|
postgresql =
|
|
|
|
|
if cfg.extraPlugins == []
|
|
|
|
|
then cfg.package
|
|
|
|
|
else cfg.package.withPackages (_: cfg.extraPlugins);
|
2008-02-18 11:56:43 +00:00
|
|
|
|
|
2020-08-01 14:02:14 +00:00
|
|
|
|
toStr = value:
|
|
|
|
|
if true == value then "yes"
|
|
|
|
|
else if false == value then "no"
|
|
|
|
|
else if isString value then "'${lib.replaceStrings ["'"] ["''"] value}'"
|
|
|
|
|
else toString value;
|
|
|
|
|
|
2009-12-02 17:18:25 +00:00
|
|
|
|
# The main PostgreSQL configuration file.
|
2020-07-11 12:00:00 +00:00
|
|
|
|
configFile = pkgs.writeTextDir "postgresql.conf" (concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${toStr v}") cfg.settings));
|
|
|
|
|
|
|
|
|
|
configFileCheck = pkgs.runCommand "postgresql-configfile-check" {} ''
|
|
|
|
|
${cfg.package}/bin/postgres -D${configFile} -C config_file >/dev/null
|
|
|
|
|
touch $out
|
|
|
|
|
'';
|
2009-12-02 17:18:25 +00:00
|
|
|
|
|
2020-02-14 17:16:34 +00:00
|
|
|
|
groupAccessAvailable = versionAtLeast postgresql.version "11.0";
|
2019-07-21 23:57:16 +00:00
|
|
|
|
|
2007-12-03 04:48:31 +00:00
|
|
|
|
in
|
2008-02-18 11:56:43 +00:00
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
{
|
2020-08-01 14:02:14 +00:00
|
|
|
|
imports = [
|
|
|
|
|
(mkRemovedOptionModule [ "services" "postgresql" "extraConfig" ] "Use services.postgresql.settings instead.")
|
|
|
|
|
];
|
2009-07-15 11:19:11 +00:00
|
|
|
|
|
|
|
|
|
###### interface
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
options = {
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
services.postgresql = {
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2022-08-28 19:18:44 +00:00
|
|
|
|
enable = mkEnableOption (lib.mdDoc "PostgreSQL Server");
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2012-08-15 21:01:19 +00:00
|
|
|
|
package = mkOption {
|
2014-02-27 12:22:04 +00:00
|
|
|
|
type = types.package;
|
2021-10-03 16:06:03 +00:00
|
|
|
|
example = literalExpression "pkgs.postgresql_11";
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2012-08-15 21:01:19 +00:00
|
|
|
|
PostgreSQL package to use.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
port = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.int;
|
2013-11-27 11:36:32 +00:00
|
|
|
|
default = 5432;
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2013-11-27 11:36:32 +00:00
|
|
|
|
The port on which PostgreSQL listens.
|
2009-07-15 11:19:11 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2020-07-11 12:00:00 +00:00
|
|
|
|
checkConfig = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc "Check the syntax of the configuration file at compile time";
|
2020-07-11 12:00:00 +00:00
|
|
|
|
};
|
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
dataDir = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.path;
|
2021-10-03 16:06:03 +00:00
|
|
|
|
defaultText = literalExpression ''"/var/lib/postgresql/''${config.services.postgresql.package.psqlSchema}"'';
|
2019-07-21 19:05:41 +00:00
|
|
|
|
example = "/var/lib/postgresql/11";
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2020-08-01 15:23:28 +00:00
|
|
|
|
The data directory for PostgreSQL. If left as the default value
|
|
|
|
|
this directory will automatically be created before the PostgreSQL server starts, otherwise
|
|
|
|
|
the sysadmin is responsible for ensuring the directory exists with appropriate ownership
|
|
|
|
|
and permissions.
|
2009-07-15 11:19:11 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
authentication = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.lines;
|
2012-03-19 16:49:13 +00:00
|
|
|
|
default = "";
|
2022-08-15 05:16:25 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2020-10-31 07:35:19 +00:00
|
|
|
|
Defines how users authenticate themselves to the server. See the
|
2022-08-15 05:16:25 +00:00
|
|
|
|
[PostgreSQL documentation for pg_hba.conf](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html)
|
2020-10-31 07:35:19 +00:00
|
|
|
|
for details on the expected format of this option. By default,
|
|
|
|
|
peer based authentication will be used for users connecting
|
|
|
|
|
via the Unix socket, and md5 password authentication will be
|
|
|
|
|
used for users connecting via TCP. Any added rules will be
|
|
|
|
|
inserted above the default rules. If you'd like to replace the
|
2022-08-15 05:16:25 +00:00
|
|
|
|
default rules entirely, you can use `lib.mkForce` in your
|
2020-10-31 07:35:19 +00:00
|
|
|
|
module.
|
2009-07-15 11:19:11 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2009-12-02 17:18:25 +00:00
|
|
|
|
identMap = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.lines;
|
2009-12-02 17:18:25 +00:00
|
|
|
|
default = "";
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2009-12-02 17:18:25 +00:00
|
|
|
|
Defines the mapping from system users to database users.
|
2019-09-05 01:36:19 +00:00
|
|
|
|
|
|
|
|
|
The general form is:
|
|
|
|
|
|
|
|
|
|
map-name system-username database-username
|
2009-07-15 11:19:11 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2019-07-24 20:34:21 +00:00
|
|
|
|
initdbArgs = mkOption {
|
2019-07-23 18:53:59 +00:00
|
|
|
|
type = with types; listOf str;
|
|
|
|
|
default = [];
|
2020-02-14 17:16:34 +00:00
|
|
|
|
example = [ "--data-checksums" "--allow-group-access" ];
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
|
|
|
|
Additional arguments passed to `initdb` during data dir
|
2019-07-23 18:53:59 +00:00
|
|
|
|
initialisation.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2013-07-14 03:01:48 +00:00
|
|
|
|
initialScript = mkOption {
|
|
|
|
|
type = types.nullOr types.path;
|
2013-10-30 16:37:45 +00:00
|
|
|
|
default = null;
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2013-07-14 03:01:48 +00:00
|
|
|
|
A file containing SQL statements to execute on first startup.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2019-02-25 02:33:16 +00:00
|
|
|
|
ensureDatabases = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = [];
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2019-02-25 02:33:16 +00:00
|
|
|
|
Ensures that the specified databases exist.
|
|
|
|
|
This option will never delete existing databases, especially not when the value of this
|
|
|
|
|
option is changed. This means that databases created once through this option or
|
|
|
|
|
otherwise have to be removed manually.
|
|
|
|
|
'';
|
|
|
|
|
example = [
|
|
|
|
|
"gitea"
|
|
|
|
|
"nextcloud"
|
|
|
|
|
];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ensureUsers = mkOption {
|
|
|
|
|
type = types.listOf (types.submodule {
|
|
|
|
|
options = {
|
|
|
|
|
name = mkOption {
|
|
|
|
|
type = types.str;
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2019-02-25 02:33:16 +00:00
|
|
|
|
Name of the user to ensure.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
ensurePermissions = mkOption {
|
|
|
|
|
type = types.attrsOf types.str;
|
|
|
|
|
default = {};
|
2022-08-03 20:46:41 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2019-02-25 02:33:16 +00:00
|
|
|
|
Permissions to ensure for the user, specified as an attribute set.
|
|
|
|
|
The attribute names specify the database and tables to grant the permissions for.
|
|
|
|
|
The attribute values specify the permissions to grant. You may specify one or
|
|
|
|
|
multiple comma-separated SQL privileges here.
|
|
|
|
|
|
|
|
|
|
For more information on how to specify the target
|
|
|
|
|
and on which privileges exist, see the
|
2022-08-03 20:46:41 +00:00
|
|
|
|
[GRANT syntax](https://www.postgresql.org/docs/current/sql-grant.html).
|
|
|
|
|
The attributes are used as `GRANT ''${attrValue} ON ''${attrName}`.
|
2019-02-25 02:33:16 +00:00
|
|
|
|
'';
|
2021-10-03 16:06:03 +00:00
|
|
|
|
example = literalExpression ''
|
2019-02-25 02:33:16 +00:00
|
|
|
|
{
|
2021-04-10 03:12:36 +00:00
|
|
|
|
"DATABASE \"nextcloud\"" = "ALL PRIVILEGES";
|
2019-02-25 02:33:16 +00:00
|
|
|
|
"ALL TABLES IN SCHEMA public" = "ALL PRIVILEGES";
|
|
|
|
|
}
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
default = [];
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2019-02-25 02:33:16 +00:00
|
|
|
|
Ensures that the specified users exist and have at least the ensured permissions.
|
|
|
|
|
The PostgreSQL users will be identified using peer authentication. This authenticates the Unix user with the
|
|
|
|
|
same name only, and that without the need for a password.
|
|
|
|
|
This option will never delete existing users or remove permissions, especially not when the value of this
|
|
|
|
|
option is changed. This means that users created and permissions assigned once through this option or
|
|
|
|
|
otherwise have to be removed manually.
|
|
|
|
|
'';
|
2021-10-03 16:06:03 +00:00
|
|
|
|
example = literalExpression ''
|
2019-02-25 02:33:16 +00:00
|
|
|
|
[
|
|
|
|
|
{
|
|
|
|
|
name = "nextcloud";
|
|
|
|
|
ensurePermissions = {
|
|
|
|
|
"DATABASE nextcloud" = "ALL PRIVILEGES";
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
name = "superuser";
|
|
|
|
|
ensurePermissions = {
|
|
|
|
|
"ALL TABLES IN SCHEMA public" = "ALL PRIVILEGES";
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
enableTCPIP = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.bool;
|
2009-07-15 11:19:11 +00:00
|
|
|
|
default = false;
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2013-11-27 11:36:32 +00:00
|
|
|
|
Whether PostgreSQL should listen on all network interfaces.
|
|
|
|
|
If disabled, the database can only be accessed via its Unix
|
|
|
|
|
domain socket or via TCP connections to localhost.
|
2009-07-15 11:19:11 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2010-05-09 20:42:00 +00:00
|
|
|
|
|
2020-05-07 21:11:38 +00:00
|
|
|
|
logLinePrefix = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
default = "[%p] ";
|
|
|
|
|
example = "%m [%p] ";
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2020-05-07 21:11:38 +00:00
|
|
|
|
A printf-style string that is output at the beginning of each log line.
|
2022-07-28 21:19:15 +00:00
|
|
|
|
Upstream default is `'%m [%p] '`, i.e. it includes the timestamp. We do
|
2020-05-07 21:11:38 +00:00
|
|
|
|
not include the timestamp, because journal has it anyway.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2010-05-09 20:42:00 +00:00
|
|
|
|
extraPlugins = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.listOf types.path;
|
2010-05-09 20:42:00 +00:00
|
|
|
|
default = [];
|
2021-10-03 16:06:03 +00:00
|
|
|
|
example = literalExpression "with pkgs.postgresql_11.pkgs; [ postgis pg_repack ]";
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2019-07-21 19:05:41 +00:00
|
|
|
|
List of PostgreSQL plugins. PostgreSQL version for each plugin should
|
2022-07-28 21:19:15 +00:00
|
|
|
|
match version for `services.postgresql.package` value.
|
2010-05-09 20:42:00 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2020-08-01 14:02:14 +00:00
|
|
|
|
settings = mkOption {
|
|
|
|
|
type = with types; attrsOf (oneOf [ bool float int str ]);
|
|
|
|
|
default = {};
|
2022-08-30 00:30:04 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2020-08-01 14:02:14 +00:00
|
|
|
|
PostgreSQL configuration. Refer to
|
2022-08-30 00:30:04 +00:00
|
|
|
|
<https://www.postgresql.org/docs/11/config-setting.html#CONFIG-SETTING-CONFIGURATION-FILE>
|
|
|
|
|
for an overview of `postgresql.conf`.
|
2020-08-01 14:02:14 +00:00
|
|
|
|
|
2022-08-30 00:30:04 +00:00
|
|
|
|
::: {.note}
|
|
|
|
|
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.
|
|
|
|
|
:::
|
2020-08-01 14:02:14 +00:00
|
|
|
|
'';
|
2021-10-03 16:06:03 +00:00
|
|
|
|
example = literalExpression ''
|
2020-08-01 14:02:14 +00:00
|
|
|
|
{
|
|
|
|
|
log_connections = true;
|
|
|
|
|
log_statement = "all";
|
|
|
|
|
logging_collector = true
|
|
|
|
|
log_disconnections = true
|
|
|
|
|
log_destination = lib.mkForce "syslog";
|
|
|
|
|
}
|
|
|
|
|
'';
|
2011-06-27 10:15:26 +00:00
|
|
|
|
};
|
2013-07-14 03:04:10 +00:00
|
|
|
|
|
|
|
|
|
recoveryConfig = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.nullOr types.lines;
|
2013-07-14 03:04:10 +00:00
|
|
|
|
default = null;
|
2022-07-28 21:19:15 +00:00
|
|
|
|
description = lib.mdDoc ''
|
|
|
|
|
Contents of the {file}`recovery.conf` file.
|
2013-07-14 03:04:10 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2020-08-13 01:06:31 +00:00
|
|
|
|
|
2017-09-02 19:23:56 +00:00
|
|
|
|
superUser = mkOption {
|
|
|
|
|
type = types.str;
|
2020-08-13 01:06:31 +00:00
|
|
|
|
default = "postgres";
|
2017-09-02 19:23:56 +00:00
|
|
|
|
internal = true;
|
2020-08-13 01:06:31 +00:00
|
|
|
|
readOnly = true;
|
2022-08-28 23:38:36 +00:00
|
|
|
|
description = lib.mdDoc ''
|
2020-08-13 01:06:31 +00:00
|
|
|
|
PostgreSQL superuser account to use for various operations. Internal since changing
|
|
|
|
|
this value would lead to breakage while setting up databases.
|
2017-09-02 19:23:56 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2009-07-15 11:19:11 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
};
|
2008-02-18 11:56:43 +00:00
|
|
|
|
|
|
|
|
|
|
2009-07-15 11:19:11 +00:00
|
|
|
|
###### implementation
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2019-07-23 18:53:59 +00:00
|
|
|
|
config = mkIf cfg.enable {
|
2009-07-15 11:19:11 +00:00
|
|
|
|
|
2020-08-01 14:02:14 +00:00
|
|
|
|
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;
|
|
|
|
|
};
|
|
|
|
|
|
2021-12-03 00:00:48 +00:00
|
|
|
|
services.postgresql.package = let
|
|
|
|
|
mkThrow = ver: throw "postgresql_${ver} was removed, please upgrade your postgresql version.";
|
|
|
|
|
in
|
2015-07-27 18:26:19 +00:00
|
|
|
|
# Note: when changing the default, make it conditional on
|
2018-07-25 20:22:54 +00:00
|
|
|
|
# ‘system.stateVersion’ to maintain compatibility with existing
|
2015-07-27 18:26:19 +00:00
|
|
|
|
# systems!
|
2022-05-03 22:23:08 +00:00
|
|
|
|
mkDefault (if versionAtLeast config.system.stateVersion "22.05" then pkgs.postgresql_14
|
|
|
|
|
else if versionAtLeast config.system.stateVersion "21.11" then pkgs.postgresql_13
|
2021-07-24 17:12:08 +00:00
|
|
|
|
else if versionAtLeast config.system.stateVersion "20.03" then pkgs.postgresql_11
|
2021-12-03 00:00:48 +00:00
|
|
|
|
else if versionAtLeast config.system.stateVersion "17.09" then mkThrow "9_6"
|
|
|
|
|
else mkThrow "9_5");
|
2017-05-30 20:05:39 +00:00
|
|
|
|
|
2020-08-01 14:44:17 +00:00
|
|
|
|
services.postgresql.dataDir = mkDefault "/var/lib/postgresql/${cfg.package.psqlSchema}";
|
2019-07-23 18:53:59 +00:00
|
|
|
|
|
2015-07-01 11:46:38 +00:00
|
|
|
|
services.postgresql.authentication = mkAfter
|
2012-03-19 16:49:13 +00:00
|
|
|
|
''
|
|
|
|
|
# Generated file; do not edit!
|
2020-02-15 21:55:35 +00:00
|
|
|
|
local all all peer
|
2012-03-19 16:49:13 +00:00
|
|
|
|
host all all 127.0.0.1/32 md5
|
|
|
|
|
host all all ::1/128 md5
|
|
|
|
|
'';
|
2012-08-06 15:45:59 +00:00
|
|
|
|
|
2018-06-29 23:58:35 +00:00
|
|
|
|
users.users.postgres =
|
2009-03-06 12:27:02 +00:00
|
|
|
|
{ name = "postgres";
|
2013-08-23 09:33:24 +00:00
|
|
|
|
uid = config.ids.uids.postgres;
|
|
|
|
|
group = "postgres";
|
2009-03-06 12:27:02 +00:00
|
|
|
|
description = "PostgreSQL server user";
|
2018-09-26 11:11:28 +00:00
|
|
|
|
home = "${cfg.dataDir}";
|
|
|
|
|
useDefaultShell = true;
|
2009-07-15 11:19:11 +00:00
|
|
|
|
};
|
2009-03-06 12:27:02 +00:00
|
|
|
|
|
2018-06-29 23:58:35 +00:00
|
|
|
|
users.groups.postgres.gid = config.ids.gids.postgres;
|
2009-03-06 12:27:02 +00:00
|
|
|
|
|
2016-02-09 00:07:23 +00:00
|
|
|
|
environment.systemPackages = [ postgresql ];
|
2009-03-06 12:27:02 +00:00
|
|
|
|
|
2019-08-07 11:17:36 +00:00
|
|
|
|
environment.pathsToLink = [
|
|
|
|
|
"/share/postgresql"
|
|
|
|
|
];
|
|
|
|
|
|
2020-07-11 12:00:00 +00:00
|
|
|
|
system.extraDependencies = lib.optional (cfg.checkConfig && pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform) configFileCheck;
|
|
|
|
|
|
2013-01-16 11:33:18 +00:00
|
|
|
|
systemd.services.postgresql =
|
2012-12-18 12:40:04 +00:00
|
|
|
|
{ description = "PostgreSQL Server";
|
2009-03-06 12:27:02 +00:00
|
|
|
|
|
2012-08-14 22:15:37 +00:00
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
2012-12-18 12:40:04 +00:00
|
|
|
|
after = [ "network.target" ];
|
2009-03-06 12:27:02 +00:00
|
|
|
|
|
2013-04-22 16:56:19 +00:00
|
|
|
|
environment.PGDATA = cfg.dataDir;
|
2009-11-06 22:56:47 +00:00
|
|
|
|
|
2016-02-09 00:07:23 +00:00
|
|
|
|
path = [ postgresql ];
|
2012-03-19 16:49:13 +00:00
|
|
|
|
|
2009-10-12 17:09:38 +00:00
|
|
|
|
preStart =
|
|
|
|
|
''
|
2015-07-02 07:08:02 +00:00
|
|
|
|
if ! test -e ${cfg.dataDir}/PG_VERSION; then
|
2020-08-01 15:39:18 +00:00
|
|
|
|
# Cleanup the data directory.
|
2016-02-09 00:07:23 +00:00
|
|
|
|
rm -f ${cfg.dataDir}/*.conf
|
2009-12-02 17:18:25 +00:00
|
|
|
|
|
2020-08-01 15:39:18 +00:00
|
|
|
|
# Initialise the database.
|
2019-07-24 20:34:21 +00:00
|
|
|
|
initdb -U ${cfg.superUser} ${concatStringsSep " " cfg.initdbArgs}
|
2020-08-01 15:39:18 +00:00
|
|
|
|
|
2016-02-09 00:07:23 +00:00
|
|
|
|
# See postStart!
|
|
|
|
|
touch "${cfg.dataDir}/.first_startup"
|
|
|
|
|
fi
|
2020-08-01 15:39:18 +00:00
|
|
|
|
|
2020-07-11 12:00:00 +00:00
|
|
|
|
ln -sfn "${configFile}/postgresql.conf" "${cfg.dataDir}/postgresql.conf"
|
2013-07-14 03:04:10 +00:00
|
|
|
|
${optionalString (cfg.recoveryConfig != null) ''
|
|
|
|
|
ln -sfn "${pkgs.writeText "recovery.conf" cfg.recoveryConfig}" \
|
|
|
|
|
"${cfg.dataDir}/recovery.conf"
|
|
|
|
|
''}
|
2016-02-09 00:07:23 +00:00
|
|
|
|
'';
|
2009-11-06 23:37:31 +00:00
|
|
|
|
|
2020-08-13 01:12:24 +00:00
|
|
|
|
# Wait for PostgreSQL to be ready to accept connections.
|
|
|
|
|
postStart =
|
|
|
|
|
''
|
|
|
|
|
PSQL="psql --port=${toString cfg.port}"
|
|
|
|
|
|
|
|
|
|
while ! $PSQL -d postgres -c "" 2> /dev/null; do
|
|
|
|
|
if ! kill -0 "$MAINPID"; then exit 1; fi
|
|
|
|
|
sleep 0.1
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if test -e "${cfg.dataDir}/.first_startup"; then
|
|
|
|
|
${optionalString (cfg.initialScript != null) ''
|
|
|
|
|
$PSQL -f "${cfg.initialScript}" -d postgres
|
|
|
|
|
''}
|
|
|
|
|
rm -f "${cfg.dataDir}/.first_startup"
|
|
|
|
|
fi
|
|
|
|
|
'' + optionalString (cfg.ensureDatabases != []) ''
|
|
|
|
|
${concatMapStrings (database: ''
|
|
|
|
|
$PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${database}'" | grep -q 1 || $PSQL -tAc 'CREATE DATABASE "${database}"'
|
|
|
|
|
'') cfg.ensureDatabases}
|
|
|
|
|
'' + ''
|
|
|
|
|
${concatMapStrings (user: ''
|
|
|
|
|
$PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${user.name}'" | grep -q 1 || $PSQL -tAc 'CREATE USER "${user.name}"'
|
|
|
|
|
${concatStringsSep "\n" (mapAttrsToList (database: permission: ''
|
|
|
|
|
$PSQL -tAc 'GRANT ${permission} ON ${database} TO "${user.name}"'
|
|
|
|
|
'') user.ensurePermissions)}
|
|
|
|
|
'') cfg.ensureUsers}
|
|
|
|
|
'';
|
|
|
|
|
|
2020-08-01 15:23:28 +00:00
|
|
|
|
serviceConfig = mkMerge [
|
2016-02-09 00:07:23 +00:00
|
|
|
|
{ ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
|
2012-10-01 20:47:54 +00:00
|
|
|
|
User = "postgres";
|
|
|
|
|
Group = "postgres";
|
2019-03-15 03:52:35 +00:00
|
|
|
|
RuntimeDirectory = "postgresql";
|
2019-07-24 20:34:21 +00:00
|
|
|
|
Type = if versionAtLeast cfg.package.version "9.6"
|
2018-11-27 19:16:21 +00:00
|
|
|
|
then "notify"
|
|
|
|
|
else "simple";
|
2012-10-01 20:47:54 +00:00
|
|
|
|
|
|
|
|
|
# Shut down Postgres using SIGINT ("Fast Shutdown mode"). See
|
2012-04-30 18:15:32 +00:00
|
|
|
|
# http://www.postgresql.org/docs/current/static/server-shutdown.html
|
2012-10-01 20:27:42 +00:00
|
|
|
|
KillSignal = "SIGINT";
|
2014-04-18 15:32:24 +00:00
|
|
|
|
KillMode = "mixed";
|
2012-04-30 18:15:32 +00:00
|
|
|
|
|
2012-03-19 16:49:13 +00:00
|
|
|
|
# Give Postgres a decent amount of time to clean up after
|
2012-08-06 15:45:59 +00:00
|
|
|
|
# receiving systemd's SIGINT.
|
2013-05-07 12:59:08 +00:00
|
|
|
|
TimeoutSec = 120;
|
2020-08-01 15:39:18 +00:00
|
|
|
|
|
|
|
|
|
ExecStart = "${postgresql}/bin/postgres";
|
2020-08-01 15:23:28 +00:00
|
|
|
|
}
|
|
|
|
|
(mkIf (cfg.dataDir == "/var/lib/postgresql/${cfg.package.psqlSchema}") {
|
|
|
|
|
StateDirectory = "postgresql postgresql/${cfg.package.psqlSchema}";
|
|
|
|
|
StateDirectoryMode = if groupAccessAvailable then "0750" else "0700";
|
|
|
|
|
})
|
|
|
|
|
];
|
2012-10-01 20:47:54 +00:00
|
|
|
|
|
2012-10-01 20:53:13 +00:00
|
|
|
|
unitConfig.RequiresMountsFor = "${cfg.dataDir}";
|
2009-10-12 17:09:38 +00:00
|
|
|
|
};
|
2009-07-15 11:19:11 +00:00
|
|
|
|
|
2009-03-06 12:27:02 +00:00
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
|
2016-05-09 05:53:27 +00:00
|
|
|
|
meta.doc = ./postgresql.xml;
|
2019-07-21 23:57:16 +00:00
|
|
|
|
meta.maintainers = with lib.maintainers; [ thoughtpolice danbst ];
|
2007-12-03 04:48:31 +00:00
|
|
|
|
}
|