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:
parent
05970d3649
commit
33cb8ca769
2 changed files with 29 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue