|
20 | 20 |
|
21 | 21 | # withJIT installs the postgres' jit output as an extension but that is no shared object to load |
22 | 22 | cfgInstalledExtensions = lib.filter (x: x != "postgresql") (map (e: lib.getName e) cfg.finalPackage.installedExtensions); |
| 23 | + |
| 24 | + # TODO: upstream, this probably requires a new entry in passthru (passthru.libName ?) to pick if the object name doesn't match the plugin name or there are multiple |
| 25 | + # https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/services/databases/postgresql.nix#L81 |
| 26 | + getExtensionName = ext: { |
| 27 | + pgvector = "vector"; |
| 28 | + postgis = "postgis-3"; |
| 29 | + vectorchord = "vchord"; |
| 30 | + }.${ext} or ext; |
23 | 31 | in |
24 | 32 | { |
25 | 33 | options.services = { |
26 | 34 | postgresql = { |
27 | | - configurePgStatStatements = libS.mkOpinionatedOption "configure and enable pg_stat_statements extension"; |
| 35 | + configurePgStatStatements = libS.mkOpinionatedOption "configure and enable pg_stat_statements extension in all databases"; |
28 | 36 |
|
29 | 37 | databases = lib.mkOption { |
30 | 38 | type = lib.types.listOf lib.types.str; |
|
39 | 47 | ''; |
40 | 48 | }; |
41 | 49 |
|
42 | | - extensionToInstall = lib.mkOption { |
43 | | - type = lib.types.listOf lib.types.str; |
44 | | - defaultText = lib.literalExpression "config.services.postgresql.finalPackage.installedExtensions"; |
45 | | - description = "List of extensions which are going to be installed."; |
| 50 | + extensionsToInstall = lib.mkOption { |
| 51 | + type = with lib.types; attrsOf (listOf str); |
| 52 | + default = { }; |
| 53 | + example = { |
| 54 | + immich = [ "cube" "earthdistance" "pg_trgm" "unaccent" "uuid-ossp" "vector" "vchord" ]; |
| 55 | + mobilizon = [ "pg_trgm" "postgis" "unaccent" ]; |
| 56 | + }; |
| 57 | + description = "A mapping of which database gets which extensions installed."; |
46 | 58 | }; |
47 | 59 |
|
48 | | - installAllAvailableExtensions = libS.mkOpinionatedOption "install all extensions installed with `ALTER EXTENSION \"...\" UPDATE` or the extension equivalent custom SQL statements"; |
49 | | - |
50 | 60 | ensureUsers = lib.mkOption { |
51 | 61 | type = lib.types.listOf (lib.types.submodule { |
52 | 62 | options = { |
|
193 | 203 | }; |
194 | 204 |
|
195 | 205 | imports = [ |
196 | | - (lib.mkRenamedOptionModule ["services" "postgresql" "enableAllPreloadedLibraries"] ["services" "postgresql" "installAllAvailableExtensions"]) |
| 206 | + (lib.mkRemovedOptionModule ["services" "postgresql" "enableAllPreloadedLibraries"] "Use services.postgresql.extensionsToInstall instead.") |
| 207 | + (lib.mkRemovedOptionModule ["services" "postgresql" "installAllAvailableExtensions"] "Use services.postgresql.extensionsToInstall instead.") |
| 208 | + (lib.mkRenamedOptionModule ["services" "postgresql" "extensionToInstall"] ["services" "postgresql" "extensionsToInstall"]) |
197 | 209 | (lib.mkRenamedOptionModule ["services" "postgresql" "preloadAllExtensions"] ["services" "postgresql" "preloadAllInstalledExtensions"]) |
198 | 210 | ]; |
199 | 211 |
|
|
295 | 307 | databases = [ "postgres" ] ++ config.services.postgresql.ensureDatabases; |
296 | 308 | enableJIT = lib.mkIf cfg.recommendedDefaults true; |
297 | 309 | extensions = lib.mkIf cfg.pgRepackTimer.enable (ps: with ps; [ pg_repack ]); |
298 | | - extensionToInstall = lib.mkMerge [ |
299 | | - (lib.mkIf cfg.configurePgStatStatements [ "pg_stat_statements" ]) |
300 | | - cfgInstalledExtensions |
301 | | - ]; |
| 310 | + extensionsToInstall = { |
| 311 | + immich = lib.mkIf config.services.immich.enable [ "cube" "earthdistance" "pg_trgm" "unaccent" "uuid-ossp" "vector" "vchord" ]; |
| 312 | + }; |
302 | 313 | settings.shared_preload_libraries = lib.mkMerge [ |
303 | 314 | (lib.mkIf cfg.configurePgStatStatements [ "pg_stat_statements" ]) |
304 | | - # TODO: upstream, this probably requires a new entry in passthru to pick if the object name doesn't match the plugin name or there are multiple |
305 | | - # https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/services/databases/postgresql.nix#L81 |
306 | | - (let |
307 | | - # NOTE: move into extensions passthru.libName when upstreaming |
308 | | - getSoOrFallback = ext:{ |
309 | | - postgis = "postgis-3"; |
310 | | - }.${ext} or ext; |
311 | | - in lib.mkIf cfg.preloadAllInstalledExtensions (map getSoOrFallback cfgInstalledExtensions)) |
| 315 | + (lib.mkIf cfg.preloadAllInstalledExtensions (map getExtensionName cfgInstalledExtensions)) |
312 | 316 | ]; |
313 | 317 | upgrade.stopServices = with config.services; lib.mkMerge [ |
314 | 318 | (lib.mkIf (atuin.enable && atuin.database.createLocally) [ "atuin" ]) |
|
323 | 327 | (lib.mkIf (hydra.enable && (!lib.hasInfix ";host=" hydra.dbi)) [ |
324 | 328 | "hydra-evaluator" "hydra-notify" "hydra-send-stats" "hydra-update-gc-roots.service" "hydra-update-gc-roots.timer" "hydra-queue-runner" "hydra-server" |
325 | 329 | ]) |
| 330 | + (lib.mkIf (immich.enable && immich.database.host == "/run/postgresql") [ "immich-machine-learning" "immich-server" ]) |
326 | 331 | (lib.mkIf mailman.enable [ "mailman" "mailman-uwsgi" ]) |
327 | 332 | (lib.mkIf (mastodon.enable && mastodon.database.host == "/run/postgresql") [ "mastodon-sidekiq-all" "mastodon-streaming.target" "mastodon-web" ]) |
328 | 333 | # assume that when host is set, which is not the default, the database is none local |
|
404 | 409 |
|
405 | 410 | # install/update pg_stat_statements extension in all databases |
406 | 411 | # based on https://git.catgirl.cloud/999eagle/dotfiles-nix/-/blob/main/modules/system/server/postgres/default.nix#L294-302 |
407 | | - (lib.mkIf (cfg.installAllAvailableExtensions || cfg.configurePgStatStatements) (lib.concatStrings (map (db: |
408 | | - (lib.concatMapStringsSep "\n" (ext: let |
| 412 | + (lib.mkIf cfg.configurePgStatStatements (lib.concatStrings (map (db: /* bash */ '' |
| 413 | + psql -tAd '${db}' -c 'CREATE EXTENSION IF NOT EXISTS "pg_stat_statements"' |
| 414 | + psql -tAd '${db}' -c 'ALTER EXTENSION "pg_stat_statements" UPDATE' |
| 415 | + '') cfg.databases))) |
| 416 | + |
| 417 | + # install/update extensions per database as configured in extensionsToInstall |
| 418 | + (lib.concatStrings (lib.mapAttrsToList (db: exts: |
| 419 | + lib.concatMapStrings (ext: let |
409 | 420 | extUpdateStatement = name: { |
410 | 421 | # pg_repack cannot be updated but reinstalling it is safe |
411 | 422 | "pg_repack" = "DROP EXTENSION pg_repack CASCADE; CREATE EXTENSION pg_repack"; |
412 | 423 | "postgis" = "SELECT postgis_extensions_upgrade()"; |
413 | | - }.${name} or ''ALTER EXTENSION "${ext}" UPDATE''; |
| 424 | + }.${name} or ''ALTER EXTENSION "${getExtensionName ext}" UPDATE''; |
414 | 425 | in /* bash */ '' |
415 | | - psql -tAd '${db}' -c 'CREATE EXTENSION IF NOT EXISTS "${ext}"' |
| 426 | + psql -tAd '${db}' -c 'CREATE EXTENSION IF NOT EXISTS "${getExtensionName ext}"' |
416 | 427 | psql -tAd '${db}' -c '${extUpdateStatement ext}' |
417 | | - '') cfgInstalledExtensions |
418 | | - ) |
419 | | - ) cfg.databases))) |
| 428 | + '') exts |
| 429 | + ) cfg.extensionsToInstall)) |
420 | 430 |
|
421 | 431 | (lib.mkIf cfg.refreshCollation (lib.concatStrings (map (db: /* bash */ '' |
422 | 432 | psql -tAc 'ALTER DATABASE "${db}" REFRESH COLLATION VERSION' |
|
0 commit comments