/health and /ready endpoints. It also adds a stdout target for debugging pipelines, an optional null-byte sanitizer, ltree and cube type support, custom TLS for search stores, and an --upgrade flag that migrates a v0.9.x installation to v1.x. No migration is required when upgrading from v1.0.x.
Environment Variables in YAML Configuration
PR #790, contributed by @mvanhorn. Any${VAR} reference in a YAML configuration file — including the transformation rules file — is replaced with the value of that environment variable before the configuration is parsed. Credentials no longer have to be committed alongside the rest of the configuration:
Human-Readable Byte Sizes
PR #823, by @kvch. Byte-size settings — batch sizes, auto-tuning bounds — accept a unit suffix instead of a raw byte count. Units are case-insensitive and binary (1MiB is 1048576 bytes). Plain integers keep working:
Configurable Log Format
PR #880, by @kvch.--log-format selects between the human-readable console output (the default) and structured json for log collectors. It can also be set with PGSTREAM_LOG_FORMAT or logging.format.type. A companion --no-color flag disables ANSI codes in console output.
Health and Readiness Endpoints
PR #882, by @kvch. Therun and snapshot commands can start a small HTTP server exposing /health (liveness, always 200) and /ready (readiness, which pings the source database when one is configured). Responses are JSON. This makes pgstream deployable behind Kubernetes probes without a sidecar:
localhost:9910 unless an address is given.
New stdout Target
PR #883, by @kvch.
A stdout target writes WAL events as NDJSON — one JSON object per line — so a pipeline, its filters and its transformation rules can be validated without provisioning a real target:
Null-Byte Sanitizer
PR #871, contributed by @AasheeshLikePanner. Postgrestext values may contain null bytes (0x00) that other targets reject. An optional processor strips them from string column values:
New Type Support
ltree(PR #834) andcube(PR #831), by @kvch. Both types are now replicated instead of failing on an unknown type.pgvector(PR #809), contributed by @rieg-ec. The pgvector types are registered on the connection, so vector columns replicate without a custom codec.
Custom TLS for Search Stores
PR #832, by @kvch. Elasticsearch and OpenSearch targets accept explicit TLS settings — CA certificate, client certificate and key — instead of relying on the system trust store, which is what self-managed clusters with a private CA need.--upgrade Flag for v0.9.x Installations
PR #788, by @tsg.
Moving from the 0.9 line to 1.x required a manual destroy/init cycle. pgstream init --upgrade now cleans up the v0.9 objects left behind by the schema-log architecture and re-initializes in one step. See the v1.0.0 release notes for what changes between the two lines.
Bug Fixes
- Precision loss on large integers and
bigint(PR #833). Values beyond the exact range of a float64 were rounded in transit; they are now carried without loss. - Composite primary keys in WAL metadata (PR #805), contributed by @blurskye. All columns of a composite key are recorded, instead of only the first.
- Constraints restored before snapshot conflict updates (PR #806), contributed by @blurskye. An
ON CONFLICTupdate needs the constraint it targets to exist, so constraint restore now happens first. - Transformer panics with multiple workers (PR #884). Greenmask’s generators keep state that is not safe for concurrent use; transformers now take an instance per execution, so snapshots with more than one worker no longer panic.
- All error messages are collected before shutdown (PR #841). A failing pipeline reported the first error only; the rest are now surfaced too.
includeGlobalDBObjectswithschema: all(PR #760), by @tsg.- CVEs in
jackc/pgx(PR #810), contributed by @fiws. pgx is updated to v5.9.2.
New Contributors
- @mvanhorn in PR #790
- @SAY-5 in PR #802
- @blurskye in PR #805
- @rieg-ec in PR #809
- @fiws in PR #810
- @AasheeshLikePanner in PR #871
Upgrade
No configuration changes are required when upgrading from v1.0.x. Replace the binary and restart pgstream. Existing configurations keep working: environment-variable expansion, human-readable sizes, the sanitizer and the health server are all opt-in. Users still on the 0.9 line can migrate withpgstream init --upgrade, which removes the v0.9 objects and re-initializes for v1.x.
Support
- Issues: https://github.com/xataio/pgstream/issues
- Documentation: https://github.com/xataio/pgstream/tree/main/docs
- Discussions: https://github.com/xataio/pgstream/discussions