Configuration reference
The environment variables an operator sets to configure Bonita Process Designer, where to set them in each distribution, their defaults, and the values the shipped Docker files set.
Bonita Process Designer is configured through environment variables. Both distributions run the same Java application, which serves the editor and the API on a single port.
|
Only |
Where to set a variable
- Standalone distribution
-
Set the variable in
config.env, next tostart.sh, then restart. Put each comment on a line of its own:start.batreads everything after the=sign as the value.config.env.examplelists most of the optional variables with their defaults, but not all of them:AUTH_MODE,CORS_ORIGIN,AUTO_SNAPSHOT_EVERY_N_SAVESandDATA_RETENTION_SWEEP_INTERVAL_MS, for example, are missing. Add a line for them yourself. - Docker distribution
-
The application only receives the variables that the
appservice ofdocker-compose.ymllists in itsenvironment:.-
For the variables that
docker-compose.ymlalready reads from your environment —TLS_DOMAIN,CORS_ORIGIN,APP_FRONTEND_URL,USE_HTTPS,LOG_LEVEL,LOG_LEVEL_ROOTandLOG_LEVEL_TOMCAT_HTTP— set the value in a.envfile next todocker-compose.yml, or in the shell that runsdocker compose. The same goes forPD_IMAGEandPD_VERSION, which choose the application image rather than configure the application: see Choose the image and its version. -
For any other variable, add a line to the
environment:of theappservice, for example- JAVA_OPTS=-Xmx512m. Setting it in.envor in the shell alone has no effect.
Then run
docker compose up -d: Compose recreates the containers whose configuration changed.docker-compose.http.ymlreads none of these variables from your environment, apart fromPD_IMAGEandPD_VERSION: add every other variable you need to theenvironment:of itsappservice. -
Environment variable reference
Database and network
| Variable | Purpose | Default |
|---|---|---|
|
JDBC URL of the PostgreSQL 16+ database, in the form |
(none) |
|
PostgreSQL user. Required by the standalone start scripts. |
|
|
PostgreSQL password. Required by the standalone start scripts. |
|
|
The single HTTP port of the application, serving both the editor and the API. |
|
|
Docker distribution only, read by the |
|
|
Comma-separated list of the exact origins allowed to call the application with a user’s session, other than its own pages, whose requests are always accepted. Set it in every deployment, to the address users type in the browser. See CORS security. |
(none): a fallback derived from the request and |
|
When |
|
|
Set to |
|
|
The public URL of the application. The shipped files set it, and the diagnostic archive reports it, but in version 1.1.0 no behavior of the application depends on it. |
(none) |
|
Proxy URL, in the form |
(none) |
|
Not read by the application: setting it has no effect. The shipped Docker proxy lines and |
(none) |
|
The |
|
|
Application
| Variable | Purpose | Default |
|---|---|---|
|
Authentication mode: |
|
|
Folder holding the |
|
|
Options passed to the Java virtual machine. A value replaces the default, heap ceiling included: always include an |
|
|
Records an automatic version of a diagram every n saves. |
|
|
Address of the AI service. Do not change it unless Ofelia instructs you to. |
(set by the distribution) |
Data retention
Two scheduled tasks delete old AI data. A sweep, once a day by default, deletes the finished AI jobs and the AI quota usage events that are past their retention. A purge, every hour, removes the result of the successful AI jobs older than AI_JOB_RESULT_TTL_HOURS. These variables set how long the data is kept. Expired sessions are deleted separately, every minute, and none of these variables applies to them.
| Variable | Purpose | Default |
|---|---|---|
|
Hours a successful AI job keeps its result, the generated BPMN or the analysis. After that, the job keeps its status but no longer its result. Raise it, for example to |
|
|
Days a finished AI job is kept before it is deleted. |
|
|
Days an AI quota usage event is kept. Keep it at 30 days or more, the length of the quota window: below that, the quota stops counting usage it should still count. See Manage AI quota. |
|
|
Turns the daily sweep on or off. With |
|
|
Interval between two sweeps, in milliseconds. The first sweep runs one interval after startup. |
|
Logging
| Variable | Purpose | Default |
|---|---|---|
|
Verbosity of the application’s own log. Raise to |
|
|
Verbosity of everything else: framework, database driver, and other libraries. Raise only when the problem looks lower-level than the application itself. A few framework loggers are pinned separately and are not affected by it — see |
|
|
Verbosity of Tomcat’s HTTP protocol loggers, pinned independently of |
|
|
Where to write the log file. Set it to place the log on a dedicated partition; the directory must exist and be writable. In the Docker distribution, an empty value turns off the copy of the log kept inside the |
|
|
Size at which the log file rolls over. |
|
|
Days of gzipped archives to keep. |
|
|
Total size the log file and its archives may occupy. Once reached, the oldest archives are deleted first. |
|
|
Setting Use it only briefly, and treat the log it produces as sensitive: it is no longer safe to send to Support unreviewed. Raising |
|
In the Docker distribution, the log file is a copy kept inside the |
Values set by the shipped Docker files
The Compose files of the Docker archive set some variables to values that differ from the application defaults above, because the application runs behind the caddy proxy.
| Variable | docker-compose.yml |
docker-compose.http.yml |
|---|---|---|
|
|
|
|
|
(not set) |
|
|
(not set): |
|
|
(not set) |
|
|
|
|
The |
Same |
|
|
Same |
|
Shipped commented out |
(not set) |
The Docker image itself sets JAVA_OPTS=-Xmx192m.
AI configuration
AI diagram generation is configured by an administrator in the application, not through environment variables. After registration, an Admin enters one or more LLM provider keys under Admin → Settings. Bonita Process Designer does not store these provider keys in its own database — it persists only a per-provider "configured" flag so the admin UI can show which providers have a key. Use a dedicated, scoped key per provider and rotate keys periodically.
|
Set spend caps and usage limits in each provider’s own dashboard. The application’s per-group AI quota is a complementary control, not a substitute for a provider-side spend cap. |
Secrets and the encryption key
There is no shared session-signing secret to configure on Bonita Process Designer. Session identifiers are random and stored server-side in PostgreSQL, so the security of session data depends on protecting the database and serving over HTTPS — not on a secret you set.
Likewise, LLM provider keys are never persisted locally (see AI configuration), so there is no application-level key-encryption secret to manage. Keep your PostgreSQL credentials strong and unique, and keep the database on a private network segment reachable only by the application. In the Docker distribution, set the database password in the .env file before the first start: see Security notes for the proxy and the stack.
CORS security
The application always accepts requests from its own pages. CORS governs the requests made from another origin with a user’s session. When CORS_ORIGIN is set, the application accepts them only from the origins it lists. When it is not set, the application falls back to an origin derived from the request and FRONTEND_PORT. That fallback is not meant for production: always set CORS_ORIGIN.
The shipped docker-compose.yml sets CORS_ORIGIN for you, to https://localhost or to the value you give it. Everywhere else, in the standalone distribution, with the Docker HTTP opt-out, or behind your own reverse proxy, always set CORS_ORIGIN to the exact origin that users type in the browser, and add any other site that must call the application:
# Single explicit origin
CORS_ORIGIN=https://pd.example.com
# Several origins (comma-separated)
CORS_ORIGIN=https://pd.example.com,https://portal.example.com
|
Never use a wildcard origin with credentials. Wildcard CORS is a CSRF vector. Always list exact origins. |
TLS hardening
In the Docker distribution, TLS is on by default: the shipped caddy proxy terminates HTTPS on port 443, redirects port 80 to it, and the shipped docker-compose.yml sets USE_HTTPS=true. Do not add a second TLS proxy in front of it. To replace its self-signed certificate, see Use your own certificate.
The standalone distribution and the Docker HTTP opt-out serve plain HTTP. To serve them over HTTPS, terminate TLS in front of the application with a reverse proxy (such as nginx, Traefik or Caddy) or a load balancer, rather than exposing the application directly. Then:
-
Set
USE_HTTPS=trueso the session cookie is issued with theSecureflag. It also sets the cookie attributeSameSite=None. Leaving itfalsebehind HTTPS would emit a non-Secure cookie. -
Always forward
X-Forwarded-Protofrom the proxy. Also forwardX-Forwarded-Host, or preserve the originalHostheader, so that the application knows its public origin. -
Forward WebSocket connections on
/ws: the proxy must pass theUpgradeandConnectionheaders of the request. Without them, users do not see each other’s changes in real time. With nginx, for example, add these lines to thelocationthat proxies the application:proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; -
Set
CORS_ORIGINto the public HTTPS origin, as described in CORS security.
Over HTTPS, the application also sends a Strict-Transport-Security header with a one-day lifetime, so browsers keep using HTTPS for its host.
For the deployment-mode guidance, see Installation and Run with Bonita Runtime.