diff --git a/hosts/sakoserver/configuration.nix b/hosts/sakoserver/configuration.nix index 90e83c5f..8b5a23f2 100644 --- a/hosts/sakoserver/configuration.nix +++ b/hosts/sakoserver/configuration.nix @@ -63,6 +63,7 @@ isServer = true; dns.blocky.enable = true; nginx.enable = true; + postgresql.enable = true; services = { forgejo.enable = true; }; }; }; diff --git a/modules/server/default.nix b/modules/server/default.nix index daa8dab8..d1a9ac71 100644 --- a/modules/server/default.nix +++ b/modules/server/default.nix @@ -2,7 +2,7 @@ with lib; let cfg = config.void.server; in { - imports = [ ./dns ./nginx.nix ./services ]; + imports = [ ./dns ./nginx.nix ./services ./postgresql.nix ]; options.void.server = { isServer = mkEnableOption false; }; diff --git a/modules/server/postgresql.nix b/modules/server/postgresql.nix index 7ee5ba1f..19edd7ec 100644 --- a/modules/server/postgresql.nix +++ b/modules/server/postgresql.nix @@ -7,6 +7,7 @@ in { config = mkIf cfg.enable { services.postgresql = { enable = true; + package = pkgs.postgresql_17_jit; ensureDatabases = [ "forgejo" ]; ensureUsers = [ { @@ -24,6 +25,80 @@ in { ensureDBOwnereship = true; } ]; + # Thank you NotAShelf + # https://github.com/NotAShelf/nyx/blob/d407b4d6e5ab7f60350af61a3d73a62a5e9ac660/modules/core/roles/server/system/services/databases/postgresql.nix#L74 + settings = { + # Connectivity; + max_connections = 100; + superuser_reserved_connections = 3; + + # Memory Settings; + shared_buffers = "1024 MB"; + work_mem = "32 MB"; + maintenance_work_mem = "320 MB"; + huge_pages = "off"; + effective_cache_size = "2 GB"; + effective_io_concurrency = + 100; # concurrent IO only really activated if OS supports posix_fadvise function; + random_page_cost = + 1.25; # speed of random disk access relative to sequential access (1.0); + # Monitoring; + shared_preload_libraries = + "pg_stat_statements,auto_explain"; # per statement resource usage stats & log explain statements for slow queries + track_io_timing = "on"; # measure exact block IO times; + track_functions = + "pl"; # track execution times of pl-language procedures if any; + # Replication; + wal_level = "replica"; # consider using at least "replica"; + max_wal_senders = 0; + synchronous_commit = "on"; + + # Checkpointing: ; + checkpoint_timeout = "15 min"; + checkpoint_completion_target = 0.9; + max_wal_size = "1024 MB"; + min_wal_size = "512 MB"; + + # WAL writing; + wal_compression = "on"; + wal_buffers = + -1; # auto-tuned by Postgres till maximum of segment size (16MB by default); + wal_writer_delay = "200ms"; + wal_writer_flush_after = "1MB"; + + # Background writer; + bgwriter_delay = "200ms"; + bgwriter_lru_maxpages = 100; + bgwriter_lru_multiplier = 2.0; + bgwriter_flush_after = 0; + + # Parallel queries: ; + max_worker_processes = 6; + max_parallel_workers_per_gather = 3; + max_parallel_maintenance_workers = 3; + max_parallel_workers = 6; + parallel_leader_participation = "on"; + + # Advanced features ; + enable_partitionwise_join = "on"; + enable_partitionwise_aggregate = "on"; + jit = "on"; + + jit_above_cost = 100000; + jit_inline_above_cost = 150000; + jit_optimize_above_cost = 500000; + + # log slow queries + log_min_duration_statement = 100; + "auto_explain.log_min_duration" = 100; + + # logging configuration + log_connections = true; + log_statement = "all"; + logging_collector = true; + log_disconnections = true; + log_destination = lib.mkForce "syslog"; + }; }; }; }