Skip to content

Commit

Permalink
nixos/postgresql: add upgradeFrom option
Browse files Browse the repository at this point in the history
With accompanying nixos vm test.
  • Loading branch information
tm-drtina authored and jsoo1 committed Jul 6, 2023
1 parent 1661217 commit fed6c1f
Showing 1 changed file with 69 additions and 1 deletion.
70 changes: 69 additions & 1 deletion nixos/modules/services/databases/postgresql.nix
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,32 @@ let

groupAccessAvailable = versionAtLeast postgresql.version "11.0";

upgradeScript =
assert lib.versionOlder cfg.upgradeFrom.package.version cfg.package.version;
pkgs.writeShellApplication {
name = "upgrade.sh";
runtimeInputs = [];
text = ''
# There is no old version to upgrade from - noop
[[ -d "${cfg.upgradeFrom.dataDir}" ]] || exit 0
if [[ -f "${cfg.upgradeFrom.dataDir}/.upgraded" ]]; then
echo "Old data dir found, but was already migrated. Please remove the old path '${cfg.upgradeFrom.dataDir}' to suppress this message." >&2
exit 0
fi
pushd "${cfg.upgradeFrom.dataDir}"
${cfg.package}/bin/pg_upgrade ${lib.cli.toGNUCommandLineShell {} {
old-datadir = cfg.upgradeFrom.dataDir;
new-datadir = cfg.dataDir;
old-bindir = "${cfg.upgradeFrom.package}/bin";
new-bindir = "${cfg.package}/bin";
}}
popd
touch "${cfg.dataDir}/.post_upgrade" "${cfg.upgradeFrom.dataDir}/.upgraded"
'';
};

in

{
Expand Down Expand Up @@ -269,7 +295,40 @@ in
PostgreSQL superuser account to use for various operations. Internal since changing
this value would lead to breakage while setting up databases.
'';
};
};

upgradeFrom = mkOption {
type = types.nullOr (types.submodule ({ config, ... }: {
options = {
package = mkOption {
type = types.package;
description = "Package to upgrade from";
};
dataDir = mkOption {
type = types.path;
default = "/var/lib/postgresql/${config.package.psqlSchema}";
defaultText = ''/var/lib/postgresql/''${config.package.psqlSchema}'';
example = "/mnt/postgresql/11";
description = ''
Location of the existing data directory to migrate.
Will not be deleted.
'';
};
};
}));
default = null;
description =
"A postgres package and data directory to upgrade";
};

analyzeAfterUpgrade = mkOption {
type = types.bool;
default = true;
description = ''
Will run `vacuumdb --all --analyze-in-stages` after
successful upgrade as postgresql suggests.
'';
};
};

};
Expand Down Expand Up @@ -346,6 +405,8 @@ in
# Initialise the database.
initdb -U ${cfg.superUser} ${concatStringsSep " " cfg.initdbArgs}
${optionalString (null != cfg.upgradeFrom) (getExe upgradeScript)}
# See postStart!
touch "${cfg.dataDir}/.first_startup"
fi
Expand All @@ -368,6 +429,13 @@ in
done
if test -e "${cfg.dataDir}/.first_startup"; then
if test -e "${cfg.dataDir}/.post_upgrade"; then
${optionalString cfg.analyzeAfterUpgrade ''
vacuumdb --port=${toString cfg.port} --all --analyze-in-stages
''}
rm "${cfg.dataDir}/.post_upgrade"
fi
${optionalString (cfg.initialScript != null) ''
$PSQL -f "${cfg.initialScript}" -d postgres
''}
Expand Down

0 comments on commit fed6c1f

Please sign in to comment.