Skip to content

Managed Postgres

A per-customer managed PostgreSQL instance running on the CloudNativePG operator. Each managed Postgres has its own storage volume, backups, and credentials.

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.

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).
  • Daily automated base backups.
  • Retention by tier: Hobby 7 days, Dev 7 days, Pro 30 days, Business 90 days.

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.

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_URL reconnect 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.

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.

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.

TierStorage per DBKind
Hobby100 MB (shared cluster)Shared
Dev1 GBDedicated
Pro10 GBDedicated
Business10 GBDedicated

Tier is determined by your account’s plan.

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.

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:

PlanMax databases
Hobby1
Dev1
Pro3
Business5

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.

  • PostgreSQL version: 16.3.
  • Your plan caps how many databases you can create across all your projects (see Plans and caps).