fix: auto-reinit PG cluster when extensions or version change

- Write pg derivation path to .nix-postgres-version after init
- On start, compare current pg path with stored version
- If changed (extensions added/removed/version bumped), destroy and
  reinitialize the cluster automatically
- Also reinit legacy clusters that have no version file
- Exclude .nix-postgres-version from release builds
This commit is contained in:
Graham McInitre 2026-07-16 09:02:42 -05:00
parent 05970d3649
commit 33cb8ca769
2 changed files with 29 additions and 1 deletions

View file

@ -33,7 +33,8 @@ beamPackages.mixRelease {
&& baseName != ".nix-mix"
&& baseName != ".nix-hex"
&& baseName != ".worktrees"
&& baseName != ".nix-services-started";
&& baseName != ".nix-services-started"
&& baseName != ".nix-postgres-version";
};
# Mix environment

View file

@ -44,6 +44,9 @@ let
# Service management flag
servicesFlag = ".nix-services-started";
# Version file to detect when PG config changes (extensions added/removed, version bump)
pgVersionFile = ".nix-postgres-version";
# Script to start PostgreSQL and Redis
startServices = writeShellScriptBin "start-services" ''
set -e
@ -56,6 +59,27 @@ let
exit 0
fi
# Check if cluster needs reinitialization (PG extensions or version changed)
pg_needs_reinit=false
if [ -d "${pgDataDir}" ] && [ -f "${pgVersionFile}" ]; then
if [ "$(cat ${pgVersionFile})" != "${pg}" ]; then
echo " PostgreSQL configuration changed (extensions or version updated)"
pg_needs_reinit=true
fi
fi
if [ -d "${pgDataDir}" ] && [ ! -f "${pgVersionFile}" ]; then
# Legacy cluster without version file, reinit to be safe
pg_needs_reinit=true
fi
if $pg_needs_reinit; then
echo "🗑 Removing old PostgreSQL cluster..."
# Stop if running
${pg}/bin/pg_ctl -D ${pgDataDir} stop -m fast 2>/dev/null || true
rm -rf ${pgDataDir}
rm -f ${servicesFlag}
fi
# Initialize PostgreSQL if needed
if [ ! -d "${pgDataDir}" ]; then
echo "📦 Initializing PostgreSQL database..."
@ -73,6 +97,9 @@ let
shared_preload_libraries = 'timescaledb'
timescaledb.telemetry_level = off
EOF
# Record current PG version for future change detection
echo -n "${pg}" > ${pgVersionFile}
fi
# Check if PostgreSQL is already running on this port