DevOps-First

⚡ VBWD

A sales platform for the digital world — SaaS subscriptions, CMS, shop, booking and a token economy on one self-hosted backend, two Vue front-ends and one plugin contract.

landing1cmsmainchatchattheme-switcheranalytics
The admin dashboard — clean clone to live in minutes.
The admin dashboard — clean clone to live in minutes.
One command

Clean clone to live in under five minutes

One image pipeline, one CI workflow, one deploy command. Adding a client is a config diff, not a release. The whole stack — backend + fe-admin + fe-user — boots on a laptop from a single recipe.

./recipes/dev-install-ce.sh

Clones all three front-end repos in the correct submodule order + backend, builds vbwd-fe-core first, brings the stack up.

./recipes/dev-install-tarot.sh

Full CE setup plus the Tarot plugin database — a worked example of bootstrapping a plugin from cold.

./deploy.sh <instance>

One deploy command per instance; multi-tenant routing means a new client is a config diff, not a fork.

Infra

Boring, reproducible infrastructure

  • Docker + Docker Compose; Gunicorn behind Nginx with path-based routing (/admin → fe-admin, / → fe-user).
  • PostgreSQL 16 + Redis 7; Alembic migrations tied to the plugin lifecycle — applied on enable, rolled back on uninstall.
  • Per-instance config (env + compose) — never hand-edited prod files; local and prod compose stay separate.
  • Uploads + plugin state on host bind-mounts; the backend is the only writer to ${VAR_DIR}/plugins/.
The gate

Tests are the merge gate

Every new model / service / route lands with unit tests in the same PR. make test is the gate; CI re-runs on every push. 1,851+ passing tests across pytest, Vitest and Playwright. No tests, no merge.

It's all on GitHub. Read the code →