diff --git a/nix/build.nix b/nix/build.nix index 6d213ea4..01620555 100644 --- a/nix/build.nix +++ b/nix/build.nix @@ -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 diff --git a/nix/shell.nix b/nix/shell.nix index a6e0a2b6..c5f8f9c2 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -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