From d3f77d39b325ca7a74f29eb3ddf2d56bce302978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Tue, 6 Oct 2026 15:24:14 +0300 Subject: [PATCH 01/10] perf(nix): shrink postgres-env closure Strip pgrx extension .so files fully. The stdenv fixup only strips debug sections and leaves .symtab behind. Split postgres-env-* into a runtime env and postgres-env-*-debug, which carries postgresql_*_src and debug symbols. Drop supautils from the base psql_* extension set. The site profile loads it through dynamic_library_path, so install site-env on the AMI, add pg-extensions to site-env, and set dynamic_library_path. Add psql_*_latest, which ships only the latest version of each extension, and use it in postgres-env-*. Split slim from latestOnly so the base env keeps systemd support and the regular locales. Link postgres against systemdLibs instead of the full systemd. Use the main curl in pg_net, which removes a second glibc. Build sfcgal and cgal against boost with icu75, which removes a second ICU. postgres-env-17 closure on aarch64-linux: 2.54 GB to 1.00 GB. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- .../postgresql_config/postgresql.conf.j2 | 2 +- ansible/tasks/stage2-setup-postgres.yml | 12 ++++++ nix/cargo-pgrx/buildPgrxExtension.nix | 2 + nix/checks.nix | 4 +- nix/ext/pg_net.nix | 5 +-- nix/ext/postgis.nix | 10 ++++- nix/nixpkgs.nix | 1 - nix/packages/postgres-env.nix | 15 ++++++- nix/packages/postgres.nix | 41 +++++++++++++------ nix/packages/site-env.nix | 17 +++++++- nix/postgresql/generic.nix | 7 ++-- 11 files changed, 90 insertions(+), 26 deletions(-) diff --git a/ansible/files/postgresql_config/postgresql.conf.j2 b/ansible/files/postgresql_config/postgresql.conf.j2 index 37e50623e0..82408d4474 100644 --- a/ansible/files/postgresql_config/postgresql.conf.j2 +++ b/ansible/files/postgresql_config/postgresql.conf.j2 @@ -695,7 +695,7 @@ jit_provider = 'llvmjit' # JIT library to use # - Other Defaults - -#dynamic_library_path = '$libdir' +dynamic_library_path = '/nix/var/nix/profiles/site/pg-extensions:$libdir' #gin_fuzzy_search_limit = 0 #------------------------------------------------------------------------------ diff --git a/ansible/tasks/stage2-setup-postgres.yml b/ansible/tasks/stage2-setup-postgres.yml index d4823238a7..fa1cfa2f1d 100644 --- a/ansible/tasks/stage2-setup-postgres.yml +++ b/ansible/tasks/stage2-setup-postgres.yml @@ -77,6 +77,18 @@ nix-env --set {{ postgres_env_path.stdout }} " + - name: Resolve site env store path + ansible.builtin.shell: | + . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && + nix build --no-link --print-out-paths github:supabase/postgres/{{ git_commit_sha }}#site-env-{{ postgresql_major_version }} + register: site_env_path + + - name: Install site env from nix binary cache + ansible.builtin.shell: | + . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && + nix-env --profile /nix/var/nix/profiles/site --set {{ site_env_path.stdout }} + + - name: Install supascan for baseline validation ansible.builtin.shell: | sudo -u ubuntu bash -c ". /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && nix profile install github:supabase/postgres/{{ git_commit_sha }}#supascan" diff --git a/nix/cargo-pgrx/buildPgrxExtension.nix b/nix/cargo-pgrx/buildPgrxExtension.nix index a316015a50..33bbb86c03 100644 --- a/nix/cargo-pgrx/buildPgrxExtension.nix +++ b/nix/cargo-pgrx/buildPgrxExtension.nix @@ -150,6 +150,8 @@ let finalArgs = argsForBuildRustPackage // { buildInputs = (args.buildInputs or [ ]); + stripAllList = args.stripAllList or [ "lib" ]; + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ diff --git a/nix/checks.nix b/nix/checks.nix index 3bda47a906..c5ef57a4b2 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -76,7 +76,9 @@ }; pgroonga = self'.legacyPackages."psql_${pgpkg.version}".exts.pgroonga; - supautils = self'.legacyPackages."psql_${pgpkg.version}".exts.supautils; + supautils = pkgs.callPackage ../ext/supautils.nix { + postgresql = pkgs."postgresql_${pgpkg.version}"; + }; # Use different ports to allow parallel test runs # slim packages get their own ports to avoid conflicts diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index f769bad314..846e13c16b 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -7,13 +7,10 @@ libuv, makeWrapper, switch-ext-version, - curl_8_6, + curl, latestOnly ? false, }: -let - curl = curl_8_6; -in let pname = "pg_net"; build = diff --git a/nix/ext/postgis.nix b/nix/ext/postgis.nix index 3f722d9ad9..8b18cd607a 100644 --- a/nix/ext/postgis.nix +++ b/nix/ext/postgis.nix @@ -21,10 +21,18 @@ writeShellApplication, coreutils, sfcgal, + boost, + cgal, + icu75, latestOnly ? false, }: let + boostIcu75 = boost.override { icu = icu75; }; + sfcgalIcu75 = sfcgal.override { + boost = boostIcu75; + cgal = cgal.override { boost = boostIcu75; }; + }; gdal = callPackage ./gdal.nix { inherit postgresql; }; pname = "postgis"; @@ -121,7 +129,7 @@ let json_c protobufc pcre2.dev - sfcgal + sfcgalIcu75 ] ++ lib.optional stdenv.isDarwin libiconv; nativeBuildInputs = [ diff --git a/nix/nixpkgs.nix b/nix/nixpkgs.nix index 34ba4bd604..6b7a541587 100644 --- a/nix/nixpkgs.nix +++ b/nix/nixpkgs.nix @@ -19,7 +19,6 @@ }; in _final: _prev: { - curl_8_6 = oldstable.curl; v8_oldstable = oldstable.v8; } ) diff --git a/nix/packages/postgres-env.nix b/nix/packages/postgres-env.nix index 0ae009fff7..35c6a5e562 100644 --- a/nix/packages/postgres-env.nix +++ b/nix/packages/postgres-env.nix @@ -14,13 +14,21 @@ pkgs.symlinkJoin { name = "postgres-env-${version}"; paths = [ - self'.packages."psql_${version}/bin" + self'.packages."psql_${version}_latest/bin" self'.packages.pg_prove self'.packages.supabase-groonga + ] + ++ lib.optionals (pkgs.stdenv.isLinux && version != "15") [ self'.packages.gatekeeper ]; + }; + + makePostgresEnvDebug = + version: + pkgs.symlinkJoin { + name = "postgres-env-${version}-debug"; + paths = [ self'.packages."postgresql_${version}_src" ] ++ lib.optionals pkgs.stdenv.isLinux [ self'.packages."postgresql_${version}_debug" ] - ++ lib.optionals (pkgs.stdenv.isLinux && version != "15") [ self'.packages.gatekeeper ] # orioledb.so ships as a separate extension package (nix/ext/orioledb.nix), not # part of the postgresql derivation itself, so its debug output isn't covered by # postgresql_${version}_debug above and has to be pulled in explicitly. @@ -34,6 +42,9 @@ postgres-env-15 = makePostgresEnv "15"; postgres-env-17 = makePostgresEnv "17"; postgres-env-orioledb-17 = makePostgresEnv "orioledb-17"; + postgres-env-15-debug = makePostgresEnvDebug "15"; + postgres-env-17-debug = makePostgresEnvDebug "17"; + postgres-env-orioledb-17-debug = makePostgresEnvDebug "orioledb-17"; }; }; } diff --git a/nix/packages/postgres.nix b/nix/packages/postgres.nix index 9184badb63..14d0149316 100644 --- a/nix/packages/postgres.nix +++ b/nix/packages/postgres.nix @@ -48,7 +48,6 @@ ../ext/hypopg.nix ../ext/pg_tle.nix ../ext/wrappers/default.nix - ../ext/supautils.nix ../ext/plv8 ]; @@ -74,11 +73,11 @@ ]; getPostgresqlPackage = - version: latestOnly: + version: slim: let base = pkgs."postgresql_${version}"; in - if latestOnly then base.override { systemdSupport = false; } else base; + if slim then base.override { systemdSupport = false; } else base; # Create a 'receipt' file for a given postgresql package. This is a way # of adding a bit of metadata to the package, which can be used by other # tools to inspect what the contents of the install are: the PSQL @@ -119,9 +118,10 @@ { variant ? "full", latestOnly ? false, + slim ? latestOnly, }: let - postgresql = getPostgresqlPackage version latestOnly; + postgresql = getPostgresqlPackage version slim; extensionsToUse = if variant == "cli" then cliExtensions @@ -148,9 +148,10 @@ { variant ? "full", latestOnly ? false, + slim ? latestOnly, }: let - pkgsList = makeOurPostgresPkgs version { inherit variant latestOnly; }; + pkgsList = makeOurPostgresPkgs version { inherit variant latestOnly slim; }; baseAttrs = builtins.listToAttrs ( map (drv: { name = drv.name; @@ -178,15 +179,16 @@ { variant ? "full", latestOnly ? false, + slim ? latestOnly, }: let # For CLI variant, override PostgreSQL to be portable (no hardcoded /nix/store paths) postgresql = let - base = getPostgresqlPackage version latestOnly; + base = getPostgresqlPackage version slim; in if variant == "cli" then base.override { portable = true; } else base; - postgres-pkgs = makeOurPostgresPkgs version { inherit variant latestOnly; }; + postgres-pkgs = makeOurPostgresPkgs version { inherit variant latestOnly slim; }; ourExts = map (ext: { name = ext.name; version = ext.version; @@ -195,7 +197,7 @@ pgbin = postgresql.withPackages (_ps: postgres-pkgs); # For slim packages, include minimal glibc locales for initdb locale support - extraPaths = lib.optionals (latestOnly && pkgs.stdenv.isLinux) [ + extraPaths = lib.optionals (slim && pkgs.stdenv.isLinux) [ glibcLocalesMinimal ]; in @@ -225,16 +227,31 @@ { variant ? "full", latestOnly ? false, + slim ? latestOnly, }: lib.recurseIntoAttrs { - bin = makePostgresBin version { inherit variant latestOnly; }; - exts = makeOurPostgresPkgsSet version { inherit variant latestOnly; }; + bin = makePostgresBin version { inherit variant latestOnly slim; }; + exts = makeOurPostgresPkgsSet version { inherit variant latestOnly slim; }; }; basePackages = { psql_15 = makePostgres "15" { }; psql_17 = makePostgres "17" { }; psql_orioledb-17 = makePostgres "orioledb-17" { }; }; + latestPackages = { + psql_15_latest = makePostgres "15" { + latestOnly = true; + slim = false; + }; + psql_17_latest = makePostgres "17" { + latestOnly = true; + slim = false; + }; + psql_orioledb-17_latest = makePostgres "orioledb-17" { + latestOnly = true; + slim = false; + }; + }; slimPackages = { psql_15_slim = makePostgres "15" { latestOnly = true; }; psql_17_slim = makePostgres "17" { latestOnly = true; }; @@ -249,10 +266,10 @@ binPackages = lib.mapAttrs' (name: value: { name = "${name}/bin"; value = value.bin; - }) (basePackages // slimPackages // cliPackages); + }) (basePackages // latestPackages // slimPackages // cliPackages); in { packages = binPackages; - legacyPackages = basePackages // slimPackages // cliPackages; + legacyPackages = basePackages // latestPackages // slimPackages // cliPackages; }; } diff --git a/nix/packages/site-env.nix b/nix/packages/site-env.nix index 4fa580e99a..3e655b0024 100644 --- a/nix/packages/site-env.nix +++ b/nix/packages/site-env.nix @@ -9,11 +9,26 @@ ... }: let + activate = pkgs.writeShellApplication { + name = "activate"; + text = '' + echo "Activating site profile." + ''; + }; + makeSiteEnv = version: extraPaths: pkgs.buildEnv { name = "site-env-${version}"; - paths = [ self'.legacyPackages."psql_${version}".exts.supautils ] ++ extraPaths; + paths = [ + (pkgs.callPackage ../ext/supautils.nix { postgresql = pkgs."postgresql_${version}"; }) + activate + ] + ++ extraPaths; + postBuild = '' + mkdir -p $out/pg-extensions + ln -s ../lib/supautils.so $out/pg-extensions/supautils.so + ''; }; siteEnvs = { diff --git a/nix/postgresql/generic.nix b/nix/postgresql/generic.nix index b32d146643..0dcdc45141 100644 --- a/nix/postgresql/generic.nix +++ b/nix/postgresql/generic.nix @@ -15,7 +15,7 @@ let icu75, lz4, zstd, - systemd, + systemdLibs, libossp_uuid, pkg-config, libxml2, @@ -33,7 +33,8 @@ let libxslt, # This is important to obtain a version of `libpq` that does not depend on systemd. - systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemd && !stdenv.hostPlatform.isStatic, + systemdSupport ? + lib.meta.availableOn stdenv.hostPlatform systemdLibs && !stdenv.hostPlatform.isStatic, enableSystemd ? null, gssSupport ? with stdenv.hostPlatform; !isWindows && !isStatic, @@ -120,7 +121,7 @@ let ++ lib.optionals (olderThan "13") [ libxcrypt ] ++ lib.optionals lz4Enabled [ lz4 ] ++ lib.optionals zstdEnabled [ zstd ] - ++ lib.optionals systemdSupport' [ systemd ] + ++ lib.optionals systemdSupport' [ systemdLibs ] ++ lib.optionals pythonSupport [ python3 ] ++ lib.optionals gssSupport [ libkrb5 ] ++ lib.optionals stdenv.isLinux [ linux-pam ] From a65495550db2da5d312a219ed3994677fc31d1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Tue, 6 Oct 2026 17:25:16 +0300 Subject: [PATCH 02/10] fix(nix): correct supautils path in checks Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/checks.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/checks.nix b/nix/checks.nix index c5ef57a4b2..63f799a110 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -76,7 +76,7 @@ }; pgroonga = self'.legacyPackages."psql_${pgpkg.version}".exts.pgroonga; - supautils = pkgs.callPackage ../ext/supautils.nix { + supautils = pkgs.callPackage ./ext/supautils.nix { postgresql = pkgs."postgresql_${pgpkg.version}"; }; From c092ba3f84a0f6c243a11061251ca1dc30e88064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Tue, 6 Oct 2026 21:24:09 +0300 Subject: [PATCH 03/10] fix(nix): build old pg_net versions against current curl Versions before 0.20.4 include curl/multi.h directly. With curl 8.17 the typecheck macro for curl_multi_setopt breaks the declaration in multi.h. Define CURL_DISABLE_TYPECHECK for those versions. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/ext/pg_net.nix | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index 846e13c16b..5ea5674154 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -48,22 +48,25 @@ let ''; env.NIX_CFLAGS_COMPILE = - if (lib.versionOlder version "0.19.1") then - "-Wno-error" - else if - ( - builtins.elem version [ - "0.19.5" - "0.20.0" - ] - && stdenv.isDarwin - ) - then - # Fix for dangling pointer warning on darwin with newer clang - # 0.19.5: src/core.c:177, 0.20.0: src/core.c:317 - "-Wno-error=dangling-assignment" - else - ""; + lib.optionalString (lib.versionOlder version "0.20.4") "-DCURL_DISABLE_TYPECHECK " + + ( + if (lib.versionOlder version "0.19.1") then + "-Wno-error" + else if + ( + builtins.elem version [ + "0.19.5" + "0.20.0" + ] + && stdenv.isDarwin + ) + then + # Fix for dangling pointer warning on darwin with newer clang + # 0.19.5: src/core.c:177, 0.20.0: src/core.c:317 + "-Wno-error=dangling-assignment" + else + "" + ); installPhase = '' mkdir -p $out/{lib,share/postgresql/extension} From fb463d55bdbf9841ff48789adac18eef9cb76b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Tue, 6 Oct 2026 22:46:57 +0300 Subject: [PATCH 04/10] refactor(nix): keep all extension versions in postgres-env Drop psql_*_latest and the slim split. Add psql_*_env, the base extension set without supautils, and build postgres-env-* from it. Supautils stays in the base psql_* for tests and docker images. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/checks.nix | 4 +-- nix/packages/postgres-env.nix | 2 +- nix/packages/postgres.nix | 47 ++++++++++++++--------------------- nix/packages/site-env.nix | 2 +- 4 files changed, 21 insertions(+), 34 deletions(-) diff --git a/nix/checks.nix b/nix/checks.nix index 63f799a110..3bda47a906 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -76,9 +76,7 @@ }; pgroonga = self'.legacyPackages."psql_${pgpkg.version}".exts.pgroonga; - supautils = pkgs.callPackage ./ext/supautils.nix { - postgresql = pkgs."postgresql_${pgpkg.version}"; - }; + supautils = self'.legacyPackages."psql_${pgpkg.version}".exts.supautils; # Use different ports to allow parallel test runs # slim packages get their own ports to avoid conflicts diff --git a/nix/packages/postgres-env.nix b/nix/packages/postgres-env.nix index 35c6a5e562..7a59f5d125 100644 --- a/nix/packages/postgres-env.nix +++ b/nix/packages/postgres-env.nix @@ -14,7 +14,7 @@ pkgs.symlinkJoin { name = "postgres-env-${version}"; paths = [ - self'.packages."psql_${version}_latest/bin" + self'.packages."psql_${version}_env/bin" self'.packages.pg_prove self'.packages.supabase-groonga ] diff --git a/nix/packages/postgres.nix b/nix/packages/postgres.nix index 14d0149316..a44a5ebf2e 100644 --- a/nix/packages/postgres.nix +++ b/nix/packages/postgres.nix @@ -48,6 +48,7 @@ ../ext/hypopg.nix ../ext/pg_tle.nix ../ext/wrappers/default.nix + ../ext/supautils.nix ../ext/plv8 ]; @@ -73,11 +74,11 @@ ]; getPostgresqlPackage = - version: slim: + version: latestOnly: let base = pkgs."postgresql_${version}"; in - if slim then base.override { systemdSupport = false; } else base; + if latestOnly then base.override { systemdSupport = false; } else base; # Create a 'receipt' file for a given postgresql package. This is a way # of adding a bit of metadata to the package, which can be used by other # tools to inspect what the contents of the install are: the PSQL @@ -118,11 +119,10 @@ { variant ? "full", latestOnly ? false, - slim ? latestOnly, }: let - postgresql = getPostgresqlPackage version slim; - extensionsToUse = + postgresql = getPostgresqlPackage version latestOnly; + allExtensions = if variant == "cli" then cliExtensions else if (builtins.elem version [ "orioledb-17" ]) then @@ -131,6 +131,7 @@ dbExtensions17 else ourExtensions; + extensionsToUse = builtins.filter (x: variant != "env" || x != ../ext/supautils.nix) allExtensions; extCallPackage = pkgs.lib.callPackageWith ( pkgs // { @@ -148,10 +149,9 @@ { variant ? "full", latestOnly ? false, - slim ? latestOnly, }: let - pkgsList = makeOurPostgresPkgs version { inherit variant latestOnly slim; }; + pkgsList = makeOurPostgresPkgs version { inherit variant latestOnly; }; baseAttrs = builtins.listToAttrs ( map (drv: { name = drv.name; @@ -179,16 +179,15 @@ { variant ? "full", latestOnly ? false, - slim ? latestOnly, }: let # For CLI variant, override PostgreSQL to be portable (no hardcoded /nix/store paths) postgresql = let - base = getPostgresqlPackage version slim; + base = getPostgresqlPackage version latestOnly; in if variant == "cli" then base.override { portable = true; } else base; - postgres-pkgs = makeOurPostgresPkgs version { inherit variant latestOnly slim; }; + postgres-pkgs = makeOurPostgresPkgs version { inherit variant latestOnly; }; ourExts = map (ext: { name = ext.name; version = ext.version; @@ -197,7 +196,7 @@ pgbin = postgresql.withPackages (_ps: postgres-pkgs); # For slim packages, include minimal glibc locales for initdb locale support - extraPaths = lib.optionals (slim && pkgs.stdenv.isLinux) [ + extraPaths = lib.optionals (latestOnly && pkgs.stdenv.isLinux) [ glibcLocalesMinimal ]; in @@ -227,30 +226,20 @@ { variant ? "full", latestOnly ? false, - slim ? latestOnly, }: lib.recurseIntoAttrs { - bin = makePostgresBin version { inherit variant latestOnly slim; }; - exts = makeOurPostgresPkgsSet version { inherit variant latestOnly slim; }; + bin = makePostgresBin version { inherit variant latestOnly; }; + exts = makeOurPostgresPkgsSet version { inherit variant latestOnly; }; }; basePackages = { psql_15 = makePostgres "15" { }; psql_17 = makePostgres "17" { }; psql_orioledb-17 = makePostgres "orioledb-17" { }; }; - latestPackages = { - psql_15_latest = makePostgres "15" { - latestOnly = true; - slim = false; - }; - psql_17_latest = makePostgres "17" { - latestOnly = true; - slim = false; - }; - psql_orioledb-17_latest = makePostgres "orioledb-17" { - latestOnly = true; - slim = false; - }; + envPackages = { + psql_15_env = makePostgres "15" { variant = "env"; }; + psql_17_env = makePostgres "17" { variant = "env"; }; + psql_orioledb-17_env = makePostgres "orioledb-17" { variant = "env"; }; }; slimPackages = { psql_15_slim = makePostgres "15" { latestOnly = true; }; @@ -266,10 +255,10 @@ binPackages = lib.mapAttrs' (name: value: { name = "${name}/bin"; value = value.bin; - }) (basePackages // latestPackages // slimPackages // cliPackages); + }) (basePackages // envPackages // slimPackages // cliPackages); in { packages = binPackages; - legacyPackages = basePackages // latestPackages // slimPackages // cliPackages; + legacyPackages = basePackages // envPackages // slimPackages // cliPackages; }; } diff --git a/nix/packages/site-env.nix b/nix/packages/site-env.nix index 3e655b0024..7609811070 100644 --- a/nix/packages/site-env.nix +++ b/nix/packages/site-env.nix @@ -21,7 +21,7 @@ pkgs.buildEnv { name = "site-env-${version}"; paths = [ - (pkgs.callPackage ../ext/supautils.nix { postgresql = pkgs."postgresql_${version}"; }) + self'.legacyPackages."psql_${version}".exts.supautils activate ] ++ extraPaths; From 8a35d2263c95406d77a37766c91fe1eadccc2780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Thu, 8 Oct 2026 02:43:44 +0300 Subject: [PATCH 05/10] refactor(nix): drop supautils and site-env changes Keep supautils in the base extension set and leave site-env and the ansible config as on develop, so this change stands alone. Use the smaller pg_net compile flag change. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- .../postgresql_config/postgresql.conf.j2 | 2 +- ansible/tasks/stage2-setup-postgres.yml | 12 ------ nix/ext/pg_net.nix | 38 +++++++++---------- nix/packages/postgres-env.nix | 2 +- nix/packages/postgres.nix | 12 ++---- nix/packages/site-env.nix | 17 +-------- 6 files changed, 25 insertions(+), 58 deletions(-) diff --git a/ansible/files/postgresql_config/postgresql.conf.j2 b/ansible/files/postgresql_config/postgresql.conf.j2 index 82408d4474..37e50623e0 100644 --- a/ansible/files/postgresql_config/postgresql.conf.j2 +++ b/ansible/files/postgresql_config/postgresql.conf.j2 @@ -695,7 +695,7 @@ jit_provider = 'llvmjit' # JIT library to use # - Other Defaults - -dynamic_library_path = '/nix/var/nix/profiles/site/pg-extensions:$libdir' +#dynamic_library_path = '$libdir' #gin_fuzzy_search_limit = 0 #------------------------------------------------------------------------------ diff --git a/ansible/tasks/stage2-setup-postgres.yml b/ansible/tasks/stage2-setup-postgres.yml index fa1cfa2f1d..d4823238a7 100644 --- a/ansible/tasks/stage2-setup-postgres.yml +++ b/ansible/tasks/stage2-setup-postgres.yml @@ -77,18 +77,6 @@ nix-env --set {{ postgres_env_path.stdout }} " - - name: Resolve site env store path - ansible.builtin.shell: | - . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && - nix build --no-link --print-out-paths github:supabase/postgres/{{ git_commit_sha }}#site-env-{{ postgresql_major_version }} - register: site_env_path - - - name: Install site env from nix binary cache - ansible.builtin.shell: | - . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && - nix-env --profile /nix/var/nix/profiles/site --set {{ site_env_path.stdout }} - - - name: Install supascan for baseline validation ansible.builtin.shell: | sudo -u ubuntu bash -c ". /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && nix profile install github:supabase/postgres/{{ git_commit_sha }}#supascan" diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index 5ea5674154..f7c99cd576 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -32,6 +32,9 @@ let }; buildPhase = '' + ${lib.optionalString (lib.versionOlder version "0.20.4") '' + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -DCURL_DISABLE_TYPECHECK" + ''} make PG_CONFIG=${postgresql}/bin/pg_config ''; @@ -48,25 +51,22 @@ let ''; env.NIX_CFLAGS_COMPILE = - lib.optionalString (lib.versionOlder version "0.20.4") "-DCURL_DISABLE_TYPECHECK " - + ( - if (lib.versionOlder version "0.19.1") then - "-Wno-error" - else if - ( - builtins.elem version [ - "0.19.5" - "0.20.0" - ] - && stdenv.isDarwin - ) - then - # Fix for dangling pointer warning on darwin with newer clang - # 0.19.5: src/core.c:177, 0.20.0: src/core.c:317 - "-Wno-error=dangling-assignment" - else - "" - ); + if (lib.versionOlder version "0.19.1") then + "-Wno-error" + else if + ( + builtins.elem version [ + "0.19.5" + "0.20.0" + ] + && stdenv.isDarwin + ) + then + # Fix for dangling pointer warning on darwin with newer clang + # 0.19.5: src/core.c:177, 0.20.0: src/core.c:317 + "-Wno-error=dangling-assignment" + else + ""; installPhase = '' mkdir -p $out/{lib,share/postgresql/extension} diff --git a/nix/packages/postgres-env.nix b/nix/packages/postgres-env.nix index 7a59f5d125..25b8fa6137 100644 --- a/nix/packages/postgres-env.nix +++ b/nix/packages/postgres-env.nix @@ -14,7 +14,7 @@ pkgs.symlinkJoin { name = "postgres-env-${version}"; paths = [ - self'.packages."psql_${version}_env/bin" + self'.packages."psql_${version}/bin" self'.packages.pg_prove self'.packages.supabase-groonga ] diff --git a/nix/packages/postgres.nix b/nix/packages/postgres.nix index a44a5ebf2e..9184badb63 100644 --- a/nix/packages/postgres.nix +++ b/nix/packages/postgres.nix @@ -122,7 +122,7 @@ }: let postgresql = getPostgresqlPackage version latestOnly; - allExtensions = + extensionsToUse = if variant == "cli" then cliExtensions else if (builtins.elem version [ "orioledb-17" ]) then @@ -131,7 +131,6 @@ dbExtensions17 else ourExtensions; - extensionsToUse = builtins.filter (x: variant != "env" || x != ../ext/supautils.nix) allExtensions; extCallPackage = pkgs.lib.callPackageWith ( pkgs // { @@ -236,11 +235,6 @@ psql_17 = makePostgres "17" { }; psql_orioledb-17 = makePostgres "orioledb-17" { }; }; - envPackages = { - psql_15_env = makePostgres "15" { variant = "env"; }; - psql_17_env = makePostgres "17" { variant = "env"; }; - psql_orioledb-17_env = makePostgres "orioledb-17" { variant = "env"; }; - }; slimPackages = { psql_15_slim = makePostgres "15" { latestOnly = true; }; psql_17_slim = makePostgres "17" { latestOnly = true; }; @@ -255,10 +249,10 @@ binPackages = lib.mapAttrs' (name: value: { name = "${name}/bin"; value = value.bin; - }) (basePackages // envPackages // slimPackages // cliPackages); + }) (basePackages // slimPackages // cliPackages); in { packages = binPackages; - legacyPackages = basePackages // envPackages // slimPackages // cliPackages; + legacyPackages = basePackages // slimPackages // cliPackages; }; } diff --git a/nix/packages/site-env.nix b/nix/packages/site-env.nix index 7609811070..4fa580e99a 100644 --- a/nix/packages/site-env.nix +++ b/nix/packages/site-env.nix @@ -9,26 +9,11 @@ ... }: let - activate = pkgs.writeShellApplication { - name = "activate"; - text = '' - echo "Activating site profile." - ''; - }; - makeSiteEnv = version: extraPaths: pkgs.buildEnv { name = "site-env-${version}"; - paths = [ - self'.legacyPackages."psql_${version}".exts.supautils - activate - ] - ++ extraPaths; - postBuild = '' - mkdir -p $out/pg-extensions - ln -s ../lib/supautils.so $out/pg-extensions/supautils.so - ''; + paths = [ self'.legacyPackages."psql_${version}".exts.supautils ] ++ extraPaths; }; siteEnvs = { From 4e3ee0618570ddfb5e68543c63748d7e7f3ef8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Thu, 8 Oct 2026 03:11:34 +0300 Subject: [PATCH 06/10] refactor(nix): leave postgres-env as on develop Move the debug env split out to its own change. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/packages/postgres-env.nix | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/nix/packages/postgres-env.nix b/nix/packages/postgres-env.nix index 25b8fa6137..0ae009fff7 100644 --- a/nix/packages/postgres-env.nix +++ b/nix/packages/postgres-env.nix @@ -17,18 +17,10 @@ self'.packages."psql_${version}/bin" self'.packages.pg_prove self'.packages.supabase-groonga - ] - ++ lib.optionals (pkgs.stdenv.isLinux && version != "15") [ self'.packages.gatekeeper ]; - }; - - makePostgresEnvDebug = - version: - pkgs.symlinkJoin { - name = "postgres-env-${version}-debug"; - paths = [ self'.packages."postgresql_${version}_src" ] ++ lib.optionals pkgs.stdenv.isLinux [ self'.packages."postgresql_${version}_debug" ] + ++ lib.optionals (pkgs.stdenv.isLinux && version != "15") [ self'.packages.gatekeeper ] # orioledb.so ships as a separate extension package (nix/ext/orioledb.nix), not # part of the postgresql derivation itself, so its debug output isn't covered by # postgresql_${version}_debug above and has to be pulled in explicitly. @@ -42,9 +34,6 @@ postgres-env-15 = makePostgresEnv "15"; postgres-env-17 = makePostgresEnv "17"; postgres-env-orioledb-17 = makePostgresEnv "orioledb-17"; - postgres-env-15-debug = makePostgresEnvDebug "15"; - postgres-env-17-debug = makePostgresEnvDebug "17"; - postgres-env-orioledb-17-debug = makePostgresEnvDebug "orioledb-17"; }; }; } From b564dcf96587e7a50a62556f0171be400040fb4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Thu, 8 Oct 2026 05:49:51 +0300 Subject: [PATCH 07/10] fix(nix): link darwin pg_net curl against apple libiconv Build libunistring, libidn2, and libpsl against apple libiconv for the pg_net curl on darwin, so the cli bundle has a single libiconv.2.dylib. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/ext/pg_net.nix | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index f7c99cd576..fafc26a48b 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -8,10 +8,33 @@ makeWrapper, switch-ext-version, curl, + libidn2, + libpsl, + libunistring, + libiconv, latestOnly ? false, }: let + # nixpkgs builds libunistring against gnu libiconv on darwin, which collides with apple's in the cli bundle + curlAppleIconv = + if stdenv.isDarwin then + let + libunistringApple = libunistring.override { libiconvReal = libiconv; }; + libidn2Apple = libidn2.override { libunistring = libunistringApple; }; + libpslApple = + (libpsl.override { + libidn2 = libidn2Apple; + libunistring = libunistringApple; + }).overrideAttrs + { env.NIX_LDFLAGS = "-liconv"; }; + in + curl.override { + libidn2 = libidn2Apple; + libpsl = libpslApple; + } + else + curl; pname = "pg_net"; build = version: hash: @@ -19,7 +42,7 @@ let inherit pname version; buildInputs = [ - curl + curlAppleIconv postgresql ] ++ lib.optional (version == "0.6") libuv; From b11d1e7fd11780ca213b27d08fda77fdaf0d715a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Thu, 8 Oct 2026 07:31:10 +0300 Subject: [PATCH 08/10] perf(nix): build pgbouncer against systemdLibs pgbouncer only needs sd_notify from libsystemd. The full systemd pulled in kbd, p11-kit, elfutils, tpm2-tss, gnutls, and cryptsetup as well. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/pgbouncer.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nix/pgbouncer.nix b/nix/pgbouncer.nix index 91e42c230d..3123f4e26e 100644 --- a/nix/pgbouncer.nix +++ b/nix/pgbouncer.nix @@ -6,7 +6,7 @@ libevent, c-ares, pkg-config, - systemd, + systemdLibs, nixosTests, pandoc, python3, @@ -31,7 +31,7 @@ stdenv.mkDerivation rec { openssl c-ares ] - ++ lib.optional stdenv.hostPlatform.isLinux systemd; + ++ lib.optional stdenv.hostPlatform.isLinux systemdLibs; enableParallelBuilding = true; configureFlags = lib.optional stdenv.hostPlatform.isLinux "--with-systemd"; From bf8306989325deadd09785ff5cf7077bec4700d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Thu, 8 Oct 2026 07:48:15 +0300 Subject: [PATCH 09/10] refactor(nix): leave pgrx stripping as on develop Move the pgrx strip to the debug env change. Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/cargo-pgrx/buildPgrxExtension.nix | 2 -- 1 file changed, 2 deletions(-) diff --git a/nix/cargo-pgrx/buildPgrxExtension.nix b/nix/cargo-pgrx/buildPgrxExtension.nix index 33bbb86c03..a316015a50 100644 --- a/nix/cargo-pgrx/buildPgrxExtension.nix +++ b/nix/cargo-pgrx/buildPgrxExtension.nix @@ -150,8 +150,6 @@ let finalArgs = argsForBuildRustPackage // { buildInputs = (args.buildInputs or [ ]); - stripAllList = args.stripAllList or [ "lib" ]; - nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ From 5c73b3e23ab1f28673fe4da392d5fda9956dca86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Boros?= Date: Wed, 21 Oct 2026 02:36:32 +0300 Subject: [PATCH 10/10] refactor(nix): pick the darwin curl at the pg_net use site Refs: MPG-1325 Co-Authored-By: Claude Sonnet 5.5 --- nix/ext/pg_net.nix | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index fafc26a48b..d004b9e491 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -18,23 +18,20 @@ let # nixpkgs builds libunistring against gnu libiconv on darwin, which collides with apple's in the cli bundle curlAppleIconv = - if stdenv.isDarwin then - let - libunistringApple = libunistring.override { libiconvReal = libiconv; }; - libidn2Apple = libidn2.override { libunistring = libunistringApple; }; - libpslApple = - (libpsl.override { - libidn2 = libidn2Apple; - libunistring = libunistringApple; - }).overrideAttrs - { env.NIX_LDFLAGS = "-liconv"; }; - in - curl.override { - libidn2 = libidn2Apple; - libpsl = libpslApple; - } - else - curl; + let + libunistringApple = libunistring.override { libiconvReal = libiconv; }; + libidn2Apple = libidn2.override { libunistring = libunistringApple; }; + libpslApple = + (libpsl.override { + libidn2 = libidn2Apple; + libunistring = libunistringApple; + }).overrideAttrs + { env.NIX_LDFLAGS = "-liconv"; }; + in + curl.override { + libidn2 = libidn2Apple; + libpsl = libpslApple; + }; pname = "pg_net"; build = version: hash: @@ -42,7 +39,7 @@ let inherit pname version; buildInputs = [ - curlAppleIconv + (if stdenv.isDarwin then curlAppleIconv else curl) postgresql ] ++ lib.optional (version == "0.6") libuv;