The same codebase runs two ways. Cloudflare Workers with D1 is the cheapest; Docker with SQLite runs anywhere.

Cloudflare Workers

Free tier costs nothing to run: 100k requests/day, 5 million D1 rows read/day, 100k rows written/day, and 5 GB of storage.
1

Create the database

Paste the printed database_id into wrangler.toml.
2

Set secrets

3

Deploy

The database schema migrates automatically on the first request.
Mark filterable fields as indexed. An unindexed filter scans a whole type and burns your daily rows-read budget.

Docker

For any VPS. One volume holds the SQLite database.
Configuration is via environment variables: JWT_SECRET (required), SETUP_TOKEN, KEYGEN_PASSWORD, DATABASE_PATH (default /data/cms.db), and PORT (default 3000).
For off-site backups on a VPS, add a Litestream sidecar that streams the SQLite file to any S3-compatible bucket.