Overview
TimescaleDB is a time-series database built as a PostgreSQL extension. This template deploys a single-instance PostgreSQL 18 server with the TimescaleDB Community extension preloaded and auto-created, giving you hypertables, columnar compression, continuous aggregates, and retention policies alongside regular relational tables — all through any PostgreSQL client or ORM. Optional PgBouncer connection pooling and scheduled backups to AWS S3, GCS, or a self-hosted MinIO instance are included.TimescaleDB is licensed under the Timescale License (TSL). It is free to self-host, including all Community features (compression, continuous aggregates, retention); the license only forbids reselling TimescaleDB itself as a managed database service.
TimescaleDB on Control Plane operates as a single-instance deployment, pinned to one replica. Do not scale up the replica count — PostgreSQL is a single-writer database, and additional replicas would run as isolated instances rather than a cluster.
What Gets Created
- Stateful TimescaleDB Workload — A single-replica PostgreSQL 18 + TimescaleDB 2.28.3 container on port
5432. The extension is preloaded, created automatically in your database, and auto-tuned to the container’s resources at first boot. - Volume Set — Persistent storage for the database data directory, with optional autoscaling and 7-day snapshots.
- Secret — A dictionary secret storing the database username and password, injected into the container at startup.
- Identity & Policy — An identity bound to the workload with
revealaccess to the credentials secret, and scoped cloud storage access when backup is enabled. - PgBouncer Workload (optional) — A PgBouncer connection pooler deployed as a separate workload in front of TimescaleDB.
- Backup Cron Workload (optional) — A scheduled
pg_dumpallbackup job that writes compressed SQL dumps to AWS S3, GCS, or MinIO.
This template does not create a GVC. You must deploy it into an existing GVC.
Installation
This template has no external prerequisites unless backup is enabled. 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 defaultvalues.yaml for this template:
Image and Resources
image— The TimescaleDB image tag. Keep it in the default (Community) series;-osstags remove compression, continuous aggregates, and retention.resources.minCpu/resources.minMemory— Minimum CPU and memory guaranteed to the workload.resources.maxCpu/resources.maxMemory— Maximum CPU and memory the workload can use.timescaledb-tunesizesshared_buffersand worker settings frommaxMemoryat first boot (for example,shared_buffersbecomes ~25% of the memory limit).
Auto-tuning is captured only at first boot, when the data volume is empty. Raising
resources.maxMemory on an existing deployment does not retune PostgreSQL — adjust settings manually with ALTER SYSTEM, or uninstall (which deletes the volume set) and reinstall.Credentials
config.username— Database username. Change before deploying to production.config.password— Database password. Change before deploying to production.config.database— Name of the database created on startup. The TimescaleDB extension is created automatically inside it.
These values are only applied on first startup when the data directory is empty. Updating them after the initial deployment has no effect on the running database. To change credentials or the database name on an existing instance, use PostgreSQL’s native commands (e.g.
ALTER USER, ALTER DATABASE).Storage
volumeset.capacity— Initial volume size in GiB (minimum 10).volumeset.autoscaling.enabled— Automatically expand the volume as it fills. When enabled:maxCapacity— Maximum volume size in GiB.minFreePercentage— Trigger a scale-up when free space drops below this percentage.scalingFactor— Multiply the current capacity by this factor when scaling up.
Internal Access
internalAccess.type— Controls which workloads can connect to TimescaleDB on port5432:
internalAccess.workloads— Whentypeisworkload-list, the list of workload links (e.g.//gvc/GVC_NAME/workload/WORKLOAD_NAME) allowed to connect.
Public Access
publicAccess.enabled— Whentrue, exposes port5432through a TCP load balancer and assigns a public*.cpln.appcanonical endpoint.
PgBouncer Connection Pooling
PgBouncer is an optional connection pooler that sits in front of TimescaleDB and multiplexes application connections into a smaller pool of real database connections. This reduces connection overhead and protects the database from exhaustion under high concurrency. When enabled, PgBouncer is deployed as a separate workload and becomes the primary connection endpoint for your applications:pgbouncer.enabled— Enable or disable PgBouncer.pgbouncer.poolMode— Controls how connections are reused:
pgbouncer.defaultPoolSize— Number of real database connections PgBouncer maintains per pool (default:25).pgbouncer.maxClientConn— Maximum number of client connections PgBouncer accepts (default:1000).pgbouncer.replicas— Number of PgBouncer instances. PgBouncer is stateless and can be scaled horizontally for high-throughput workloads.pgbouncer.resources.cpu/pgbouncer.resources.memory— Resources allocated to each PgBouncer replica.
PgBouncer shares the same credentials and identity as the TimescaleDB workload — no additional secrets or IAM configuration is required. The
userlist.txt and pgbouncer.ini are generated automatically from your config.username, config.password, and config.database values at startup.Backup
Backup is disabled by default. When enabled, a cron workload runspg_dumpall on the configured schedule and uploads a compressed SQL dump to AWS S3, GCS, or a MinIO-compatible endpoint.
backup.enabled— Enable scheduled backups.backup.image— The backup container image. Match its tag to the server major version —18.1.0for the default PostgreSQL 18 image,17.1.0for a PostgreSQL 17 image.backup.schedule— Cron expression for backup frequency (default: daily at 2am UTC).backup.provider—aws,gcp, orminio.backup.resources.cpu/backup.resources.memory— Resources for the backup cron container.
Connecting
Using TimescaleDB
Any PostgreSQL client or ORM works unchanged. Turn a regular table into a hypertable (automatically partitioned by time) and query it with time buckets:Backup Prerequisites
AWS S3
Before enabling backup withprovider: aws, complete the following in your AWS account:
1
Create a bucket
Create an S3 bucket. Set
backup.aws.bucket to its name and backup.aws.region to its region.2
Set up a Cloud Account
If you do not have one, create a Cloud Account for your AWS account. Set
backup.aws.cloudAccountName to its name.3
Create an IAM policy
Create an IAM policy with the JSON below, replacing
YOUR_BUCKET_NAME, then set backup.aws.policyName to the policy’s name and backup.aws.prefix to the folder path for backups.GCS
Before enabling backup withprovider: gcp, complete the following in your GCP account:
1
Create a bucket
Create a GCS bucket. Set
backup.gcp.bucket to its name.2
Set up a Cloud Account
If you do not have one, create a Cloud Account for your GCP project. Set
backup.gcp.cloudAccountName to its name — access is keyless, with no stored credentials.MinIO
Before enabling backup withprovider: minio, ensure your MinIO instance (or any S3-compatible endpoint) is accessible:
1
Create a bucket
Create a bucket on the server. Set
backup.minio.bucket to its name.2
Set the endpoint
Set
backup.minio.endpoint to the S3 API address including the port. For the minio marketplace template deployed in the same GVC, use http://WORKLOAD_NAME:9000.3
Set credentials
Set
backup.minio.accessKey and backup.minio.secretKey to credentials with access to the bucket. For the MinIO template, these match the admin.username and admin.password values. Set backup.minio.prefix to the folder path for backups.MinIO backup requires no Control Plane Cloud Account — credentials are passed directly to the backup job.
Restoring a Backup
Restoring a TimescaleDB dump is not the vanilla PostgreSQL procedure. The target server must run the same TimescaleDB extension version as the dump, and the replay must be wrapped intimescaledb_pre_restore() and timescaledb_post_restore(). Run the following from a client with access to the backup bucket and to a fresh database:
AWS S3:
gsutil cp "gs://BUCKET_NAME/PREFIX/BACKUP_FILE.sql.gz" -. For MinIO, add --endpoint-url "http://MINIO_ENDPOINT:9000" to the aws s3 cp command and export the MinIO access and secret keys as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
Important Notes
- Change
config.passwordbefore installing. Credentials are written into the data directory at first boot; changing the value later does not change the database password. - Do not scale this workload. It is single-writer PostgreSQL, pinned to one replica. Additional replicas would run as isolated instances, not a cluster.
- Auto-tuning is captured at first boot only.
timescaledb-tunesizes memory settings from the container limit when the volume is empty; raisingresources.maxMemorylater does not retune. - Public access is unencrypted. The image ships no TLS certificates — keep
publicAccess.enabled: falseunless you accept plaintext connections. - Keep the image tag in the default (Community) series.
-osstags remove compression, continuous aggregates, and retention policies. If you pin a differentpgXXserver image, matchbackup.imageto the same major (17.1.0for PostgreSQL 17). - Uninstall deletes the volume set. A final snapshot is kept for 7 days; enable backups if the data matters long-term.
External References
TimescaleDB Documentation
Official TimescaleDB documentation
Hypertables
Hypertables, compression, continuous aggregates, and retention
PgBouncer Documentation
PgBouncer configuration reference
TimescaleDB Template
View the source files, default values, and chart definition