Overview
The CDC Pipeline is a meta-template that deploys a complete, pre-wired Change Data Capture pipeline in a single install. It bundles three production-ready templates — PostgreSQL HA, Apache Kafka, and Debezium Server — and automatically coordinates the credentials, WAL settings, and internal hostnames that would otherwise require manual configuration between them.Architecture
- PostgreSQL HA (Patroni + etcd + HAProxy) — Source database with logical replication enabled (
wal_level = logical). HAProxy routes writes to the current primary; replicas are addressable directly. - Kafka (KRaft, no ZooKeeper) — Event streaming platform. Debezium publishes change events here; consumers read from it.
- Debezium Server — CDC connector that tails the PostgreSQL WAL, converts row-level changes to structured events, and produces them to Kafka via SASL_PLAINTEXT.
| Service | Internal Hostname |
|---|---|
| PostgreSQL (via HAProxy) | {release-name}-postgres-ha-proxy.{gvc}.cpln.local:5432 |
| Kafka | {release-name}-cluster.{gvc}.cpln.local:9092 |
| Debezium | {release-name}-debezium.{gvc}.cpln.local |
What Gets Created
Everything from each bundled template:- From PostgreSQL HA: Stateful PostgreSQL Workload (3 replicas), etcd cluster, HAProxy workload, Volume Sets, secrets, identity and policy.
- From Kafka: Stateful Kafka broker workloads (KRaft, 3 replicas), Kafka Exporter, JMX Exporter, Kafbat UI, Volume Sets, secrets, identity and policy.
- From Debezium Server: Standard Debezium Server Workload, Volume Set (file offset storage), secrets, identity and policy.
This template does not create a GVC. You must deploy it into an existing GVC.
Prerequisites
This template has no external prerequisites — PostgreSQL, Kafka, and Debezium are all deployed together and auto-configured. To install, follow the instructions for your preferred method:UI
Browse, install, and manage templates visually
CLI
Manage templates from your terminal
Terraform
Declare templates in your Terraform configurations
Pulumi
Declare templates in your Pulumi programs
Configuration
The first thing to do after installing is replace allchangeme-* placeholder values with real secrets. The template validates at deploy time that shared credentials are consistent — mismatches are caught before any workload starts.
Shared Credentials
These values are used by multiple components and must be set once in a coordinated way. The defaultvalues.yaml pre-wires them:
PostgreSQL ↔ Debezium:
| Setting | PostgreSQL path | Debezium path |
|---|---|---|
| Database name | postgres-highly-available.postgres.database | debezium-server.source.database.name |
| Username | postgres-highly-available.postgres.username | debezium-server.source.database.user |
| Password | postgres-highly-available.postgres.password | debezium-server.source.database.password |
| Setting | Kafka path | Debezium path |
|---|---|---|
| SASL username | kafka.kafka.listeners.client.sasl.users | debezium-server.sink.kafka.saslUsername |
| SASL password | kafka.kafka.listeners.client.sasl.passwords | debezium-server.sink.kafka.saslPassword |
Deploy-time Validation
The template validates at install time that:postgres-highly-available.postgres.walLevelis set tological(required for CDC)- Database credentials match between the PostgreSQL and Debezium blocks
- Debezium’s Kafka SASL username appears in Kafka’s configured user list
Key Configuration Sections
What Tables to Capture
Setdebezium-server.source.tableIncludeList to a comma-separated list of schema.table names:
Debezium Heartbeat (Recommended)
The default configuration enables Debezium heartbeats every 5 seconds to keep the replication slot active and prevent WAL accumulation during low-traffic periods. After the pipeline is running, create the heartbeat table in PostgreSQL:Resource Sizing
Adjust resources per component based on your workload:Component Versions
| Component | Template Version | Software Version |
|---|---|---|
| PostgreSQL HA | 2.2.0 | PostgreSQL 17 (Patroni) |
| Kafka | 4.0.0 | Apache Kafka 3.9.1 (KRaft) |
| Debezium Server | 1.1.0 | Debezium 3.0 |
Using External PostgreSQL or Kafka
To replace the bundled PostgreSQL or Kafka with an external instance, override the hostname/bootstrap servers explicitly. The template will still deploy the other bundled components:wal_level = logical) before installing.
Connecting Consumers to Kafka
Applications consuming change events connect to Kafka using SASL_PLAINTEXT. The internal Kafka bootstrap address:{serverName}.{schema}.{table} — e.g. dbserver1.public.users.
Kafbat UI
The Kafbat UI (Kafka web dashboard) is included and enabled by default. Access it viacpln workload connect or configure its firewall.external_inboundAllowCIDR to expose it externally.
External References
Debezium Server Template
Deploy Debezium Server standalone against any PostgreSQL, MySQL, or other source
PostgreSQL Highly Available Template
The HA PostgreSQL template bundled in this pipeline
Kafka Template
The Kafka template bundled in this pipeline
Debezium Documentation
Full Debezium connector and server reference