|
36 | 36 | });
|
37 | 37 | };
|
38 | 38 |
|
| 39 | + pgRepackTimer = { |
| 40 | + enable = libS.mkOpinionatedOption "install pg_repack and configure a systemd timer to run it periodically on all DBs"; |
| 41 | + |
| 42 | + timerConfig = lib.mkOption { |
| 43 | + type = lib.types.nullOr (lib.types.attrsOf utils.systemdUtils.unitOptions.unitOption); |
| 44 | + default = { |
| 45 | + OnCalendar = "02:00"; |
| 46 | + Persistent = true; |
| 47 | + RandomizedDelaySec = "10m"; |
| 48 | + }; |
| 49 | + example = { |
| 50 | + OnCalendar = "06:00"; |
| 51 | + Persistent = true; |
| 52 | + RandomizedDelaySec = "5h"; |
| 53 | + }; |
| 54 | + description = '' |
| 55 | + When to run the VACUUM ANALYZE. |
| 56 | + See {manpage}`systemd.timer(5)` for details. |
| 57 | + ''; |
| 58 | + }; |
| 59 | + }; |
| 60 | + |
39 | 61 | preloadAllExtensions = libS.mkOpinionatedOption "load all installed extensions through `shared_preload_libraries`";
|
40 | 62 |
|
41 | 63 | recommendedDefaults = libS.mkOpinionatedOption "set recommended default settings";
|
|
93 | 115 | };
|
94 | 116 |
|
95 | 117 | vacuumAnalyzeTimer = {
|
96 |
| - enable = libS.mkOpinionatedOption "timer to run VACUUM ANALYZE on all DBs"; |
| 118 | + enable = libS.mkOpinionatedOption "configure a systemd timer to run `VACUUM ANALYZE` periodically on all DBs"; |
97 | 119 |
|
98 | 120 | timerConfig = lib.mkOption {
|
99 | 121 | type = lib.types.nullOr (lib.types.attrsOf utils.systemdUtils.unitOptions.unitOption);
|
100 | 122 | default = {
|
101 | 123 | OnCalendar = "03:00";
|
102 | 124 | Persistent = true;
|
103 |
| - RandomizedDelaySec = "30m"; |
| 125 | + RandomizedDelaySec = "10m"; |
104 | 126 | };
|
105 | 127 | example = {
|
106 | 128 | OnCalendar = "06:00";
|
|
194 | 216 | postgresql = {
|
195 | 217 | databases = [ "postgres" ] ++ config.services.postgresql.ensureDatabases;
|
196 | 218 | enableJIT = lib.mkIf cfg.recommendedDefaults true;
|
| 219 | + extensions = lib.mkIf cfg.pgRepackTimer.enable (ps: with ps; [ pg_repack ]); |
197 | 220 | settings.shared_preload_libraries =
|
198 | 221 | lib.optional cfg.configurePgStatStatements "pg_stat_statements"
|
199 | 222 | # 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
|
|
210 | 233 | name = lib.getName so;
|
211 | 234 | in {
|
212 | 235 | postgis = "postgis-3";
|
| 236 | + # withJIT installs the postgres' jit output as an extension but that is no shared object to load |
| 237 | + postgresql = null; |
213 | 238 | }.${name} or name;
|
214 |
| - in lib.optionals cfg.preloadAllExtensions (map getSoOrFallback finalPackage.installedExtensions)); |
| 239 | + in lib.optionals cfg.preloadAllExtensions (lib.filter (x: x != null) (map getSoOrFallback finalPackage.installedExtensions))); |
215 | 240 | upgrade.stopServices = with config.services; lib.mkMerge [
|
216 | 241 | (lib.mkIf (atuin.enable && atuin.database.createLocally) [ "atuin" ])
|
217 | 242 | (lib.mkIf (gancio.enable && gancio.settings.db.dialect == "postgres") [ "gancio" ])
|
|
305 | 330 | stopIfChanged = lib.mkIf cfg.recommendedDefaults false;
|
306 | 331 | };
|
307 | 332 |
|
| 333 | + postgresql-pg-repack = lib.mkIf cfg.vacuumAnalyzeTimer.enable { |
| 334 | + description = "Repack all PostgreSQL databases"; |
| 335 | + after = [ "postgresql.service" ]; |
| 336 | + serviceConfig = { |
| 337 | + ExecStart = "${lib.getExe cfg.package.pkgs.pg_repack} --port=${builtins.toString cfg.settings.port} --all"; |
| 338 | + User = "postgres"; |
| 339 | + }; |
| 340 | + wantedBy = [ "timers.target" ]; |
| 341 | + }; |
| 342 | + |
308 | 343 | postgresql-vacuum-analyze = lib.mkIf cfg.vacuumAnalyzeTimer.enable {
|
309 | 344 | description = "Vacuum and analyze all PostgreSQL databases";
|
310 | 345 | after = [ "postgresql.service" ];
|
311 |
| - requires = [ "postgresql.service" ]; |
312 | 346 | serviceConfig = {
|
313 | 347 | ExecStart = "${lib.getExe' cfg.package "psql"} --port=${builtins.toString cfg.settings.port} -tAc 'VACUUM ANALYZE'";
|
314 | 348 | User = "postgres";
|
|
317 | 351 | };
|
318 | 352 | };
|
319 | 353 |
|
320 |
| - timers.postgresql-vacuum-analyze = lib.mkIf cfg.vacuumAnalyzeTimer.enable { |
321 |
| - inherit (cfg.vacuumAnalyzeTimer) timerConfig; |
322 |
| - wantedBy = [ "timers.target" ]; |
| 354 | + timers = { |
| 355 | + postgresql-pg-repack = lib.mkIf cfg.pgRepackTimer.enable { |
| 356 | + inherit (cfg.vacuumAnalyzeTimer) timerConfig; |
| 357 | + wantedBy = [ "timers.target" ]; |
| 358 | + }; |
| 359 | + postgresql-vacuum-analyze = lib.mkIf cfg.vacuumAnalyzeTimer.enable { |
| 360 | + inherit (cfg.vacuumAnalyzeTimer) timerConfig; |
| 361 | + wantedBy = [ "timers.target" ]; |
| 362 | + }; |
323 | 363 | };
|
324 | 364 | };
|
325 | 365 | };
|
|
0 commit comments