Managed Postgres
What it is
Section titled “What it is”A per-customer managed PostgreSQL instance running on the CloudNativePG operator. Each managed Postgres has its own storage volume, backups, and credentials.
How to use
Section titled “How to use”See the Add a managed Postgres database guide to provision a database, and the Attach a database to an app guide to connect it. Databases are not injected automatically — each app must be explicitly attached via the Database card on the app detail page. Once attached, DATABASE_URL is injected and the app restarts.
Connection URI
Section titled “Connection URI”Format: postgres://<user>:<password>@<host>:5432/<database>?sslmode=require
- Credentials are generated by uploy and never displayed in clear text after creation.
- To rotate: recreate the attachment (creates a new role and password; the old one is revoked).
Backups
Section titled “Backups”- Daily automated base backups.
- Retention by tier: Hobby 7 days, Dev 7 days, Pro 30 days, Business 90 days.
Backup download (Hobby)
Section titled “Backup download (Hobby)”Hobby databases run on a shared cluster, and nightly backups are stored as a single .sql.gz artifact per day. You can download any backup within the retention window from the database’s Backups list — click Download to receive a presigned URL valid for 5 minutes. See the Download a backup guide.
Dedicated tiers (Dev / Pro / Business) use continuous physical backups (base backups + WAL archiving), which don’t reduce to a single file. For those, use PITR to restore into a parallel cluster instead.
Point-in-time recovery (Pro and Business)
Section titled “Point-in-time recovery (Pro and Business)”Pro and Business tiers can restore to any timestamp within the backup retention window. Requesting a restore creates a parallel cluster at that point in time while leaving the current database untouched. You then decide whether to:
- Promote — swap the parallel cluster in as the live database. Apps using the
DATABASE_URLreconnect to the restored data; the previous cluster is deleted. - Discard — delete the parallel cluster; the current database is unchanged.
Only one restore can be pending per database at a time. See the Restore to a point in time guide.
Database status
Section titled “Database status”The dashboard shows one of four statuses for each managed Postgres instance:
- Creating — CNPG is provisioning the cluster. Usually clears in under a minute for new Pro/Dev/Business databases.
- Healthy — all instances are Ready and WAL archiving is working. Backups and restores are available.
- Failed — CNPG reported an unrecoverable state (e.g.
WALArchivingFailing, provision timeout). Hover the badge for the reason. Contact support before taking further action. - Deleting — soft-delete initiated; CNPG is tearing down the cluster. The row disappears once teardown completes.
Hobby-tier databases do not have their own cluster — they share a common instance — and show as Healthy once the role + database have been created.
Backup status
Section titled “Backup status”Each backup row shows one of three statuses:
- Running — CNPG is streaming the backup to object storage.
- Succeeded — upload finished; the backup is restorable until the tier’s retention window expires.
- Failed — the upload or WAL dependency failed. Hover for the phase/error text.
Status updates live on the dashboard — no refresh needed.
| Tier | Storage per DB | Kind |
|---|---|---|
| Hobby | 100 MB (shared cluster) | Shared |
| Dev | 1 GB | Dedicated |
| Pro | 10 GB | Dedicated |
| Business | 10 GB | Dedicated |
Tier is determined by your account’s plan.
Multiple databases per environment
Section titled “Multiple databases per environment”Pro and Business plans let you run more than one Postgres database inside a single environment. Each database has:
- Name — a human-readable label you pick (up to 32 characters), e.g. Main Postgres or Analytics.
- Slug — a short identifier derived from the name (e.g.
main,analytics). The slug is what shows up in the Databases list and in each app’s attach picker. It must be unique within the environment.
Creating additional databases
Section titled “Creating additional databases”Open the project, switch to the environment, open the Databases tab, and click + Add Postgres. The dialog asks for a name; the slug is auto-filled from the name and you can edit it. When you submit, provisioning starts in the background.
Tier caps still apply account-wide:
| Plan | Max databases |
|---|---|
| Hobby | 1 |
| Dev | 1 |
| Pro | 3 |
| Business | 5 |
Attaching apps
Section titled “Attaching apps”Each app can still attach to at most one database at a time. In the app’s Database card, pick the DB by its slug from the dropdown. The DATABASE_URL environment variable always points to the attached DB.
Limits & defaults
Section titled “Limits & defaults”- PostgreSQL version: 16.3.
- Your plan caps how many databases you can create across all your projects (see Plans and caps).