# NextChair Booking app as an alternative to Booksy ## VPS deployment (multi-business) One-time setup on a fresh VPS with Docker and the Compose plugin already installed. Run everything from the repo's checkout directory. ```bash # 1. Clone the repo at the path you intend to keep it at — STACKS_DIR # below must be this exact absolute path, since containers shell # `docker compose` back out to the HOST's dockerd via a mounted # socket (see stacks/infra/compose.yaml and manager/README.md for why). git clone /opt/nextchair cd /opt/nextchair # 2. Shared Docker network every stack attaches to. docker network create next-chair-edge # 3. Shared infrastructure: MySQL, Caddy (reverse proxy + automatic TLS), # Dockge (stack management UI, http://:5001). cp .env.infra.example stacks/infra/.env # edit stacks/infra/.env — MYSQL_ROOT_PASSWORD, ACME_EMAIL, and set # STACKS_DIR to this exact clone path, e.g. /opt/nextchair/stacks docker compose -f stacks/infra/compose.yaml --env-file stacks/infra/.env up -d # 4. Build the shared business image (re-run this after every code # update — see stacks/blake-heritage/compose.yaml's own note). docker build -t nextchair-app:latest . # 5. The management UI (manager/) — this is what you'll use to add # businesses from here on, not the by-hand steps in stacks/infra/ # compose.yaml's header (those exist only as a fallback/reference). cp manager/.env.example stacks/manager/.env # edit stacks/manager/.env — MANAGER_EMAIL/PASSWORD_HASH, MANAGER_SESSION_SECRET, # MYSQL_ROOT_PASSWORD (same value as step 3), and STACKS_DIR (same as step 3) docker compose -f stacks/manager/compose.yaml --env-file stacks/manager/.env up -d --build ``` Then, per business, point its domain's DNS at the VPS and use the management UI (`https://` — add a Caddy site for it the same way as any business, see `stacks/infra/sites/.gitkeep`) to add it: name, slug, domain — it creates the database, generates secrets, starts the container, and runs migrations for you. Finish setup by visiting `https:///install`. To ship a code update to every business: `git pull`, rebuild the image (step 4), then use each business's **Update** button in the management UI (or `docker compose up -d --force-recreate` in its `stacks//` directory) to recreate it against the new image.