Self-hosted CMS with an integrated visual page builder. The app serves the public website, admin editor, CMS API, published pages, and uploaded media from one Bun server. Supports Postgres and SQLite — selected by DATABASE_URL.
The site is currently private and the final public repository/image name is still work in progress. Deployment files are prepared for a published GitHub Container Registry image; replace placeholder image names with the final package before the first public release.
Install dependencies:
bun installStart with zero external dependencies (SQLite, no Docker required):
bun run devOr run the full stack in containers (production-like Dockerfile + Postgres + persistent volumes):
docker compose -f compose.prod.yml -f compose.build.yml up --buildOpen:
http://localhost:3001/adminThe first visit creates the site and admin account.
bun run dev defaults to SQLite at .tmp/dev.db. Set DATABASE_URL=postgres://... to use Postgres instead.
For a VPS/self-host install with bundled Postgres:
cp .env.production.example .env
docker compose -f compose.prod.yml up -dFor a VPS/self-host install with SQLite (no separate Postgres process):
docker compose -f compose.prod.yml -f compose.sqlite.yml up -dTo put HTTPS in front (Caddy + Let's Encrypt, auto-provisioned), layer compose.tls.yml on top of either DB mode and set DOMAIN in .env:
# Postgres + TLS
docker compose -f compose.prod.yml -f compose.tls.yml up -d
# SQLite + TLS
docker compose -f compose.prod.yml -f compose.sqlite.yml -f compose.tls.yml up -dWithout compose.tls.yml, the app is reachable on http://server-ip:3001/admin. With it, only Caddy is exposed (ports 80 / 443) and the cert is auto-provisioned for ${DOMAIN} on the first request.
Production servers should normally pull the published Docker image configured in .env.production.example. Developers can build locally from source with:
docker compose -f compose.prod.yml -f compose.build.yml up -d --buildFor managed hosts, deploy the Dockerfile from GitHub or a published image and connect it to managed Postgres with DATABASE_URL.
Deployment docs:
- Production Docker image
- VPS Docker Compose
- SQLite deployment
- HTTPS via Caddy
- Managed hosts
- Backup and restore
- Release and image publishing workflow
Back up both:
- Database — Postgres (
pg_dump) or SQLite (copy the.dbfile, or use Litestream for continuous replication) - uploads directory or uploads volume
Do not run docker compose -f compose.prod.yml down -v unless you intentionally want to delete CMS data.
bun run build
bun test
docker build -t page-builder-cms:local .
docker compose -f compose.prod.yml pull app
curl http://localhost:3001/health