BROKABROKA
Sign inDownload CommunityRequest a demo
Documentation105 pagesOlder version — go to 1.0.1
Guides

Configuration reference

Updated 6 October 2026 · applies to 1.0.0 · Community and Commercial

Everything BROKA reads at startup comes from the .env beside your compose.yml. There is no config file to mount and no settings screen that changes how the containers boot: what is in that file is what runs.

Required

None of these have defaults. A missing value stops the container at startup and names the variable — it does not fall back to something that would let the installation run on a publicly known key.

Variable Read by Notes
POSTGRES_PASSWORD postgres, orchestrator, broker The database is never published to the host; this password guards the Compose network only.
BROKA_JWT_SECRET orchestrator Signs access tokens. At least 32 bytes — the orchestrator refuses to start on anything shorter.
BROKA_KEK orchestrator and broker Encrypts stored broker credentials. Base64 of exactly 32 bytes (AES-256). Byte-identical in both services.
BROKA_KEK_ID orchestrator and broker The label of the active key, used by rotation. Not a secret; kek-1 is fine. Byte-identical in both.
BROKA_SERVICE_TOKEN orchestrator and broker Authorises the internal API between them. Byte-identical in both.

The three "byte-identical" values are the ones worth checking twice. A mismatch is not a startup error: it surfaces later as every broker screen failing with "Valid service credentials are required to call the internal contract.", or a stored credential that cannot be decrypted.

Images and version

Variable What it does
BROKA_VERSION The tag pulled for all three BROKA images; ships pinned to 1.0.0. Keep it pinned — an upgrade should be an edit you make, not something that happens on restart.
BROKER_IMAGE The broker service's image; the Community repository by default.
ORCHESTRATOR_IMAGE The API's image; the Community repository by default.
UI_IMAGE The console's image; the Community repository by default.

Installing the Commercial images is described in the customer portal, for an organisation with a subscription.

Optional

Each has a working default in .env.example; change one only for the reason given.

Variable Default What it does
BROKA_DB_SSL_MODE prefer TLS from both services to PostgreSQL: prefer or require. The bundled PostgreSQL speaks plaintext on the private Compose network, so require only makes sense against an external PostgreSQL with TLS. Neither encrypts the database at rest.
BROKA_JWT_KEY_ID jwt-1 A name for the token-signing key, written into every token.
BROKA_JWT_PREVIOUS_ID · BROKA_JWT_PREVIOUS empty The outgoing signing key, only while you rotate it: move the current pair here, put a new one above, restart, wait one access-token lifetime (15 minutes), then clear these. Nobody is signed out. One set without the other is refused at startup.
BROKA_KEK_PREVIOUS_ID · BROKA_KEK_PREVIOUS empty The outgoing key-encryption key, only while you rotate it — see the install page. One set without the other is refused at startup.
BROKA_LICENCE_SERVER https://license.broka.dev Where a Commercial installation activates and refreshes online. Community never calls it. Blank it to switch online activation off.
BROKA_TRUSTED_PROXIES 172.16.0.0/12 Which peers the console believes about the client's address and scheme. The default covers a TLS proxy on the same host; name a proxy on another machine, or none. Without it everyone behind your proxy shares one address — one sign-in rate limit, and the proxy's address in the audit trail.
BROKA_PUBLIC_URL empty The address people open the console at, for the link in an alert notification. Empty means notifications carry no link rather than a guessed one.
BROKA_KEYSTORE_DIR /etc/broka/keystores The only directory a Kafka connection may name a keystore file in, on the broker container. Nothing is mounted there by default; empty refuses file-based keystores outright.
BROKA_METRICS_PROMETHEUS false true serves the orchestrator's own metrics for a Prometheus you run, on port 9464 inside the Compose network — never published, and nothing is pushed anywhere. Off by default because it carries no login.

Networking

Variable Default What it does
BROKA_HTTP_PORT 3000 The host port the console is published on. It is the only port BROKA publishes.

Everything else talks over the Compose network by service name — the console reaches the API at orchestrator:8080, the API reaches the broker service at broker:8081, and both reach the database at postgres:5432. None of those are published to the host, and none of them are configurable from .env: they are the shape of the deployment, not a setting.

What happens when a value is missing

Situation What you see
A required variable is absent from .env, or empty Compose refuses to start the service and names the variable.
The image is run some other way with a required value empty The container starts, checks, and exits 78 with FATAL: <VARIABLE> is not set. on stderr.
BROKA_JWT_SECRET is shorter than 32 bytes The orchestrator refuses to start and says so.
BROKA_KEK does not decode to 32 bytes The orchestrator refuses to start and says so.

That the images ship these variables blank rather than unset is deliberate. Blank is present- and-empty, which trips validation; unset would inherit whatever the image was built with, and an image that inherits its own development keys is an image that runs on publicly known secrets.

The broker service goes one step further: if it detects the development service token or the development key-encryption key in effect, it refuses to start unless the run is explicitly marked as development. It fails closed — every other case, including no profile at all, arms the check.

Not configurable, on purpose

  • The database is included. PostgreSQL runs as one of the four containers on its own volume. There is no "point BROKA at your own PostgreSQL" variable in 1.0.0.
  • One broker container serves every platform. A commercial installation does not run one container per platform; it runs one image with every platform's module linked into it.
  • TLS is not in the box. The console listens on plain HTTP inside the network and is published on one port; terminating TLS is the job of whatever sits in front.
  • No usage reporting. BROKA does not report what you do with it — no analytics, no metrics sent anywhere, nothing about your brokers, topics, queues or messages ever leaves your network.

Licence activation, and what it sends

Community needs no licence and makes no outbound calls at all.

A commercial installation is activated once, and you choose how:

  • Online — you paste an activation code from the portal, and the console makes one HTTPS call to exchange it for a signed licence, then re-checks about once a day.
  • Offline — the console produces a request you send to us, and you paste the licence we send back. An installation activated this way never calls out at all.

The online request carries exactly nine fields: the activation code, this installation's id and public key, the product, its version, the edition, the platforms present in the image, a nonce and a timestamp. It carries no broker addresses, no topic or queue names, no credentials, no user identities and no usage of any kind — and the whole request body is written into your own audit trail, so you can verify that rather than take our word for it.

The licence is verified locally, by signature. The network is how it is delivered, not what makes it valid: if our licence server is unreachable, nothing changes until the licence's own expiry.

← PreviousInstall with Docker ComposeNext →Environments