Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
The release notes describe each change in full.
Added
- New
install_coldfrontandsetup_coldfrontroles add ColdFront tiered storage to pgEdge Distributed Postgres nodes, and newinstall_lakekeeperandsetup_lakekeeperroles build the Lakekeeper catalog it commits through, keeping its warehouse's storage profile up to date. (EE-40) - New
coldfront_enabledparameter adds ColdFront's libraries and settings to the Postgres configuration. Newlakekeeper_*andcoldfront_s3_*parameters locate the catalog and the object store. (EE-40) init_serverrefuses ColdFront on an HA cluster without mesh mode, without a catalog or complete object store settings, or on an unsupportedpg_version, and a Lakekeeper host with the default password or colliding ports. (EE-40)- New
simple-cluster-coldfrontsample playbook and inventory deploy a simple cluster with ColdFront, and the end-to-end test can add ColdFront, with a ColdFront reconfiguration check. (EE-40) - New
setup_coldfront_dbrole creates ColdFront's role, database and extensions beforesetup_pgedge. (EE-40) coldfront_meshorders ColdFront's cold-tier commits across every node of a Spock cluster.init_serverrefuses it unlessdb_nameslistscoldfront_db. (EE-40)- ColdFront's tuning settings,
coldfront.iceberg_async_parquet,coldfront.peer_alive_window_msandwal_receiver_status_interval, are defaultspg_parametersmay override. (EE-40) - The simple-cluster end-to-end test can run ColdFront in mesh mode. (EE-40)
- ColdFront runs on HA clusters in mesh mode.
setup_coldfrontruns its SQL on each zone's leader, and each replica writes its own DuckDB secret. (EE-40) - New
ultra-ha-coldfrontsample playbook and inventory deploy an Ultra-HA cluster with ColdFront in mesh mode, and the end-to-end test can add ColdFront. (EE-40)
Fixed
- The configuration reference gives the Debian defaults of
pg_data,pg_config_dir,pg_service_nameandpatroni_service_nameas named aftercluster_name, as the collection sets them, rather than aftermain, and names the RHEL Postgres servicepgedge-postgres-VERSION.
v2.0.0
This release adds recovery of an existing cluster from its pgBackRest repository, and reworks when the collection takes a backup so that redeploying a cluster can never discard the recovery point its repository was holding.
Playbooks written for v1.1.0 need changes. A playbook without the new
finalize_backrest role deploys without errors but sets up no backups, and an
HA cluster deployed that way fills its disk with unarchived WAL.
backup_repo_cipher is now required, so the next run against an existing
cluster stops in init_server until it is set. See
Upgrading from v1.1.0 before
upgrading.
The release notes describe each change in full.
Added
- New
wipe_clusterandrecover_postgresroles, and thesample-playbooks/wipe-cluster/andsample-playbooks/ultra-ha-recover/playbooks, rebuild an HA cluster from its pgBackRest repositories, optionally to a point in time, and commit the result once it is right. See Recovering a Cluster from Backup. (EE-39) - New
pgedge_seed_zoneparameter hassetup_pgedgefill empty zones from one that holds the cluster's data. (EE-39) - New
finalize_backrestrole creates the backup user, stanza, first backup and cron schedule at the end of a deployment. (EE-39) - A repository identity check stops a deployment that would build an empty cluster beside a repository holding a different one. (EE-39)
- New
patroni_replica_from_backupparameter rebuilds replicas with a pgBackRest delta restore. (EE-39) - New
etcd_ca_certandetcd_ca_keyparameters supply the etcd certificate authority from Ansible Vault. (EE-39) - New render, recovery and backup checks in the test suite. (EE-39)
- New
etcd_auto_compaction_mode,etcd_auto_compaction_retentionandetcd_quota_backend_bytesparameters. etcd now compacts key history older than an hour, where before it kept every revision until it reached its quota and stopped accepting writes. (EE-42) - New etcd reconfiguration check in the test suite. (EE-42)
- New
uri_style,storage_ca_file,storage_portandstorage_verify_tlskeys inbackup_repo_paramsfor S3-compatible stores such as MinIO. (EE-39) init_servervalidates S3 repository settings and refuses a backup server in an S3 zone. (EE-39)- New
pg_parametersparameter sets Postgres configuration parameters on simple and Ultra-HA clusters. It mergesshared_preload_librarieswith the collection's libraries and rejects parameters the collection controls. (EE-35) - New
pg_allow_restartparameter controls whether a run restarts Postgres to apply parameters that need a restart. (EE-35) - New Postgres reconfiguration check in the test suite. (EE-35)
init_serverrefusespg_parametersthat set a worker, slot, walsender or origin limit below what the cluster needs. (EE-36)- Pushing a version tag builds the collection and attaches it, with a signed build provenance attestation, to a draft GitHub release. (EE-46)
Changed
setup_etcdapplies a changed configuration to a running cluster, restarting one etcd member at a time. (EE-42)setup_patronikeeps the Postgres parameters in each zone's Patroni store up to date on every run, and restarts only members with a restart pending, replicas first. (EE-35)- Simple clusters now set
sslandspock.conflict_log_levelthe same way Ultra-HA clusters do. (EE-35) max_worker_processes,max_replication_slots,max_wal_sendersand, on Postgres 18,max_active_replication_originsdefault to values calculated from the zones,db_namesand standbys, so clusters replicating several databases start replicating. Slots and walsenders never go below the previous16. (EE-36)- The first backup is taken only when the repository holds none that can restore the cluster. (EE-39)
setup_backrestwrites files only and runs beforesetup_postgres. (EE-39)- An HA cluster's archive and restore commands come from the Patroni configuration template. (EE-39)
- The Patroni template uses
create_replica_methods. (EE-39) setup_backrestrefuses to replace apgbackrest.confthat can read the stanza with one that cannot. (EE-39)setup_postgreson Debian recreates a cluster whose configuration outlived its data directory, including one namedmain. (EE-39)
Security
backup_repo_cipherhas no default andinit_serverrequires it. (EE-39)- A collection tarball built with
make buildno longer includes private keys left in the tree by local runs. (EE-39) - Running a playbook with
--diffno longer prints passwords or the repository cipher. (EE-39)
Fixed
backup_repo_cipher_type: noneproduces a configuration PgBackRest accepts. (EE-39)- A non-HA cluster's
archive_commandno longer reverts to/bin/trueeach timesetup_postgresruns beforefinalize_backrest. (EE-35) backup_repo_userandbackup_repo_pathno longer becomerootand/home/rootwhen facts are gathered underbecome. (EE-39)- S3 repositories get a client configuration. (EE-39)
- A controller without the cluster's etcd certificate authority no longer generates a new one. (EE-39)
setup_patronifinds the primary when Postgres listens on a port other than 5432. (EE-39)make buildrebuilds the tarball when any shipped file changes or is deleted. (EE-39)make buildworks in a source tree downloaded from GitHub, which has no git history, and no longer takes its version from an enclosing repository. (EE-46)
v1.1.0
This release adds optional pgBouncer connection pooling and support for an externally managed Patroni configuration store. Both are opt-in: an inventory that sets neither renders exactly the configuration v1.0.0 did, so existing clusters upgrade in place.
Added
- New
patroni_dcsparameter selects the distributed configuration store Patroni uses and passes arbitrary connection settings to it, allowing an externally managed store such as Consul or ZooKeeper. Accepted types areetcd3,etcd,consul,zookeeper, andexhibitor. Patroni'skubernetestype is not accepted, because it discovers the API server from a pod environment or a kubeconfig rather than from a configured endpoint, and this collection installs Patroni on ordinary hosts. (EE-33) install_patroninow installs the Patroni client library that matches the configuredpatroni_dcstype. (EE-33)- Ultra-HA end-to-end test now covers an externally managed Consul store in addition to the default etcd cluster. (EE-33)
- New
patroni_namespaceparameter sets the key prefix Patroni uses within the distributed configuration store, so a store shared by more than one zone can give each zone its own prefix. Defaults to/db/, which matches the previous hardcoded value. (EE-33) - New
patroni_scopeparameter sets the cluster name Patroni uses within the distributed configuration store, so a store shared by more than one zone can give each zone its own scope instead of its own namespace prefix, which some stores make load-bearing. Defaults to<pg_version>-<cluster_name>, which matches the previous hardcoded value, and thepatronictlinvocations insetup_patroniandsetup_backrestnow name the cluster with it. (EE-33) init_servernow asserts thatpatroni_dcs.parametersis present whenpatroni_dcs.typenames a store the collection does not deploy, so a missing key fails before bootstrapping rather than while Patroni is configured. (EE-33)role_configgained apg_feature_checkstask file that asks the installed PostgreSQL binary which configuration parameters it recognizes.setup_postgresandsetup_patroniinclude it so configuration can be gated on parameters that only some releases carry. (EE-34)- New
install_pgbouncerandsetup_pgbouncerroles deploy a pgBouncer connection pooler on pgEdge nodes, giving each node a second endpoint onpgbouncer_portbeside PostgreSQL's own. Pooling is opt-in through the newpgbouncer_enabledparameter, which is cluster-wide the wayis_ha_clusteris: set it on thepgedgegroup and every node pools, leave it unset and the cluster renders exactly the configuration it did before.init_serverrejects an inventory whose pgEdge nodes disagree, because a zone that pooled only some of its nodes would lose its pooled endpoint on the first failover to one of the others. - Pooled connections authenticate through pgBouncer's
auth_queryrather than a maintained password list.setup_postgrescreates a powerlesspgbouncer_authrole and aSECURITY DEFINERlookup wherever the cluster pools, so every PostgreSQL role works through the pooled endpoint, including roles created after deployment, and a rotated password takes effect immediately. The lookup filters on the role'sVALID UNTIL, so an expired password is refused at the pooler instead of being accepted there and failing the backend login. Onlypgbouncer_auth_passwordis written to disk, andinit_serverrefuses to deploy a pooled cluster while it is still the default. - The pooler enforces its own client authentication rules, rendered into
/etc/pgbouncer/pg_hba.conffrom the same variables that drive the PostgreSQL rules.custom_hba_rulesadmits a client to both endpoints; the newpgbouncer_hba_rulesadmits it to the pooled endpoint alone.init_servervalidates both against thepg_hbasubset pgBouncer can parse, since it skips a line it cannot parse rather than refusing to start.pgbouncer_authreaches the pooler over its unix socket only: the rendered rules reject it on every address, ahead of the loopback and proxy rules that name every role, so the one account that can read stored verifiers is not also a network login. - The pooled endpoint serves TLS from the same certificate PostgreSQL
presents, staged from the controller rather than read out of
PGDATAso an HA replica does not race Patroni's clone.pgbouncer_client_tls_sslmodedefaults toallow, which accepts exactly what the direct endpoint accepts today. - New
pooler_portparameter fronts the poolers from the proxy layer, the wayproxy_portfrontspg_port. Where the cluster pools,setup_haproxyemits apg-poolerlistener on it carrying every node of the zone — the same servers as the direct listener, differing only in the port — health-checked against Patroni's REST API like the direct listeners, and sizes the global connection ceiling to cover it. The existing listeners are unchanged, so Spock replication never routes through a pooler.init_serverasserts the ports a host actually binds do not collide: the two proxy-layer ports against each other on any HAProxy node, and againstpg_portandpgbouncer_portonly where HAProxy shares a host with a pgEdge node, since that is the only topology where all four bind the same address. - New documentation for pooling: role pages for both new roles, a Pooling
Configuration reference, a pgBouncer troubleshooting page, the pooled
listener and the port model in Proxy Configuration,
pgbouncer_enabledin Inventory Structure, and an opt-in walkthrough in both tutorials.
Fixed
- Spock replication no longer breaks on PostgreSQL releases carrying the fix
for CVE-2026-6471, which refuse to load an output plugin that
output_plugin_librariesdoes not name. Both simple and Ultra-HA clusters now set the parameter, and only on releases that recognize it, since earlier releases refuse to start when it appears. (EE-34) init_servernow rejects an inventory that givesproxy_portthe same value aspg_porton a host that runs HAProxy alongside a pgEdge node, a topology the proxy documentation supports. HAProxy could not bind its listener there, which surfaced as a service failure well after the playbook had configured the node rather than as a validation error before it started.init_servervalidations that read a host's own variables now run on the hosts that carry them rather thanrun_once. Ansible runs arun_oncetask on the first host of the play and evaluates its condition only there, so on an inventory that ordered a proxy, backup or client host first, these checks read variables that host did not have — reporting a failure against the wrong host, or skipping silently and reporting nothing at all. Affected the default password check,pgbouncer_auth_password, the pooler's TLS mode and HBA rule checks, the per-zone node check, the supported-OS check and both DCS checks. The two assertions that read the inventory as a whole, and so resolve the same from any host, still run once.patroni_config_fileandpatroni_tls_dirare now recognized by all roles.- HA failover example in the usage guide now passes the Patroni scope the collection actually configures, which has included the PostgreSQL version since v1.0.0.
- Patroni replication user now connects to all databases for logical slot creation.
backup_repo_cipherdefault is now properly deterministic.- PostgreSQL contrib package is now installed explicitly on RHEL systems where it may be missing.
v1.0.0
This release is a major overhaul that revises every role in the collection.
It replaces the pgEdge CLI component with standard RPM and DEB packages from
the pgEdge and PGDG package repositories. All local-user installation
semantics are removed in favor of the standard postgres OS user and
system-conventional paths.
This is a breaking change. Clusters deployed with v0.1 or v0.2 cannot be upgraded in place. Re-provision all nodes from scratch before deploying to production.
Added
- New
install_reposrole installs the pgEdge and PGDG package repositories on each node before any software installation takes place. Add this role to all playbooks immediately afterinit_server. (EE-22) custom_hba_rulesparameter accepts a list of custompg_hba.confrules to append to the default rule set.backup_userandbackup_passwordparameters define a dedicated PostgreSQL user withpg_checkpointprivileges for backup operations.backup_repo_userparameter specifies the OS user that owns the PgBackRest repository in SSH backup mode.proxy_portparameter allows HAProxy to run on a pgEdge node by setting a proxy port separate from the PostgreSQL listen port.pgedge_userandpgedge_passwordparameters define the internal user used for node-to-node Spock connections.tls_validity_daysparameter controls the validity period for generated TLS certificates.
Fixed
- Patroni cluster initialization now waits for the primary to become available before performing administrative operations.
Changed
- Switched to pgEdge distro-specific package repositories;
repo_namedefault changed fromdownloadtorelease. (EE-22) - PostgreSQL, etcd, Patroni, and PgBackRest are now installed from system
packages rather than downloaded locally. The
install_baseandcluster_pathparameters are removed. - PostgreSQL now runs as the system
postgresuser. Data and configuration directories follow OS conventions:/var/lib/postgresql/VERSION/mainand/etc/postgresql/VERSION/CLUSTERon Debian;/var/lib/pgsql/VERSION/dataon RHEL. pg_home,pg_path,pg_data, andpg_config_dirare now computed frompg_versionand OS family. Thecluster_path-based path variables are removed.- Default
pg_hba.confrules now use a least-privilege model and only include entries for known user and database combinations. Custom rules can be added viacustom_hba_rules. init_servernow disablesRemoveIPCin systemd-logind, creates thepostgresOS user on nodes that require SSH backup access, and validates configuration before any other tasks run.- Updated default etcd version to 3.6.5.
- Spock extension is now always installed at the latest available version.
- Several parameters previously scattered across role defaults are now
centralized in the
role_configrole.
v0.2.0
Added
- Ability to specify additional HAProxy listeners for specific Patroni node types. (EE-9)
- Restart Postgres in setup_patroni role to activate config changes. (EE-13)
Changed
- Switched to upstream etcd and Patroni releases. (EE-15)
- Set default Spock version to 5.0.
- Set default Postgres version to 17.
v0.1.0
The "real" release.
Added
- Ability to specify multiple database names for subscription management. (EE-12)
- Ability to specify exception_behaviour as parameter. (EE-7)
- Can now specify proxy_node to override automatic haproxy zone target. (EE-3)
Fixed
- Additional retries to circumvent Debian package management locks. (#15)
- replication_user and replication_password actually work now. (EE-14)
- Strip comments from ssh_keyscan output to avoid syntax errors. (#13)
- DDL replication now activates spock.allow_ddl_from_functions. (EE-10)
- Added lock_timeout parameter to all package tasks to avoid failures. (EE-8)
- Added explicit dependency to ansible.utils.ipaddr filter. (EE-1)
Changed
- Renamed db_name role parameter to db_names to list multiple database names. (EE-12)
v0.0.2
Added
- Initial creation and setup roles for pgEdge cluster resources.