Skip to content

Commit

Permalink
nixos/postgresql: turn settings into a submodule
Browse files Browse the repository at this point in the history
The main idea behind that was to be able to do more sophisticated
merging for stuff that goes into `postgresql.conf`:
`shared_preload_libraries` is a comma-separated list in a `types.str`
and thus not mergeable. With this change, the option accepts both a
comma-separated string xor a list of strings.

This can be implemented rather quick using `coercedTo` +
freeform modules. The interface still behaves equally, but it allows to
merge declarations for this option together.

One side-effect was that I had to change the `attrsOf (oneOf ...)` part into
a submodule to allow declaring options for certain things. While at it,
I decided to move `log_line_prefix` and `port` into this structure as
well.
  • Loading branch information
Ma27 committed Mar 17, 2024
1 parent 6af7e81 commit 16ba914
Show file tree
Hide file tree
Showing 13 changed files with 57 additions and 44 deletions.
6 changes: 3 additions & 3 deletions nixos/modules/services/databases/postgresql.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ are already created.
before = "service1.service";
after = "postgresql.service";
serviceConfig.User = "postgres";
environment.PSQL = "psql --port=${toString services.postgresql.port}";
environment.PSQL = "psql --port=${toString services.postgresql.settings.port}";
path = [ postgresql ];
script = ''
$PSQL service1 -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO "extraUser1"'
Expand All @@ -130,7 +130,7 @@ are already created.
##### in service `preStart` {#module-services-postgres-initializing-extra-permissions-service-user-pre-start}

```nix
environment.PSQL = "psql --port=${toString services.postgresql.port}";
environment.PSQL = "psql --port=${toString services.postgresql.settings.port}";
path = [ postgresql ];
systemd.services."service1".preStart = ''
$PSQL -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO "extraUser1"'
Expand All @@ -148,7 +148,7 @@ are already created.
before = "service1.service";
after = "postgresql.service";
serviceConfig.User = "service1";
environment.PSQL = "psql --port=${toString services.postgresql.port}";
environment.PSQL = "psql --port=${toString services.postgresql.settings.port}";
path = [ postgresql ];
script = ''
$PSQL -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO "extraUser1"'
Expand Down
61 changes: 37 additions & 24 deletions nixos/modules/services/databases/postgresql.nix
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ let
else toString value;

# The main PostgreSQL configuration file.
configFile = pkgs.writeTextDir "postgresql.conf" (concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${toStr v}") cfg.settings));
configFile = pkgs.writeTextDir "postgresql.conf" (concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${toStr v}") (filterAttrs (const (x: x != null)) cfg.settings)));

configFileCheck = pkgs.runCommand "postgresql-configfile-check" {} ''
${cfg.package}/bin/postgres -D${configFile} -C config_file >/dev/null
Expand All @@ -41,6 +41,9 @@ in
{
imports = [
(mkRemovedOptionModule [ "services" "postgresql" "extraConfig" ] "Use services.postgresql.settings instead.")

(mkRenamedOptionModule [ "services" "postgresql" "logLinePrefix" ] [ "services" "postgresql" "settings" "log_line_prefix" ])
(mkRenamedOptionModule [ "services" "postgresql" "port" ] [ "services" "postgresql" "settings" "port" ])
];

###### interface
Expand All @@ -57,14 +60,6 @@ in
example = "postgresql_15";
};

port = mkOption {
type = types.port;
default = 5432;
description = lib.mdDoc ''
The port on which PostgreSQL listens.
'';
};

checkConfig = mkOption {
type = types.bool;
default = true;
Expand Down Expand Up @@ -352,17 +347,6 @@ in
'';
};

logLinePrefix = mkOption {
type = types.str;
default = "[%p] ";
example = "%m [%p] ";
description = lib.mdDoc ''
A printf-style string that is output at the beginning of each log line.
Upstream default is `'%m [%p] '`, i.e. it includes the timestamp. We do
not include the timestamp, because journal has it anyway.
'';
};

extraPlugins = mkOption {
type = with types; coercedTo (listOf path) (path: _ignorePg: path) (functionTo (listOf path));
default = _: [];
Expand All @@ -373,7 +357,38 @@ in
};

settings = mkOption {
type = with types; attrsOf (oneOf [ bool float int str ]);
type = with types; submodule {
freeformType = attrsOf (oneOf [ bool float int str ]);
options = {
shared_preload_libraries = mkOption {
type = nullOr (coercedTo (listOf str) (concatStringsSep ", ") str);
default = null;
example = literalExpression ''[ "auto_explain" "anon" ]'';
description = mdDoc ''
List of libraries to be preloaded.
'';
};

log_line_prefix = mkOption {
type = types.str;
default = "[%p] ";
example = "%m [%p] ";
description = lib.mdDoc ''
A printf-style string that is output at the beginning of each log line.
Upstream default is `'%m [%p] '`, i.e. it includes the timestamp. We do
not include the timestamp, because journal has it anyway.
'';
};

port = mkOption {
type = types.port;
default = 5432;
description = lib.mdDoc ''
The port on which PostgreSQL listens.
'';
};
};
};
default = {};
description = lib.mdDoc ''
PostgreSQL configuration. Refer to
Expand Down Expand Up @@ -439,9 +454,7 @@ in
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;
jit = mkDefault (if cfg.enableJIT then "on" else "off");
};

Expand Down Expand Up @@ -524,7 +537,7 @@ in
# Wait for PostgreSQL to be ready to accept connections.
postStart =
''
PSQL="psql --port=${toString cfg.port}"
PSQL="psql --port=${toString cfg.settings.port}"
while ! $PSQL -d postgres -c "" 2> /dev/null; do
if ! kill -0 "$MAINPID"; then exit 1; fi
Expand Down
4 changes: 2 additions & 2 deletions nixos/modules/services/misc/forgejo.nix
Original file line number Diff line number Diff line change
Expand Up @@ -114,11 +114,11 @@ in

port = mkOption {
type = types.port;
default = if !usePostgresql then 3306 else pg.port;
default = if !usePostgresql then 3306 else pg.settings.port;
defaultText = literalExpression ''
if config.${opt.database.type} != "postgresql"
then 3306
else config.${options.services.postgresql.port}
else 5432
'';
description = mdDoc "Database host port.";
};
Expand Down
4 changes: 2 additions & 2 deletions nixos/modules/services/misc/gitea.nix
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,11 @@ in

port = mkOption {
type = types.port;
default = if !usePostgresql then 3306 else pg.port;
default = if !usePostgresql then 3306 else pg.settings.port;
defaultText = literalExpression ''
if config.${opt.database.type} != "postgresql"
then 3306
else config.${options.services.postgresql.port}
else 5432
'';
description = lib.mdDoc "Database host port.";
};
Expand Down
4 changes: 2 additions & 2 deletions nixos/modules/services/monitoring/zabbix-proxy.nix
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ in

port = mkOption {
type = types.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.services.port;
defaultText = literalExpression ''
if config.${opt.database.type} == "mysql"
then config.${options.services.mysql.port}
else config.${options.services.postgresql.port}
else config.services.postgresql.settings.port
'';
description = lib.mdDoc "Database host port.";
};
Expand Down
4 changes: 2 additions & 2 deletions nixos/modules/services/monitoring/zabbix-server.nix
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,11 @@ in

port = mkOption {
type = types.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.port;
default = if cfg.database.type == "mysql" then mysql.port else pgsql.settings.port;
defaultText = literalExpression ''
if config.${opt.database.type} == "mysql"
then config.${options.services.mysql.port}
else config.${options.services.postgresql.port}
else config.services.postgresql.settings.port
'';
description = lib.mdDoc "Database host port.";
};
Expand Down
4 changes: 2 additions & 2 deletions nixos/modules/services/web-apps/invidious.nix
Original file line number Diff line number Diff line change
Expand Up @@ -346,8 +346,8 @@ in

port = lib.mkOption {
type = types.port;
default = options.services.postgresql.port.default;
defaultText = lib.literalExpression "options.services.postgresql.port.default";
default = config.services.postgresql.settings.port;
defaultText = lib.literalExpression "config.services.postgresql.settings.port";
description = lib.mdDoc ''
The port of the database Invidious should use.
Expand Down
4 changes: 2 additions & 2 deletions nixos/modules/services/web-apps/zabbix.nix
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@ in
type = types.port;
default =
if cfg.database.type == "mysql" then config.services.mysql.port
else if cfg.database.type == "pgsql" then config.services.postgresql.port
else if cfg.database.type == "pgsql" then config.services.postgresql.settings.port
else 1521;
defaultText = literalExpression ''
if config.${opt.database.type} == "mysql" then config.${options.services.mysql.port}
else if config.${opt.database.type} == "pgsql" then config.${options.services.postgresql.port}
else if config.${opt.database.type} == "pgsql" then config.services.postgresql.settings.port
else 1521
'';
description = lib.mdDoc "Database host port.";
Expand Down
2 changes: 1 addition & 1 deletion nixos/tests/invidious.nix
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import ./make-test-python.nix ({ pkgs, ... }: {
host invidious invidious samenet scram-sha-256
'';
};
networking.firewall.allowedTCPPorts = [ config.services.postgresql.port ];
networking.firewall.allowedTCPPorts = [ config.services.postgresql.settings.port ];
};
machine = { config, lib, pkgs, ... }: {
services.invidious = {
Expand Down
2 changes: 1 addition & 1 deletion nixos/tests/miniflux.nix
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ in
systemd.services.postgresql.postStart = lib.mkAfter ''
$PSQL -tAd miniflux -c 'CREATE EXTENSION hstore;'
'';
networking.firewall.allowedTCPPorts = [ config.services.postgresql.port ];
networking.firewall.allowedTCPPorts = [ config.services.postgresql.settings.port ];
};
externalDb = { ... }: {
security.apparmor.enable = true;
Expand Down
2 changes: 1 addition & 1 deletion nixos/tests/pg_anonymizer.nix
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
services.postgresql = {
enable = true;
extraPlugins = ps: [ ps.anonymizer ];
settings.shared_preload_libraries = "anon";
settings.shared_preload_libraries = [ "anon" ];
};
};

Expand Down
2 changes: 1 addition & 1 deletion nixos/tests/pgmanage.nix
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ in
pgmanage = {
enable = true;
connections = {
${conn} = "hostaddr=127.0.0.1 port=${toString config.services.postgresql.port} dbname=postgres";
${conn} = "hostaddr=127.0.0.1 port=${toString config.services.postgresql.settings.port} dbname=postgres";
};
};
};
Expand Down
2 changes: 1 addition & 1 deletion nixos/tests/web-apps/mastodon/remote-databases.nix
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ in
extraHosts = hosts;
firewall.allowedTCPPorts = [
config.services.redis.servers.mastodon.port
config.services.postgresql.port
config.services.postgresql.settings.port
];
};

Expand Down

0 comments on commit 16ba914

Please sign in to comment.