Skip to content

PostgreSQL extensions ​

Extensions are packages that add capabilities to a PostgreSQL server — extra data types and operators, cryptographic functions, query statistics and more. On Frostmoln managed databases extensions are a PostgreSQL offer, served from the platform's own extension catalog. MySQL instances have none.

How it works ​

  • Names are catalog values, not free strings. Only names the platform's extension catalog advertises can be enabled on an instance. An unknown name gets a typed HTTP 400 that names it — unknown extension: <name> — and a name the catalog holds but does not offer for the instance's PostgreSQL version is refused too. Any authenticated tenant can read the catalog at GET /api/v1/databases/extensions (like the types/versions/flavors reads). The Extensions tab in the portal offers a catalog picker, and the Terraform provider checks names against the live catalog at plan time.
  • One operation at a time per instance. While an operation runs, another extension operation is refused with HTTP 409: another operation is already running on this instance; extensions can be applied only while no backup, restore or other operation is in flight — please retry once it completes. Extensions are also refused while a backup or restore is in flight.
  • The platform records outcomes once, at the end. While an apply runs, GET /api/v1/tenants/:tenant_id/databases/:id/extensions keeps showing the asked-for revision (extensionRevision) with no new entries. Per-extension entries — name, status enabled, removed or failed, plus optional detail and updatedAt — appear only when the operation concludes, and a failed apply is recorded with the platform's reason. There is no in-flight per-extension progress.

The catalog ​

The seed set the v1 catalog shipped with:

ExtensionPostgreSQL versionsRequires restart
timescaledb16, 17, 18Yes
pg_stat_statements14, 15, 16, 17, 18Yes
pg_trgm14–18No
pgcrypto14–18No

timescaledb and pg_stat_statements need shared_preload_libraries, which takes effect at startup — so enabling either restarts the instance. The catalog grows as validated platform-catalog values are added.

Availability and access ​

  • Open to every tenant. The recorded extension state is visible to anyone who can see the instance, and every tenant can enable or disable extensions on its own instances.
  • Highly available instances are excluded for now. The request is refused with HTTP 409: extensions are not yet available for highly available instances; coordinated node sequencing is not built yet
  • Instances created before extensions shipped cannot enable them. The in-guest pieces the apply needs are fixed at create time, and the platform does not refuse the request up front: an enable on such an instance is accepted and then recorded as failed entries on its ledger. The treatment is rebuild-to-enable — create a new instance and migrate your data (the Managed Databases page covers provisioning and migration).

Using it ​

The endpoint is POST /api/v1/tenants/:tenant_id/databases/:id/extensions. The body carries the direction — "op" is "install" to enable, "remove" to disable — and the list of extension names, up to 8 per operation:

json
{
  "op": "install",
  "extensions": ["timescaledb"]
}

A 202 comes back with an operationId, the status applying_extensions and the extensionRevision this ask staged. Until the operation concludes, the ledger keeps showing exactly that revision with no new entries for it; when it concludes, the entries appear (see above). Two checks the platform makes on the spot: the instance must be running — any other state is refused with 409 — and disabling an extension the instance does not have is refused with 400.

The fm CLI speaks enable and disable and does the waiting for you: fm database postgres instance extensions enable|disable waits for the operation to conclude and verifies the recorded outcome against it (pass --no-wait to return as soon as the request is accepted), and ... extensions list shows the recorded ledger whenever you ask.

In Terraform, declare the extensions set on the frostmoln_postgres_instance resource — the generated reference documents the attribute.

Limits in one place

  • Extensions exist on PostgreSQL only — MySQL instances have none.
  • Operations are accepted only while the instance is running.
  • One operation at a time per instance.
  • Up to 8 names per operation.