Quickstart
Three commands start the stack and print a one-time setup link. No tenant to connect yet? Try the sample tenant first. You need Docker with Compose, and uv to install the pbmb command. The stack listens on 127.0.0.1 only, so put a reverse proxy with TLS in front of it before anyone else opens it (the Deploy part has one guide per target).
1. Write the deployment
Section titled “1. Write the deployment”uv tool install powerbi-metrics-bookpbmb init ./powerbi-metrics-book-deployment --public-base-url https://metrics.example.comcd ./powerbi-metrics-book-deploymentReplace the address with the https address people will open. pbmb init writes compose.yml, .env with new random passwords, access/ for your own policies, and an AGENTS.md for your agent. It changes nothing else and does not call the api.
Keep a copy of .env somewhere safe. Without it the database cannot be reached again. It is git-ignored, so do not commit it.
2. Start the stack
Section titled “2. Start the stack”docker compose up -dThe first start pulls the image, creates the database and applies its migrations.
3. Print the setup link
Section titled “3. Print the setup link”docker compose exec api server setup-linkThe command prints an address. Open it in your browser. It works once, for 24 hours. Run the command again for a new one: each new link ends every earlier link and setup session.
The api never writes the link to its log, so only someone who can run commands in the container can start the setup. Once an admin exists there is no setup link.
Then the setup
Section titled “Then the setup”The link opens the setup: a guide with a step rail, where each step says what to do, gives every value to copy and checks the result with a real call before the next step. Follow the Set up part in the same order. It uses the same words as the setup screens.
Both of these must pass before you open the link:
docker compose pscurl -s http://127.0.0.1:3000/healthdocker compose ps shows api, worker, postgres and cerbos as healthy. The curl answers {"ok":true,...} with the version. If the api is not healthy, read docker compose logs api: it names the bootstrap value that is missing or wrong.