{ config, inputs, lib, pkgs, this, ... }: with lib; let cfg = config.nixfiles.modules.postgresql; in { options.nixfiles.modules.postgresql = { enable = mkEnableOption "PostgreSQL"; package = mkOption { type = types.package; default = pkgs.postgresql_15; description = "PostgreSQL package to use."; }; extraPostStart = mkOption { type = with types; listOf str; default = [ ]; description = '' Additional post-startup commands. This could be used to provide a crude interface to grant permissions and such. ''; }; }; config = mkIf cfg.enable { assertions = [ { assertion = any (x: x == "en_GB.UTF-8/UTF-8") config.i18n.supportedLocales; message = "The locale must be available"; } ]; ark.directories = [ config.services.postgresql.dataDir ]; services = { postgresql = { enable = true; inherit (cfg) package; # In hindsight, it was a poor choice to use ICU as a locale provider. # Now each time ICU version is bumped, I need to carefully upgrade each # database to match the version. initdbArgs = [ "--encoding=UTF8" "--locale-provider=icu" "--icu-locale=en_GB@collation=posix" "--locale=en_GB.UTF-8" "--lc-collate=C" "--lc-ctype=C" ]; # This crutch is here because some services cannot work via a UNIX # socket connection and I can't be bothered to configure proper # authentication. authentication = '' local all all trust ''; }; prometheus.exporters.postgres = { enable = true; listenAddress = mkDefault this.wireguard.ipv4.address; port = mkDefault 9187; }; }; systemd.services.postgresql.postStart = optionalString ( cfg.extraPostStart != [ ] ) concatLines cfg.extraPostStart; environment.variables.PSQLRC = toString ( pkgs.writeText "psqlrc" '' \set QUIET 1 \timing \x auto \pset null '[NULL]' \set PROMPT1 '%[%033[1m%]%M %n@%/%R%[%033[0m%]% λ ' \set PROMPT2 ' … > ' \set VERBOSITY verbose \set HISTCONTROL ignoredups \set HISTFILE /dev/null \unset QUIET '' ); topology = { nodes.${this.hostname}.services.postgresql = { name = "PostgreSQL"; icon = "${inputs.homelab-svg-assets}/assets/postgresql.svg"; details.listen.text = "127.0.0.1:5432"; }; }; }; }