Overview
PostGIS extends PostgreSQL with support for geographic objects and spatial queries, making it the standard choice for location-aware applications. This template deploys a single-replica PostGIS instance with persistent storage. Database credentials are not template values. PostGIS reads its username, password and database name from a dictionary secret you create before installing, so no password passes through Helm or lands in the release.PostGIS on Control Plane operates as a single-replica deployment. Do not scale up the replica count, as this would result in multiple isolated instances rather than a replicated cluster.
What Gets Created
- Stateful PostGIS Workload — A single-replica PostGIS database container with configurable resources.
- Volume Set — Persistent storage for database data, with optional autoscaling.
- Backup Config Secret (optional) — A dictionary secret holding the backup bucket and region. Non-sensitive, and created only when
backup.enabled: true. - Identity & Policy — An identity bound to the workload, and a policy granting it
revealon exactly the credentials secret you created — plus the backup config secret and Cloud Account binding when backup is enabled. - Backup Cron Workload (optional) — A scheduled
pg_dumpbackup job that writes compressed SQL dumps to AWS S3 or GCS.
This template does not create a GVC. You must deploy it into an existing GVC.
Upgrading From 1.3.2 or Earlier
Template versions up to 1.3.2 took the database credentials as plain Helm values, shipped working defaults for them, and wrote those credentials into a chart-owned secret named after the release. Version 1.4.0 removes all of that.1
Read the credentials the database already uses
Credentials are written into the data directory the first time the volume is initialized, so an existing database keeps whatever it was created with. Recover them from your current values file, or from the secret the old version created — do this before upgrading:Pass
-o yaml. A bare cpln secret reveal prints only a summary table, not the values.2
Create the prerequisite secret with those same values
Follow Prerequisites, using the existing username, password and database name. Different values here do not change the database — they just leave the workload unable to authenticate.
3
Remove the old keys from your values
Delete
config.username, config.password and config.database, and set config.credentialsSecretName to your secret’s name.4
Upgrade, then rotate the password
After the upgrade succeeds, change any password that came from a 1.3.2 default — those defaults were published in the public template repository, so treat them as compromised. Rotate inside PostGIS, then update the secret to match:
Prerequisites
One secret must exist before you install. It holds the credentials your applications put in their connection strings. The values never pass through Helm, so they do not land in the release. Secrets are org-level, so no GVC flag is involved.1
Create the database credentials secret
A dictionary secret holding exactly three keys — Set
username, password and database. PostGIS creates that role and that database on first boot:config.credentialsSecretName to the name you used. Secret names are org-wide, so give each release its own.2
Read the secret back later
Pass
-o yaml. A bare cpln secret reveal prints only a summary table, not the values:Installation
Create the prerequisite secret first, then install by whichever method you prefer: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:
Credentials
config.credentialsSecretName— Name of the dictionary secret holdingusername,passwordanddatabase. PostGIS creates that role and that database on first boot, with the PostGIS extension installed into it. These are the credentials your applications put in their connection strings.
cpln://secret/... references, so the values appear in neither the Helm release nor the stored workload spec.
The credentials are applied only on first startup, when the data directory is empty. Changing the secret afterwards does not change the running database — it only changes what the workload presents when it authenticates, which will then fail. To rotate on an existing instance, run
ALTER ROLE ... WITH PASSWORD inside PostgreSQL first, then update the secret to match.Resources
resources.minCpu/resources.minMemory— Minimum CPU and memory guaranteed to the workload.resources.maxCpu/resources.maxMemory— Maximum CPU and memory the workload can use.
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 PostGIS on port5432:
Connecting to PostGIS
Once deployed, connect to the database from within the same GVC using:Backup
Backup is disabled by default. When enabled, a cron workload runspg_dump on the configured schedule and uploads compressed SQL dumps to AWS S3 or GCS.
Backup requires PostGIS 17 or later. Set
backup.image to match your PostGIS version: ghcr.io/controlplane-com/backup-images/postgres-backup:18.1.0 for PostGIS 18, or the 17.1.0 tag of the same image for PostGIS 17.backup.enabled— Enable scheduled backups.backup.schedule— Cron expression for backup frequency (default: daily at 2am UTC).backup.provider—awsorgcp.backup.resources.cpu/backup.resources.memory— Resources for the backup cron container.
AWS S3
Before enabling backup withprovider: aws, complete the following in your AWS account:
- Create an S3 bucket. Set
backup.aws.bucketto its name andbackup.aws.regionto its region. - If you do not have a Cloud Account set up, refer to the docs to Create a Cloud Account. Set
backup.aws.cloudAccountNameto its name. - Create an IAM policy with the following JSON, replacing
YOUR_BUCKET_NAME:
- Set
backup.aws.policyNameto the name of the policy created in step 3. - Set
backup.aws.prefixto the folder path where backups will be stored.
GCS
Before enabling backup withprovider: gcp, complete the following in your GCP account:
- Create a GCS bucket. Set
backup.gcp.bucketto its name. - If you do not have a Cloud Account set up, refer to the docs to Create a Cloud Account. Set
backup.gcp.cloudAccountNameto its name. - Add the Storage Admin role to the GCP service account associated with the Cloud Account.
- Set
backup.gcp.prefixto the folder path where backups will be stored.
Restoring a Backup
Run the following from a client with access to the backup bucket: AWS S3:External References
PostGIS Documentation
Official PostGIS documentation
PostgreSQL Documentation
Official PostgreSQL documentation
Backup Image Source
Source code for the PostgreSQL backup container image
PostGIS Template
View the source files, default values, and chart definition