Most configuration changes require a broker restart to take effect. Plan those updates during a maintenance window. Updated bytes in the TLS certificate files are the exception: the broker re-reads them on a timer and uses them for new handshakes. See TLS Server Certificate.
To keep retained messages, persistent sessions, and queued QoS 1/2 across restarts, configure the separate
Durability section (or COREFLUX_DURABILITY_* environment variables).To expose the broker as an MCP server for AI clients, configure the separate
Mcp section (or COREFLUX_MCP_* environment variables). TYPE MCP_SERVER was removed — this is not a LoT connector.To accept an OIDC access token as the MQTT CONNECT password, configure the
Oidc object in this file. There is no COREFLUX_OIDC_* variable. Enabling it forces AnonymousLogin off.Configuration Overview
The broker configuration is stored as a JSON object. The structure below shows every supported property (the file is encrypted on disk; this is an illustrative representation):First-Run Defaults
When no config file exists, the broker creates one with these values:Network Settings
Ports
The broker listens on multiple ports for different connection types:integer
default:"1883"
Standard MQTT port for unencrypted connections. This is the default port used by most MQTT clients.
integer
default:"8883"
MQTT port for TLS-encrypted connections. Requires valid server certificate configuration.
integer
default:"5000"
Port for MQTT over WebSocket connections. Used by browser-based clients and applications that cannot use raw TCP.
integer
default:"443"
Port for MQTT over WebSocket with TLS. The default is
443 on the broker host. A port below 1024 needs permission to bind it on the broker host. Linux APT and DNF packages grant that permission. See Ports below 1024.IP Bindings
Control which network interfaces the broker listens on:string
IP address to bind for standard MQTT connections. Use
0.0.0.0 to listen on all interfaces, or a specific IP to restrict access.string
IP address to bind for TLS-encrypted MQTT connections.
string
IP address to bind for WebSocket connections.
string
IP address to bind for WebSocket connections with TLS.
Example: Restrict to Local Network
Example: Listen on All Interfaces
Security Settings
Authentication
boolean
default:"true (first run)"
When
true, clients may connect without a valid username/password, and unknown usernames are treated as anonymous. When false, only registered users in the users store can connect.The class default is false, but on a brand-new install the broker writes the first-run config with AnonymousLogin: true. Enforced at runtime in ValidateConnectionAsync, which rejects unauthenticated connects when false and the user is not found.Oidc.Enabled is true, the broker forces AnonymousLogin off at startup. Passwords that are access tokens are checked with the identity provider. Any other password is still checked against the user store.
TLS Server Certificate
Configure TLS encryption for secure client connections:string
Path to the server certificate file (PEM or PFX format). Required to enable the TLS listeners — MQTTS and WSS endpoints are only started when a server certificate is loaded successfully. If set but the file is missing, a warning is logged and the broker may still start without TLS.The broker re-reads this file (and
ServerCertificateKeyPath, when set) on the interval below. A renewed certificate is used for new MQTTS and WSS handshakes. Clients that are already connected stay on the certificate they negotiated.string
Path to the private key file when the certificate and key are in separate PEM files. Leave empty if the key is embedded in the certificate file. File contents are re-read on the same interval as the certificate.
string
Password for an encrypted private key or PFX bundle. If
ServerCertificatePath is set but this is empty, a warning is logged at startup. $SYS/Coreflux/Config shows it as ********. Publishing that mask back to $SYS/Coreflux/Config/New keeps the stored password.You need a password only when the PEM key is encrypted. cert-manager writes an unencrypted tls.key by default, so leave this empty for that key. A password set beside an unencrypted key does not block loading.integer (seconds)
default:"3600"
How often the broker checks
ServerCertificatePath and ServerCertificateKeyPath for new file contents. Default 3600 (one hour). Set 0 to disable reloading.When the contents change, the next MQTTS or WSS handshake uses the new certificate. Existing sessions stay connected. The broker compares file contents, so a timestamp change with the same bytes does not swap the certificate. A detected change is read again after one second so a file that is still being written is not loaded. If the new files fail to load, the previous certificate stays in use.The first check runs one full interval after startup. Changing this value, the certificate paths, listener ports, or mTLS mode still requires a broker restart.Allowed values are 0 or a positive number of seconds, up to 4294966 (about 49.7 days).Keep the reload interval shorter than your certificate renewal margin. With the default of one hour, a renewed file can wait up to an hour before new handshakes pick it up. cert-manager renews at
renewBefore, which for a typical 90-day certificate is days ahead of expiry, so the default sits inside that margin. Use a shorter interval (for example 60 to 300) for short-lived certificates. Each check is two file reads and a hash.string
Path to the root CA certificate for certificate chain validation.
Example: TLS Configuration
Mutual TLS (mTLS)
For environments requiring client certificate authentication:string
Folder of trusted client certificates (the mTLS trust store). The broker loads every
.pem, .crt, .cer, .der, and unprotected .p12/.pfx file in it (not recursive). Certificates in its revoked/ sub-folder are rejected. Empty means the default trust store under the broker data directory: $COREFLUX_DATA_PATH/certs, else $CONFIG_PATH/certs. That is /etc/project/certs in the Docker and Kubernetes images and /var/lib/coreflux/certs for apt/dnf packages; with neither variable set it is /var/lib/coreflux/certs on Linux and macOS, and C:\ProgramData\Coreflux\certs on Windows.The broker creates the folder at startup if it is missing. If it can’t (read-only, or not owned by the broker user), the broker starts with an empty trust store and the HUB shows the path as Unavailable. In containers, keep the default so certificates live on the /etc/project volume; a custom path must be on a writable, persisted volume owned by UID/GID 10001.When you set it from the HUB or with -brokerCertificates, the path must be absolute, outside system folders and the server certificate’s folder, and, on Linux and macOS, under an allowed root (/var/lib, /opt, /srv, /data, /mnt, /media, /home, /Users, temp folders, or the COREFLUX_DATA_PATH / CONFIG_PATH folders). Extend the roots with COREFLUX_CERT_STORAGE_ROOTS. Symbolic links are resolved before the check.A subfolder of CONFIG_PATH is allowed even under a system folder, so /etc/project/certs works in Docker. Use a certs subfolder on the project volume. The CONFIG_PATH folder itself is refused, and so is anything under /etc when CONFIG_PATH is /etc. Uploads through the HUB or import accept certificates only (.crt, .pem, .cer, .der, .p12, .pfx); private keys and CSRs are refused. See HUB Certificates.integer (days)
default:"30"
Days before expiry at which a client certificate, the server certificate, or the Root CA is reported as expiring on
$SYS/Coreflux/Certificates/Summary. 1 to 365.boolean
default:"false"
Enable client certificate validation. When
true, TLS connections require a client certificate (ClientCertificateMode.RequireCertificate). When false, client certificates are optional (AllowCertificate).string
Path to the Certificate Revocation List (CRL) file for checking revoked certificates. When it is a folder, certificates in it are also treated as revoked, alongside the trust store’s
revoked/ sub-folder.boolean
default:"false"
Enable CRL checking for client certificates.
boolean
default:"false"
Enable full certificate chain validation for client certificates against
RootCACertificatePath. When false, only the trusted list is checked. Changing it from the HUB takes effect immediately.Example: mTLS Configuration
Sessions and MQTT Behavior
boolean
default:"false"
Broker policy (not the client CONNECT flag).
false— allow persistent sessions; honour each client’s Clean Session / Clean Start flag.true— require clean sessions only; reject clients that connect with a persistent session (returnsNotAuthorized).
ValidateConnectionAsync (reject policy) and WithPersistentSessions(!CleanSession) at startup.Naming note:
CleanSession = true on the broker means “force clean sessions from clients”, not “enable clean session”.integer (seconds)
default:"0"
MQTT 5 only — maximum session lifetime cap, in seconds. Defines how long the broker holds a session after a client disconnects. (Previously hardcoded to 10 minutes; now configurable.)
0— no cap; the client’s CONNECT value is used as-is.> 0— reject persistent connects where the client requests more than this many seconds.4294967295(uint.MaxValue) — allow “never expire” client requests.
MqttService.ApplyConfiguredSessionExpiry during connection validation.MQTT 3.1.1: ignored — persistence is controlled by CleanSession + WithPersistentSessions only.Important: Coreflux has no server-builder API for session expiry. Clients that need MQTT 5 persistence must set SessionExpiryInterval > 0 in their CONNECT packet.Shared subscriptions
Enables MQTT 5 shared subscriptions (
$share/{group}/{filter}). Each message that matches the filter is delivered to exactly one member of that group — round-robin, preferring members that are connected. A client subscribed to the same filter without $share still receives every matching message.Use this when a pool of workers should share the load on one topic. $share/workers/jobs/# and $share/other/jobs/# are separate groups, because the group is the full share filter.false(default) — a$share/...SUBSCRIBE is refused with reason code0x9E(Shared Subscriptions Not Supported). CONNACK reports Shared Subscription Available =0.true— share filters are accepted. CONNACK reports Shared Subscription Available =1. A malformed share filter (empty group name,+or#in the group name, or a missing filter) is refused with0x8F(Topic Filter Invalid).
COREFLUX_MQTT_SHARED_SUBSCRIPTIONS overrides this field: 1 or true enables shared subscriptions, 0 or false disables them. Restart the broker after changing the field or the variable.In a cluster, in this version, each shared group is local to the broker host the members are connected to.MQTT 3.1.1 clients can use the same
$share/ prefix once shared subscriptions are enabled. See Shared subscriptions.boolean
default:"false"
When
true, the broker maintains a buffer of retained messages and re-publishes them in specific situations: on new subscriptions (copies retained messages into an internal buffer) and via periodic LogRetainedObjects publishing. Useful when clients need retained messages re-delivered after reconnect or subscription changes.Performance and Back-Pressure
integer
default:"20000"
Maximum number of pending outbound messages queued per connected client before Coreflux drops messages (especially QoS 0). Protects broker memory when a client is slow to read.Wired in via
WithMaxPendingMessagesPerClient at startup.ADD CONNECTOR_CONFIG (ADD ROUTE_CONFIG remains a supported alias). These environment variables set the broker-wide defaults (a restart is required to change them):
See Store and Forward Configuration for the LoT block, per-connector overrides, and what happens under load.
Deployment and Data Paths
These paths control where the broker stores its state.ProjectPath is the “base” that the other three resolve against.
string (directory path)
Overrides the broker data root (
CFBasePath) so all state (bin, log, stats, config, projects, users, envs, secrets) lives under this path instead of the default install directory. Typical for Kubernetes volumes or custom install layouts. If not set, the broker uses its install directory.Precedence: COREFLUX_DATA_PATH (if set) wins over this field. CONFIG_PATH sets the initial data directory (used by Docker images) but a non-empty ProjectPath can still replace it unless COREFLUX_DATA_PATH is set. The -p / --path flag is applied late — prefer env vars.string (file path)
Path to the file holding the broker’s user accounts (the username/password credentials used when
AnonymousLogin is false). When set and valid, users load from this plaintext JSON array instead of the encrypted user store, and runtime user changes are written back to this file.string (directory path)
Directory containing the
.env file for environment variables the broker (and LOT logic) can reference at runtime — used to externalize deployment-specific values instead of hardcoding them in config. Resolves to {EnvsPath}/.env. Falls back to CFBasePath when empty. See Environment Variables & Secrets for usage.string (directory path)
Directory containing
secrets.json — the secrets store for sensitive values (tokens, keys, credentials) kept separate from the main config so they aren’t sitting in plain config JSON. Used by connectors and LOT GET SECRET. Resolves to {SecretsPath}/secrets.json. Falls back to CFBasePath when empty. See Environment Variables & Secrets for usage.Logging
boolean
default:"false"
Enable detailed debug logging: connection validation details, every publish/subscription intercept, TCP health noise, etc. Useful for troubleshooting but may impact performance in production.
boolean
default:"false"
When
true, switches logging to stdout-only structured JSON (no rolling file sink). Intended for Docker/Kubernetes where log aggregators scrape container output. The COREFLUX_CLOUD_LOGGING=true environment variable also enables cloud logging.Additional Settings
string
default:"Coreflux DataHub"
A human-readable name for this DataHub / broker instance. Used for identification in logs and UI; does not affect MQTT protocol behaviour.
Applying Configuration
Via MQTT Topic
Publish a configuration JSON to the system topic using any MQTT client (such as MQTT Explorer). A partial object is merged into the live configuration: only the fields you include change, and every field you omit stays as it is, including bind addresses.
Payload: Full or partial configuration JSON object
The runtime handler currently persists only a subset of fields (
AnonymousLogin, bind IPs, ports, FullDebugLog). A restart is required for listener, session, and certificate path changes to take effect. The contents of the files at ServerCertificatePath and ServerCertificateKeyPath are picked up on ServerCertificateReloadIntervalSeconds and do not require a restart.Configuration Validation
The broker validates configuration on load. The following checks are fatal — an invalid value prevents the broker from starting:
Certificate-related issues are non-fatal: they log a warning at startup and the broker continues without TLS rather than refusing to start.
Related Environment Variables
These process environment variables override or complement the JSON file. Restart the broker after changing them. Details and examples: Environment Variables & Secrets.Docker Configuration
When running Coreflux in Docker, configure the broker using environment variables or mounted configuration files.Using Environment Variables
- Docker Run
- Docker Compose
Mounting Configuration
Mount your configuration file to the container:TLS with Docker
When using TLS in Docker, ensure certificate paths in the configuration match the mounted paths inside the container:Configuration Examples
Development Environment
Minimal configuration for local development:Production Environment
Secure configuration for production deployment:High-Security Environment
Configuration with mTLS for maximum security:Next Steps
Broker Commands
Learn how to manage the broker via MQTT commands.
$SYS Topics
Monitor broker status through system topics.

