X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=modules%2Fprivate%2Fdatabases%2Fpostgresql.nix;h=e73bf69eb7f78b5c73e6d2727b10fc8818ce0735;hb=da30ae4ffdd153a1eb32fb86f9ca9a65aa19e4e2;hp=911a6d1b2a22ddfac33cf6965db78d7d3b619974;hpb=4aac110f17f0528d90510eec00c9a8df60bcf04f;p=perso%2FImmae%2FConfig%2FNix.git diff --git a/modules/private/databases/postgresql.nix b/modules/private/databases/postgresql.nix index 911a6d1..e73bf69 100644 --- a/modules/private/databases/postgresql.nix +++ b/modules/private/databases/postgresql.nix @@ -5,7 +5,7 @@ in { options.myServices.databases = { postgresql = { enable = lib.mkOption { - default = cfg.enable; + default = false; example = true; description = "Whether to enable postgresql database"; type = lib.types.bool; @@ -91,16 +91,6 @@ in { ''; readOnly = true; }; - systemdRuntimeDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if socketsDir is outside of /run - default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; - lib.strings.removePrefix "/run/" cfg.socketsDir; - description = '' - Adjusted Postgresql sockets directory for systemd - ''; - readOnly = true; - }; }; }; @@ -110,7 +100,6 @@ in { security.acme.certs."postgresql" = config.myServices.databasesCerts // { user = "postgres"; group = "postgres"; - plugins = [ "fullchain.pem" "key.pem" "account_key.json" ]; domain = "db-1.immae.eu"; postRun = '' systemctl reload postgresql.service @@ -119,8 +108,28 @@ in { systemd.services.postgresql.serviceConfig = { SupplementaryGroups = "keys"; - RuntimeDirectory = cfg.systemdRuntimeDirectory; }; + systemd.services.postgresql.postStart = lib.mkAfter '' + # This line is already defined in 19.09 + PSQL="${pkgs.sudo}/bin/sudo -u postgres psql --port=5432" + + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: '' + $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" \ + | grep -q 1 \ + || $PSQL -tAc 'CREATE USER "${role}" WITH REPLICATION' + '') cfg.replicationHosts)} + + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: + let + sname = builtins.replaceStrings ["-"] ["_"] role; + in + '' + $PSQL -tAc "SELECT 1 FROM pg_replication_slots WHERE slot_name='${sname}'" \ + | grep -q 1 \ + || $PSQL -tAc "SELECT * FROM pg_create_physical_replication_slot('${sname}')" + '') cfg.replicationHosts)} + ''; + services.postgresql = { enable = true; package = cfg.package; @@ -140,9 +149,12 @@ in { lc_numeric = 'en_US.UTF-8' lc_time = 'en_US.UTF-8' default_text_search_config = 'pg_catalog.english' + # this introduces a small delay before storing on disk, but + # makes it order of magnitudes quicker + synchronous_commit = off ssl = on - ssl_cert_file = '${config.security.acme.directory}/postgresql/fullchain.pem' - ssl_key_file = '${config.security.acme.directory}/postgresql/key.pem' + ssl_cert_file = '${config.security.acme.certs.postgresql.directory}/fullchain.pem' + ssl_key_file = '${config.security.acme.certs.postgresql.directory}/key.pem' ''; authentication = let hosts = builtins.concatStringsSep "\n" ( @@ -199,22 +211,20 @@ in { security.pam.services = let pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so"; - in [ - { - name = "postgresql"; + in { + postgresql = { text = '' - auth required ${pam_ldap} config=${config.secrets.location}/postgresql/pam - account required ${pam_ldap} config=${config.secrets.location}/postgresql/pam + auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"} + account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"} ''; - } - { - name = "postgresql_replication"; + }; + postgresql_replication = { text = '' - auth required ${pam_ldap} config=${config.secrets.location}/postgresql/pam_replication - account required ${pam_ldap} config=${config.secrets.location}/postgresql/pam_replication + auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"} + account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"} ''; - } - ]; + }; + }; }; }