Configuration¶
Most installations can keep the defaults. Settings come from environment variables and an env file:
| How you start Fluksio | Env file |
|---|---|
fluksio serve |
<data-dir>/env, unless FLUKSIO_ENV_FILE names another file |
| Docker with the Makefile | .env in this repository's root |
Exported variables override the file. fluksio serve flags override both.
For CLI installations, select storage with --data-dir, FLUKSIO_HOME or
--global; see The fluksio command.
Storage¶
| Variable | Default | Purpose |
|---|---|---|
DATA_DIR |
flow-data; CLI uses ./.fluksio or ~/.fluksio with --global |
base directory for instance data |
DATABASE_URL |
SQLite at $DATA_DIR/fluksio.db |
SQLite URL; other database engines are unsupported |
FLOWS_DIR |
$DATA_DIR/flows |
flow git repository |
SECRETS_FILE |
$DATA_DIR/secrets.enc |
encrypted credentials |
ALERTS_FILE |
$DATA_DIR/alerts.json |
alert channels and rules |
WEBPUSH_FILE |
$DATA_DIR/webpush.json |
push keys and browser subscriptions |
PROVISIONERS_FILE |
$DATA_DIR/provisioners.json |
optional worker provisioning configuration |
DEVICES_FILE |
$DATA_DIR/devices.json |
device credential nonces, outside the flow repository |
PANELS_FILE |
$DATA_DIR/panels.json |
panels of an instance from before devices, moved into devices on first start and renamed .migrated |
OAUTH_PRIVATE_KEY_FILE |
$DATA_DIR/oauth-key.pem |
agent and worker signing key |
CLOUD_CONFIG_FILE |
$DATA_DIR/cloud.json |
optional portal enrollment |
AI_CONFIG_FILE |
$DATA_DIR/ai.json |
optional assistant provider configuration |
CHATS_DIR |
$DATA_DIR/chats |
assistant transcripts |
NODE_VENV |
auto |
interpreter for node code |
Changing DATA_DIR moves the derived paths unless you set them individually.
Docker stores instance data under /data on the app-flow-data volume.
NODE_VENV value |
Behavior |
|---|---|
auto |
keeps an existing managed venv; otherwise uses the installation's venv when available, or creates a managed one |
managed |
creates a venv under DATA_DIR; the Modules screen manages its packages |
| interpreter or venv path | uses the specified Python environment |
Docker uses managed. When Fluksio adopts your own venv, the Modules screen
is read-only; install packages into that environment yourself.
Back up the whole data directory and the persistent SECRET_KEY. The single
container keeps both, and its Redis, on the /data volume. The operator stack
under docker/ keeps .env and app-flow-data, plus app-redis-data for
live state. Compose prefixes volume names with the project name.
Keep runtime files on persistent storage so rebuilds preserve credentials,
pairings and subscriptions.
Live state¶
| Variable | Default | Purpose |
|---|---|---|
REDIS_HOST |
unset | unset uses memory, or the image's own Redis in Docker; a Redis host enables persistent flow state |
REDIS_PORT |
6379 |
Redis port |
Live state includes message values, node memory and queued work. In-memory
state is lost on restart. The Docker image starts a Redis of its own with
append-only persistence in /data/redis whenever REDIS_HOST is unset. Set
REDIS_HOST to use an external one instead, as the operator stack does with
its app-redis-data volume. The default sync policy may lose about a second of
recent writes after a power cut.
Accounts and access¶
| Variable | Default | Purpose |
|---|---|---|
SECRET_KEY |
generated | signs sessions and encrypts the secrets store; the CLI persists it and make init writes it to .env |
ACCESS_TOKEN_EXPIRE_MINUTES |
11520 (8 days) |
session-token lifetime |
FIRST_SUPERUSER |
unset | initial administrator email; the CLI creates an account if needed |
FIRST_SUPERUSER_PASSWORD |
unset | initial password; the CLI generates and prints one if needed |
FRONTEND_HOST |
http://localhost:5173, http://localhost:8000 in Docker |
the address people and devices reach the instance at; panel links, mails and the OAuth issuer use it |
BACKEND_CORS_ORIGINS |
[] |
allowed origins, as comma-separated URLs or a JSON list; FRONTEND_HOST is also allowed |
FORWARDED_ALLOW_IPS |
127.0.0.1 |
trusted proxies; Docker adds 172.16.0.0/12 |
SIGNUP_ENABLED |
false |
allows account creation from the login page; otherwise use Admin → Users |
Keep your secret key
Changing SECRET_KEY signs everyone out and makes existing encrypted
secrets unreadable. Back it up with your data.
Interface address¶
The image serves the interface and the API on one origin, so the interface
calls the API as a path on whatever address served it. One build works behind
any port, hostname or reverse proxy. FRONTEND_DIST points at the built
interface and is set by the image. A checkout leaves it empty and runs the Vite
dev server, which needs its origin in BACKEND_CORS_ORIGINS.
Image options¶
The EXTRAS build argument picks the optional features built into the image,
comma separated. Empty, the default, is the minimal engine.
| Extra | Adds |
|---|---|
mqtt |
the MQTT node |
influx |
the InfluxDB node |
email |
outbound mail, such as password resets |
sentry |
error reporting to SENTRY_DSN |
ml |
numpy, for the mlp node |
server |
all of the above |
A node whose extra is missing says so on the canvas. The same names work as
pip extras, such as pip install 'fluksio[mqtt]'. Connector packages built
with make connectors are installed into the image too.
Environment¶
| Variable | Default | Purpose |
|---|---|---|
ENVIRONMENT |
local |
local, staging or production |
PRIVATE_API_ENABLED |
false |
test endpoints; also requires ENVIRONMENT=local |
API_DOCS_ENABLED |
false |
opens /docs, /redoc and /api/v1/openapi.json to network callers outside production |
TZ |
host timezone; Docker defaults to UTC |
timezone used by cron schedules |
API documentation is available to loopback callers outside production.
API_DOCS_ENABLED=true opens it to other callers, as the Docker development
stack does. Production disables it entirely. Staging and production also
refuse changethis values for the session key or administrator password.
Set TZ in .env for schedules that should follow local time, such as
Europe/Berlin. make up, make update and make dev warn when .env lacks
it, or any other key .env.example lists that Compose would otherwise default.
Engine and resources¶
| Variable | Default | Purpose |
|---|---|---|
FLOW_MAX_WORKERS |
4 |
local node-code subprocesses |
FLOW_MAX_CASCADES |
4 |
concurrent live message cascades |
FLOW_MAX_RUNS |
4 |
concurrent batch runs |
FLOW_NODE_TIMEOUT |
0 |
maximum node silence in seconds, unless the node overrides it; 0 disables |
FLOW_CPUS |
0 |
CPU budget; 0 detects cores and reserves two for the engine |
FLOW_GPUS |
0 |
local GPU count; 0 counts the engine's CUDA_VISIBLE_DEVICES, or NVIDIA device nodes without it |
FLOW_RAM |
0 |
memory budget in MB; 0 detects host/container memory and reserves 1 GiB |
FLOW_WORKER_MAX_RSS_MB |
0 |
retire a local worker above this memory use after a call; 0 disables |
FLOW_NODE_STOP_TIMEOUT |
5 |
seconds a node gets to stop during a rebuild before the rebuild moves on |
FLOW_PIPELINE_REBUILD_WAIT |
15 |
seconds a request waits for a running whole-pipeline rebuild before it gets a 503 |
FLOW_REBUILD_WAIT |
5 |
the same for a single flow's rebuild, such as a deploy |
FLOW_RESTART_BACKOFF |
[1,5,30,60] |
seconds between restarts of a crashed node loop; the last step repeats |
FLOW_CANCEL_GRACE |
5 |
seconds a cancelled node loop gets to stop before it is abandoned |
OBS_RETENTION_DAYS |
30 |
retention for metrics, events and run records |
The three concurrency limits must be at least 1. They also have CLI flags:
--max-workers, --max-cascades and --max-runs. When FLOW_MAX_WORKERS or
FLOW_MAX_CASCADES is more than four times the machine's core count, the
engine logs a warning at startup and uses the value anyway. Resource flags are
--gpus, --ram and --worker-max-rss.
Nodes with declared resources are scheduled against the available budget. Undeclared nodes use the shared pool and receive thread caps. Attached workers report their own inventory; the engine's resource settings describe only its own machine. See Remote workers and the Workers screen.
When the engine runs with CUDA_VISIBLE_DEVICES, a node's card is named the
way that list names it, so under 2,3 the first card is device 2. UUID and
MIG entries are passed on as written.
Artifacts¶
| Variable | Default | Purpose |
|---|---|---|
MAX_ARTIFACT_BYTES |
2147483648 (2 GiB) |
upload limit; 0 removes it |
ARTIFACT_GC_INTERVAL_S |
3600 |
cleanup interval; 0 disables |
ARTIFACT_GC_GRACE_S |
3600 |
minimum age before cleanup |
ARTIFACT_VOLATILE_DIR |
auto-detected | where local workers write live frames, under /dev/shm or the temporary directory |
ARTIFACT_VOLATILE_BYTES |
50331648 (48 MiB) |
live-media ring size, in the engine's memory and again in that directory; 0 stores volatile saves durably |
Cleanup removes durable artifacts no longer referenced by recorded runs or
current messages, and pauses while a run is active. Volatile artifacts live in
a bounded ring in the engine's memory, and the oldest disappear as it fills.
Recorded run outputs are copied into durable storage. A worker in the engine's
container writes its frames to ARTIFACT_VOLATILE_DIR instead, which the
engine trims to the same size every few seconds. If workers publish frames
under Docker, raise shm_size with the ring size.
Agents¶
| Variable | Default | Purpose |
|---|---|---|
MCP_ENABLED |
false |
enables /mcp and OAuth client registration; .env.example sets it to true |
MCP_TOKEN_EXPIRE_MINUTES |
60 |
access-token lifetime |
MCP_REFRESH_EXPIRE_DAYS |
30 |
refresh-token lifetime |
OAUTH_CODE_EXPIRE_SECONDS |
60 |
authorization-code lifetime |
See Agents over MCP.
Mail and monitoring¶
Password-reset mail requires SMTP_HOST and EMAILS_FROM_EMAIL.
| Variable | Default |
|---|---|
SMTP_HOST |
unset |
SMTP_PORT |
587 |
SMTP_USER / SMTP_PASSWORD |
unset |
SMTP_TLS / SMTP_SSL |
true / false |
EMAILS_FROM_EMAIL |
unset |
EMAILS_FROM_NAME |
PROJECT_NAME, normally Fluksio |
EMAIL_RESET_TOKEN_EXPIRE_HOURS |
48 |
SENTRY_DSN |
unset; enables error reporting when configured |
GET /api/v1/utils/health/ checks the event loop and state backend. Docker
uses it as a health check; make up also starts the autoheal service to restart
an unhealthy backend.