Skip to main content

Launch a CMS: A Headless Content Platform on Your Own PostgreSQL

· 4 min read
FoundryDB Team
Engineering @ FoundryDB

Standing up a headless CMS usually means a weekend. Provision a database. Pick a CMS. Wire it to the database with a connection string you paste into an environment file. Open a firewall rule. Mint an API token. Then, finally, model your first collection. The content platform you actually wanted was always one good afternoon of plumbing away.

The Launch a CMS stack collapses that into one button. You get a production headless CMS running on your own PostgreSQL, EU-resident, in minutes, with nothing to wire by hand.

CMS stack composition & launch
RUNNING Stack wired · headless CMS live
Stack Templatecmslaunch ⇉PostgreSQLdatabaseDirectusDATABASE_URL ← dbserve →Content APIREST / GraphQL
Template · launchPostgreSQL (database)Directus (headless CMS)wiring (DATABASE_URL injected)

What you launch

Pick Launch a CMS from the catalog and the platform stands up two things and connects them:

  • Your own PostgreSQL. A managed PostgreSQL 17 database that is the durable home for your content. Not a black box. Real tables you can query, back up, and connect other tools to.
  • Directus, attached to it. Directus is an open-source headless CMS that turns that database into a content backend. It gives editors a polished admin app and exposes every collection as instant REST and GraphQL APIs.

The app already knows the database address and credentials. The connection string is injected as DATABASE_URL during launch, so by the time the stack reaches Running there is nothing left to configure. You open the URL, sign in to the admin app, and model your first collection. That collection is a real table in your PostgreSQL the moment you save it.

Content in a database you own

The point of a headless CMS is to keep content separate from the front end that renders it: model it once, edit it in an admin UI, and pull it over an API into any site or app. Directus does exactly that, and because it speaks plain SQL to a database you own, your content never leaves your reach.

Create an articles collection in the admin UI, add a few items, then connect to the database directly:

psql "host=<db-host> user=<db-user> dbname=defaultdb sslmode=verify-full" \
-c "SELECT title FROM articles;"
        title
----------------------
My first article
A second article
(2 rows)

That is your content, as plain rows, in a Postgres service that is yours to scale, back up, and query. No proprietary store, no export job, no lock-in. And the same collection is already a live REST endpoint:

curl "https://my-cms-app.foundrydb.com/items/articles" \
-H "Authorization: Bearer <directus-access-token>"

The same data is available over GraphQL at /graphql on the same host. You did not write a content API. You modeled a collection, and the API was already there.

Trust, built into the launch

Like every stack, the CMS launch carries the platform guarantees in the flow itself.

A hard cost preview before you launch. You see exactly what the stack costs, the database plus the app, broken down per resource, before anything is provisioned. You accept a number, then the launch runs.

Atomic rollback. A stack is two resources coming up together. If either step fails, the whole launch rolls back cleanly. You end up with the finished CMS or with nothing, never with an orphaned database quietly costing you money.

EU data residency. The database, the Directus app, and the traffic between them all stay within the platform's European footprint. Residency is where the platform runs, not a setting you remember to flip.

Launch one

# 1. Preview the cost
curl -X POST https://api.foundrydb.com/stacks/preview \
-H "Authorization: Bearer $FOUNDRYDB_TOKEN" \
-H "Content-Type: application/json" \
-d '{"template_name": "cms"}'

# 2. Accept the previewed total and launch
curl -X POST https://api.foundrydb.com/stacks \
-H "Authorization: Bearer $FOUNDRYDB_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "my-cms", "template_name": "cms", "accepted_monthly_cost": 51.00}'

Poll the stack until it is Running, open the endpoint_url, and you are editing content. Or do the whole thing from the Stacks catalog in the console with one click.

For the full walkthrough, including first-admin login, defining a collection, hitting the auto-generated API, and tearing the stack down atomically, read the Launch a CMS tutorial.

Stop wiring a CMS to a database. Launch the finished thing, on PostgreSQL you own, in Europe, today.