{"id":50344570,"url":"https://github.com/timescale/postgres-connector-chart","last_synced_at":"2026-05-29T19:01:39.908Z","repository":{"id":357628635,"uuid":"1237673959","full_name":"timescale/postgres-connector-chart","owner":"timescale","description":"Helm chart for Postgres connector","archived":false,"fork":false,"pushed_at":"2026-05-14T10:58:41.000Z","size":41,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T14:46:16.592Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go Template","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timescale.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-13T11:58:48.000Z","updated_at":"2026-05-14T10:58:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/timescale/postgres-connector-chart","commit_stats":null,"previous_names":["timescale/postgres-connector-chart"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/timescale/postgres-connector-chart","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timescale%2Fpostgres-connector-chart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timescale%2Fpostgres-connector-chart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timescale%2Fpostgres-connector-chart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timescale%2Fpostgres-connector-chart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timescale","download_url":"https://codeload.github.com/timescale/postgres-connector-chart/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timescale%2Fpostgres-connector-chart/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33666290,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-29T19:01:39.085Z","updated_at":"2026-05-29T19:01:39.897Z","avatar_url":"https://github.com/timescale.png","language":"Go Template","funding_links":[],"categories":[],"sub_categories":[],"readme":"# postgres-connector\n\nHelm chart that deploys the Timescale Postgres connector — a stateless service that replicates Postgres into TimescaleDB. Runs on any Kubernetes flavor, including OpenShift.\n\n## Install\n\nPick a release from the [Releases page](https://github.com/timescale/postgres-connector-chart/releases) and install the packaged chart directly:\n\n```sh\nhelm install postgres-connector \\\n  https://github.com/timescale/postgres-connector-chart/releases/download/v0.1.0/postgres-connector-0.1.0.tgz \\\n  -f my-values.yaml\n```\n\nTo always install the latest release, resolve the tag at install time (the chart `.tgz` is a versioned asset, so there is no fixed \"latest\" URL):\n\n```sh\nREPO=timescale/postgres-connector-chart\nTAG=$(gh release view --repo \"$REPO\" --json tagName -q .tagName)\nVERSION=${TAG#v}\nhelm install postgres-connector \\\n  \"https://github.com/$REPO/releases/download/$TAG/postgres-connector-$VERSION.tgz\" \\\n  -f my-values.yaml\n```\n\nOr clone and install from source (use this to track `main` ahead of a release):\n\n```sh\nhelm install postgres-connector . -f my-values.yaml\n```\n\n## Required values\n\n```yaml\nconfig:\n  version: 1\n  connectors:\n    - id: my-connector\n      source:\n        database_url: $SOURCE_URL\n        publications:\n          - my_publication\n      target:\n        database_url: $TARGET_URL\n        tables:\n          - source:\n              schema_name: public\n              table_name: metrics\n            hypertable_config:\n              primary_dimension:\n                column_name: time\n                range:\n                  partition_interval: 1 day\n\nenv:\n  - name: SOURCE_URL\n    valueFrom:\n      secretKeyRef: { name: db-creds, key: source-url }\n  - name: TARGET_URL\n    valueFrom:\n      secretKeyRef: { name: db-creds, key: target-url }\n```\n\nThe `config` block is rendered into a Kubernetes Secret and mounted at `/etc/connector/config.yaml`. Use `$VAR` expansion in `database_url` fields for credentials and inject the variables via `env`.\n\n### Database credentials Secret\n\nThe chart does not manage database credentials. Create the Secret referenced by `env` separately so the connection strings stay out of your values file (and out of source control). Minimal example:\n\n```yaml\n# db-creds.yaml — apply with: kubectl apply -f db-creds.yaml -n \u003cnamespace\u003e\napiVersion: v1\nkind: Secret\nmetadata:\n  name: db-creds\ntype: Opaque\nstringData:\n  source-url: \"postgres://USER:PASS@SOURCE_HOST:5432/DBNAME?sslmode=require\"\n  target-url: \"postgres://USER:PASS@TARGET_HOST:5432/DBNAME?sslmode=require\"\n```\n\n`stringData` lets you paste plain connection strings; Kubernetes base64-encodes them on apply. The Secret must live in the same namespace as the release.\n\n## Config schema\n\nTop-level:\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `version` | int | yes | Config schema version. Must be `1`. |\n| `connectors` | list | yes | One or more connector definitions. At least one is required. |\n\n### `connectors[]`\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `id` | string | yes | Unique connector identifier. Either a UUID or a string of alphanumerics, underscores, and hyphens. Must be unique across the file. |\n| `drop` | bool | no | When `true`, the connector is torn down (source-side replication slot/publication state and target cleanup) instead of running. |\n| `config` | object | no | Replication tuning (see below). Defaults applied when omitted. |\n| `source` | object | yes | Source Postgres configuration. |\n| `target` | object | yes | Target TimescaleDB configuration. |\n\n### `connectors[].config` (replication)\n\n| Field | Type | Default | Description |\n| --- | --- | --- | --- |\n| `enabled` | bool | `true` | Whether replication is active for this connector. |\n| `table_sync_workers` | int | `4` | Parallel workers used during the initial table sync. Must be 1–100. |\n| `initial_data_copy` | bool | `true` | Whether to perform the initial snapshot copy before streaming changes. Set to `false` to skip the snapshot and stream from the current LSN. |\n\n### `connectors[].source`\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `database_url` | string | yes | Postgres connection string for the source. Supports `$VAR` expansion from environment. |\n| `publications` | list of strings | yes | Existing Postgres logical-replication publications to subscribe to. At least one is required. |\n| `ssh_config` | object | no | SSH tunnel for reaching the source (see below). |\n\n### `connectors[].source.ssh_config`\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `host` | string | yes | SSH bastion host. |\n| `port` | int | no (default `22`) | SSH port (1–65535). |\n| `user` | string | yes | SSH user. |\n| `password` | string | no | SSH password (use private key auth where possible). |\n| `private_key` | string | yes | Base64-encoded private key, or `@/path/to/keyfile` to load and encode from disk. |\n| `host_key` | string | no | Expected host public key for verification. |\n\n### `connectors[].target`\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `database_url` | string | yes | TimescaleDB/Postgres connection string for the target. Supports `$VAR` expansion. |\n| `skip_replica_identity_index` | bool | no | Global default for the per-table setting below. |\n| `tables` | list | no | Per-table source-to-target mapping and hypertable configuration. |\n\n### `connectors[].target.tables[]`\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `source` | object | yes | Source table: `{ schema_name, table_name }`. |\n| `target` | object | no | Target table: `{ schema_name, table_name }`. Defaults to the source pair when omitted. |\n| `hypertable_config` | object | no | If set, creates a hypertable on the target with the given dimensions. |\n| `skip_replica_identity_index` | bool | no | When `true`, skip creating the replica identity index on the target. Falls back to the target-level default. |\n\n### `connectors[].target.tables[].hypertable_config`\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `primary_dimension` | object | yes | Primary partitioning dimension. Must be a `range` dimension. |\n| `secondary_dimensions` | list | no | Additional dimensions, each either `range` or `hash`. |\n\nEach dimension has:\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `column_name` | string | yes | Column used for partitioning. |\n| `range.partition_interval` | string | one of | Time/interval per chunk, e.g. `1 day`. |\n| `hash.num_partitions` | int | one of | Number of hash partitions. Must be ≥ 2. Not allowed on `primary_dimension`. |\n\nExactly one of `range` or `hash` must be set per dimension.\n\n## Updating the config\n\nEdit `config:` in your values file and run `helm upgrade`. The connector polls the mounted file every 30 seconds and reconciles connectors without a pod restart.\n\n## Monitoring progress\n\nThe connector exposes its internal state in the target database under the `_ts_live_sync` schema and uses logical replication slots named `live_sync_*` on the source. Set `SOURCE` and `TARGET` to the same connection strings used in your config.\n\n### Table sync status\n\n```sql\npsql \"$TARGET\" -c \"\n  SELECT state, last_error, count(*)\n  FROM _ts_live_sync.subscription_rel\n  GROUP BY 1, 2 ORDER BY 1, 2;\n\"\n```\n\nTables with errors appear as separate rows grouped by `last_error`.\n\n| State | Meaning |\n| --- | --- |\n| `i` | Initial state, table data sync not started |\n| `d` | Initial table data sync is in progress |\n| `f` | Initial table data sync completed, catching up with incremental changes |\n| `s` | Synchronized, waiting for the main apply worker to take over |\n| `r` | Table is ready, applying changes in real-time |\n\n### COPY progress during initial sync\n\nThe number of rows returned should usually match `table_sync_workers` from the connector config.\n\n```sql\npsql \"$SOURCE\" -c \"SELECT * FROM pg_stat_progress_copy;\"\n```\n\n### Replication lag\n\nOn the source, via `pg_replication_slots`:\n\n```sql\npsql \"$SOURCE\" -c \"\n  SELECT slot_name,\n    pg_size_pretty(pg_current_wal_flush_lsn() - confirmed_flush_lsn) AS lag\n  FROM pg_replication_slots\n  WHERE slot_name LIKE 'live_sync_%' AND slot_type = 'logical';\n\"\n```\n\nOn the target, via `_ts_live_sync.subscription` (also surfaces `last_error`):\n\n```sql\npsql \"$TARGET\" -c \"\n  SELECT\n    pg_size_pretty(source_flush_lsn - last_replicated_lsn) AS lag_bytes,\n    (metrics_updated_at - last_replicated_txn_time) AS lag_duration,\n    *\n  FROM _ts_live_sync.subscription;\n\"\n```\n\n## Metrics and dashboards\n\n- **Prometheus**: a `ServiceMonitor` is created by default (requires the Prometheus Operator). Disable with `serviceMonitor.enabled: false`.\n- **Grafana**: a `ConfigMap` labeled `grafana_dashboard: \"1\"` is created for the kube-prometheus-stack Grafana sidecar. Disable with `grafana.dashboard.enabled: false`.\n\n## OpenShift\n\nWorks under the default `restricted` SCC without modification — the chart sets no `runAsUser` and ships only non-root, capability-dropped containers with a read-only root filesystem.\n\n## Values\n\nSee [`values.yaml`](values.yaml).\n\n## Releases\n\nReleases are automated by [release-please](https://github.com/googleapis/release-please). Use [Conventional Commits](https://www.conventionalcommits.org/) — `feat:` bumps the minor version, `fix:` bumps the patch, `feat!:` / `BREAKING CHANGE:` bumps the major. release-please opens a release PR on every push to `main`; merging it creates a tag, a GitHub Release, and bumps `version` in `Chart.yaml`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimescale%2Fpostgres-connector-chart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimescale%2Fpostgres-connector-chart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimescale%2Fpostgres-connector-chart/lists"}