22
0
mirror of https://github.com/SuperSandro2000/nixos-modules.git synced 2024-06-02 22:39:23 +02:00
nixos-modules/modules/postgres.nix

95 lines
3.3 KiB
Nix
Raw Normal View History

{ config, lib, libS, pkgs, ... }:
let
cfg = config.services.postgresql;
cfgu = config.services.postgresql.upgrade;
in
{
2023-09-07 22:15:24 +02:00
options.services.postgresql = {
upgrade = {
2023-12-24 14:55:09 +01:00
enable = libS.mkOpinionatedOption "install the upgrade-pg-cluster script to update postgres";
2023-09-07 22:15:24 +02:00
extraArgs = lib.mkOption {
type = with lib.types; listOf str;
default = [ "--link" "--jobs=$(nproc)" ];
2023-09-07 22:15:24 +02:00
description = lib.mdDoc "Extra arguments to pass to pg_upgrade. See https://www.postgresql.org/docs/current/pgupgrade.html for doc.";
};
2023-09-07 22:15:24 +02:00
newPackage = (lib.mkPackageOptionMD pkgs "postgresql" {
default = [ "postgresql_16" ];
2023-09-07 22:15:24 +02:00
}) // {
description = lib.mdDoc ''
The postgres package to which should be updated.
After running upgrade-pg-cluster this must be set to services.postgresql.package to complete the update.
'';
};
2023-09-07 22:15:24 +02:00
stopServices = lib.mkOption {
type = with lib.types; listOf str;
default = [ ];
example = [ "hedgedoc" "hydra" "nginx" ];
description = lib.mdDoc "Systemd services to stop when upgrade is started.";
};
};
2023-09-07 22:15:24 +02:00
recommendedDefaults = libS.mkOpinionatedOption "set recommended default settings";
};
config = lib.mkIf cfg.enable {
environment.systemPackages = lib.optional cfgu.enable (
let
2023-09-26 23:17:18 +02:00
# conditions copied from nixos/modules/services/databases/postgresql.nix
2024-04-15 00:24:26 +02:00
newPackage = if cfg.enableJIT then cfgu.newPackage.withJIT else cfgu.newPackage;
newData = "/var/lib/postgresql/${cfgu.newPackage.psqlSchema}";
2024-04-15 00:24:26 +02:00
newBin = "${if cfg.extraPlugins == [] then newPackage else newPackage.withPackages cfg.extraPlugins}/bin";
2023-09-26 23:17:18 +02:00
2024-03-19 23:13:37 +01:00
oldPackage = if cfg.enableJIT then cfg.package.withJIT else cfg.package;
oldData = config.services.postgresql.dataDir;
2023-09-26 23:17:18 +02:00
oldBin = "${if cfg.extraPlugins == [] then oldPackage else oldPackage.withPackages cfg.extraPlugins}/bin";
in
pkgs.writeScriptBin "upgrade-pg-cluster" /* bash */ ''
set -eu
2023-09-26 23:17:18 +02:00
echo "Current version: ${cfg.package.version}"
echo "Update version: ${cfgu.newPackage.version}"
2023-09-26 23:17:18 +02:00
if [[ ${cfgu.newPackage.version} == ${cfg.package.version} ]]; then
2023-01-06 22:08:26 +01:00
echo "There is no major postgres update available."
exit 2
fi
systemctl stop postgresql ${lib.concatStringsSep " " cfgu.stopServices}
install -d -m 0700 -o postgres -g postgres "${newData}"
cd "${newData}"
sudo -u postgres "${newBin}/initdb" -D "${newData}"
sudo -u postgres "${newBin}/pg_upgrade" \
--old-datadir "${oldData}" --new-datadir "${newData}" \
--old-bindir ${oldBin} --new-bindir ${newBin} \
${lib.concatStringsSep " " cfgu.extraArgs} \
"$@"
2023-01-07 04:33:23 +01:00
echo "
2023-01-07 04:33:23 +01:00
Run the following commands after setting:
2023-09-19 17:32:42 +02:00
services.postgresql.package = pkgs.postgresql_${lib.versions.major cfgu.newPackage.version}
2023-01-07 04:33:23 +01:00
sudo -u postgres vacuumdb --all --analyze-in-stages
${newData}/delete_old_cluster.sh
"
''
2023-01-06 22:12:33 +01:00
);
2023-09-07 22:15:24 +02:00
services = {
postgresql.enableJIT = lib.mkIf cfg.recommendedDefaults true;
postgresqlBackup = lib.mkIf cfg.recommendedDefaults {
compression = "zstd";
compressionLevel = 9;
pgdumpOptions = "--create --clean";
};
};
};
}