Released: 21 September 2026
PGD-S is no longer accepted
PGD-S (PGD Essential) is no longer offered as a product. tpaexec configure --architecture PGD-S now fails immediately, as does reconfigure/provision/deploy against an existing cluster whose config.yml still specifies architecture: PGD-S. Use PGD-X for new PGD 6 deployments.
Potential restart of Postgres on first deploy
On clusters where max_wal_senders and max_replication_slots are set only under postgres_conf_settings (not directly as cluster_vars), upgrading to 23.45.0 may restart Postgres once, if TPA's recalculated value differs from the value previously written to conf.d/0001-tpa_restart.conf. Setting both variables directly as cluster_vars, in the same deploy as the upgrade, avoids this.
New features, enhancements, bug fixes, and other changes in Trusted Postgres Architect 23.45.0 include the following:
Highlights
- Split sysctl management into separate vm and network groups, so a routine deploy no longer resets operator-tuned network settings
- Added support for running the TPA controller on, and experimentally deploying to, Debian 13 (trixie)
- PGD-S (PGD Essential) is no longer accepted by tpaexec configure; use PGD-X instead
Enhancements
| Description |
|---|
TPA now splits its sysctl management into separate vm and network task groups.TPA used to write a single mixed set of sysctls into TPA now splits these settings into two task selectors.
The historical network defaults have also been audited against current Linux kernel defaults. On the first redeploy under the new layout, TPA also removes any of its historical sysctl lines from |
TPA now supports running the controller on Debian 13.The TPA controller can now be a system running Debian 13 ("trixie"), either from a source checkout (using the system Python 3.13 packages) or via |
TPA now supports experimental deployment to Debian 13 (trixie) nodes.TPA can now deploy to nodes running Debian 13 ("trixie"). Suitable Docker images or AWS AMIs are selected on the docker or aws platforms, and This feature is experimental: deployment depends on the availability of the various packages for Debian 13, so not all architectures or software options will work until packages are uploaded to upstream repositories. Debian 12 remains the default Debian version, so existing clusters and any new cluster configured without an explicit |
TPA now supports preserving ansible.log across deprovision instead of deleting it.
|
TPA now supports controlling the startup of the Postgres service when EFM is the failover manager.A new variable, |
TPA now provides an Echo (Debian-based) execution environment variant for AAP 2.4.A new |
TPA now supports the |
TPA now repeats its deliberate warnings in a recap at the end of a run.Warnings that TPA raises on purpose to draw the operator's attention were printed only inline as a run proceeded, where they could scroll out of sight during a long deploy. TPA's output now collects those deliberate warnings and repeats them in a consolidated block after the PLAY RECAP, so they are not missed. Warnings emitted by Ansible itself are left out of this recap, so it stays focused on the messages TPA chose to raise. |
TPA now supports the |
TPA now supports EFM 5.4's |
Changes
| Description |
|---|
TPA now requires |
Bug Fixes
| Description | Addresses |
|---|---|
Fixed an issue whereby recalculating max_wal_senders/max_replication_slots could trigger an unnecessary Postgres restart.TPA calculates its own defaults for TPA now validates that To avoid the restart described above, set See the warning at the top of these release notes: upgrading to this version may still restart Postgres once if these variables are only set under | 65323 |
Fixed an issue whereby BDR/PGD clusters on Postgres 16 and later could suffer a permanent Raft consensus failure on first startup.Postgres 16 added TPA now adds TPA also now retries BDR node group creation on transient consensus errors, as a defensive measure independent of the above. | |
Fixed an issue whereby pgd-proxy could fail to connect to Postgres because libpq environment variables were not passed to its systemd service.The TPA now sets these variables directly in the pgd_proxy_service_environment: PGPASSFILE: '{{ pgd_proxy_home }}/.pgpass' PGSSLMODE: 'require'Each entry is rendered as an | 61496, 63632 |
Fixed an issue whereby every deploy logged a spurious Ansible warning that the raw module does not support the environment keyword.The task that records the deploy in the log file inherited a play-level environment it never used. It is now given an empty environment, so the spurious warning no longer appears. This is purely cosmetic; deployment behavior is unchanged. | |
Fixed an issue whereby PEM server nodes were given a fixed node name instead of a generated one.PEM server nodes created with | |
Fixed an issue whereby changes to the pgd-proxy systemd unit file were not applied on redeploy.Changes to the TPA now reloads systemd and restarts | |
Fixed an issue whereby | |
Fixed an issue whereby the Patroni rewind user lacked the privileges pg_rewind needs.The Patroni rewind user ( This fix grants the rewind user EXECUTE on the three pg_catalog functions pg_rewind requires ( | |
Fixed an issue whereby Patroni REST API test and management calls could fail under mTLS with a non-root SSH user.Calls to Patroni's REST API, used by | |
Fixed an issue whereby a pgbouncer/pgd-proxy port clash on the read-only port went undetected.TPA already stopped a deploy if pgbouncer and pgd-proxy were both configured to listen on the same port on the same host, but it only checked the main (read-write) port. If the clash was instead on pgd-proxy's read-only port, TPA didn't notice, and one of the two services could quietly fail to start. Deploy now checks both ports for a clash, and fails with a clear message, instead of stopping abruptly with a confusing error, if pgd-proxy's listen port isn't set in Deploy also now stops with a clear message if a host runs pgd-proxy but its read-only port ( | |
Fixed an issue whereby pgd-cli was installed but not configured on proxy nodes during a BDR 4 to PGD 5 upgrade.A BDR-Always-ON to PGD-Always-ON major upgrade (BDR 4 to PGD 5) converts dedicated harp-proxy nodes into pgd-proxy nodes, which require pgd-cli. The upgrade installed the pgd-cli package on those nodes but never wrote its configuration file, leaving pgd-cli present but unusable there ( TPA now writes the pgd-cli configuration on those nodes during the upgrade, so pgd-cli is fully installed and configured on the new pgd-proxy nodes. | |
Fixed an issue whereby pgd-cli authentication failed on dedicated pgd-proxy nodes.On a dedicated pgd-proxy node (one with no postgres/bdr role), pgd-cli was configured with endpoints that connect as the Postgres superuser, but the node's TPA now sets each pgd-cli endpoint to connect as the user appropriate to the node running pgd-cli, the pgd-proxy user on dedicated pgd-proxy nodes, so pgd-cli works out of the box there. Postgres and BDR nodes are unaffected. | |
Fixed an issue whereby the psycopg2 canary test failed on clusters with a non-root login user.
| |
Fixed an issue whereby Barman package installation failed on Debian/Ubuntu for Barman 3.20 and later.Since Barman 3.20.0, installing from EDB's own repository on Debian or Ubuntu ships Barman's Python client library under a new package name, | |
Fixed an issue whereby TPA's generated ssh_config prevented Ansible Tower's own SSH credential from being used.When a cluster is managed by Ansible Tower, TPA no longer writes an The generated | 61496 |
Fixed an issue whereby a HARP cluster could become unroutable after a re-deploy.TPA now re-applies the HARP cluster bootstrap configuration when the consensus store (DCS) has lost it, not only when the on-disk bootstrap file has changed. Previously, if the DCS was emptied or re-provisioned, or an initial bootstrap was interrupted, while the bootstrap file was left unchanged, a re-deploy would silently skip re-applying it and leave HARP-proxy unable to route connections. | |
Fixed an issue whereby tpaexec upgrade --components=pg-backup-api was a silent no-op.Upgrading pg-backup-api via | |
Fixed an issue whereby redeploying could reset the certificate ownership of a TLS-using service colocated with Postgres.Redeploying a cluster where a TLS-using service (for example etcd) shared a node with Postgres could leave that service's certificate and CA files owned by the Postgres system user instead of the service's own user, breaking TLS for that service until the files were manually fixed. This no longer happens. | |
Fixed an issue whereby the pkg-config package was missing from the required package list for Debian-based systems.The | |
Fixed an issue whereby tpaexec switchover failed on EFM clusters.
| |
Fixed an issue whereby M1 deploys failed when efm tasks were excluded.Deploying an M1 cluster configured with | |
Fixed an issue whereby upgrading pem-agent with update_hosts could fail when restricted to a subset of hosts.Upgrading the pem-agent component with | |
Fixed an issue whereby enabling pg-backup-api without PEM or beacon-agent produced a configuration with no EDB repository enabled.pg-backup-api is only published to EDB's Cloudsmith repositories, never to PGDG. Configuring a community-Postgres cluster with | |
Fixed an issue whereby PGD-X/PGD-S minor version upgrades could fail spuriously on clusters using non-default Connection Manager ports.The listening-ports check run during PGD-X/PGD-S minor version upgrades always checked the generic default Connection Manager ports instead of the ports actually configured for the cluster's node group, causing the check to fail with a connection error on any cluster that configures non-default | |
Fixed an issue whereby Postgres user and role DDL could fail during BDR3/BDR4-to-PGD5 or PGD5-to-PGD6 major version upgrades.During a BDR3-to-PGD5, BDR4-to-PGD5, or PGD5-to-PGD6 (PGD-X) major version upgrade, TPA could run Postgres user and role DDL (creating users, granting roles) on a node immediately after restarting it, before BDR Raft consensus had stabilized and before the node was unfenced. This could cause replicated DDL to fail with errors such as "failed to get a DDL epoch" or "consensus request timed out". TPA now waits for Raft consensus to stabilize before running this DDL, and only unfences the node afterwards, matching the correct sequence: fence, stop/update/restart Postgres, wait for consensus, run DDL, unfence. | 61496 |
Fixed an issue whereby PostgreSQL could be installed from the OS repository instead of PGDG/EDB on RHEL, Rocky Linux, AlmaLinux, CentOS Stream, and Oracle Linux 10.On RHEL, Rocky Linux, AlmaLinux, CentOS Stream, and Oracle Linux 10, the OS BaseOS/AppStream repositories ship their own PostgreSQL packages. Because DNF modularity, which TPA previously relied on to keep the OS repositories from providing PostgreSQL, was removed in these EL10 distributions, TPA could end up installing PostgreSQL from the OS repository instead of PGDG or EDB. The OS package's systemd unit is named differently from the one TPA expects, so deployment then failed while trying to manage the PostgreSQL service. TPA now excludes PostgreSQL, Barman, and repmgr packages from the OS BaseOS and AppStream repositories on all of these EL10 distributions, so PostgreSQL is always installed from PGDG or EDB as intended. This matches the exclusion behavior already in place for earlier RHEL family versions (7, 8, and 9, which rely on DNF module exclusion). | |
Fixed an issue whereby the Patroni readiness check could give up early despite its retry budget.The wait for a Patroni node to report itself ready during deploy, switchover, and | |
Fixed an issue whereby newly generated cluster CAs lacked an X509v3 Key Usage extension.TPA's generated cluster CA carried no X509v3 Key Usage extension. Python 3.13 enables strict X.509 verification by default, and strict verification rejects a CA certificate with no keyUsage extension at all, so any Python TLS client running on a node with Python 3.13 or newer (for example Debian 13) and verifying against TPA's CA would fail, even though the CA itself was otherwise valid. This fix adds the required keyUsage extension to newly generated CAs. Existing clusters are not affected: a CA already on disk keeps working exactly as before and is never regenerated by this change. If you later need a fixed CA for an existing cluster (for example, before adding a node running Python 3.13 or newer), delete | |
Fixed an issue whereby Connection Manager ports were not applied correctly when local routing was enabled.PGD reads the Connection Manager options (
| |
Fixed an issue whereby update_hosts scoping could cause PGD5-to-PGD6 and PGD6 minor upgrades to fail or skip proxy downtime monitoring.Several plays in the PGD5-to-PGD6 major upgrade and PGD6 minor upgrade playbooks were incorrectly scoped to the |
Deprecations
| Description |
|---|
PGD-S is no longer accepted as an architecture at configure time.PGD-S (PGD Essential) is no longer offered as a product. |