Skip to main content
MoleSignal reads one TOML file and MS_ environment variables. Start from the sample conf/config.toml that ships with each release. The sample lists every setting, and this page documents each one.

How configuration is loaded

Settings apply in this order. Later sources override earlier ones.
  1. Built-in defaults.
  2. The TOML file passed with --config.
  3. MS_ environment variables.
Restart the process after changing a setting. A running process logs changes to the file and does not apply them.
Most sections ignore keys that they do not define, so a typo has no effect and produces no warning. The sections [meta_database], [object_store] (including [object_store.retry]), [telemetry] (including [telemetry.trace] and [telemetry.self_collect]), [apm], [probe], [otlp_grpc], [notify], and [scheduled_reports.renderer] reject unknown keys, so a typo stops the process at startup.
The Default column in the reference tables shows the value from the sample conf/config.toml. Where the built-in value used for a missing key differs, the description says so.

Environment variables

Every setting has an environment variable. Write the MS_ prefix, then each level of the setting path in upper case, joined by single underscores. Write lists in TOML syntax, for example MS_NODE_ROLES='["intake","querier"]'. Names that contain a dot or a double underscore are not recognized. These variables are read separately from the settings:

Minimal production settings

A production node needs these settings at a minimum. The rest of the file can stay at its defaults.
Also set MS_CIPHER_KEY in the environment. See the Production checklist for the full list of steps before going live.

Node

[node] selects the roles that a process runs. See Role-based deployment.

Listeners

HTTP

HTTP TLS and ACME

[http.tls] starts a TLS listener with automatic certificates from an ACME service such as Let’s Encrypt.

Internal gRPC

[grpc] carries node-to-node traffic. Keep the port on a trusted network.

OTLP gRPC

[otlp_grpc] configures the OTLP gRPC receiver. The receiver has no enable switch and listens on every node that runs the intake role, including standalone.

Arrow Flight SQL

[flight_sql] serves SQL clients such as DBeaver, JDBC, and ADBC. Every call requires an API token. See Database clients.

Probe Agent

[probe] configures the registration and control endpoints for Probe Agents. The endpoints start on standalone and alert nodes. Registration uses server-authenticated TLS, and the control stream uses short-lived mutual TLS identities. See Synthetic monitoring.

pprof

[profiling] starts a node-local pprof listener for diagnostics.

Storage

Metadata database

[meta_database] configures the PostgreSQL database that holds metadata, identities, the file catalog, and product resources. MoleSignal applies its embedded schema migrations to the database on start. See Upgrade.

Object storage

[object_store] configures the store for Parquet files, search indexes, and profile blobs. Backends: local, s3, azure, gcs. Use s3 for AWS S3 and S3-compatible services such as RustFS, Cloudflare R2, and Alibaba Cloud OSS. The S3 and Azure clients take their credentials from the first of these sources that provides both an access key and a secret key:
  1. The variables MS_OBJECT_STORE_ACCESS_KEY and MS_OBJECT_STORE_SECRET_KEY.
  2. The file that credentials_file names.
  3. The keys access_key and secret_key.
The startup log reports the winner as object_store_credentials_source: env, file, inline, or none. Prefer an environment variable or a credentials file over config.toml for the secret. Every part of a multipart upload and every chunk of a ranged read is an object store operation that takes a concurrency slot, retries on its own, and shows in the object_store_* metrics. One transfer holds at most half of the slots, so large objects do not starve other operations. Transient errors of the cloud backends are retried with exponential backoff:

Write-ahead log

[wal] configures the write-ahead log of nodes that run the intake role. Put the directory on a persistent local volume. See Backup and restore.

Intake

[intake] controls the in-memory buffers of an intake node. [intake.rotation] sizes the Parquet files adaptively: [intake.prometheus] limits Prometheus remote_write input: [intake.prometheus.cardinality] admits series in the process that receives the remote_write request, before the batch is forwarded to an intake node. Each process counts the series it receives, so with several routers every router applies the limits on its own: The limits per organization and per metric are a platform setting: Settings → Metric cardinality in the _sys organization. Every node reads them again every 30 seconds and applies them to the series that it counts.

Compaction and retention

[compactor] merges files and applies retention. It runs on standalone and compactor nodes. How long a stream without a retention of its own is kept is a platform setting: Settings → Data retention in the _sys organization, 30 days by default. Downsampling is set for each metrics stream on its Retention tab. See Streams.

Catalog maintenance

The [storage.*] sections control background maintenance of the file catalog and the object store.

Query

Limits and asynchronous jobs

Admission control

[search.admission] limits concurrent queries per workgroup. All values default to 0 or empty, which means no limit. The section is absent from the sample file.

Caches

Each layer is an LRU cache with a time-to-live. A capacity of 0 disables the layer. Hit ratios appear at /metrics as cache_<layer>_hit_ratio. Each section takes capacity and ttl_secs. [cache.parquet_metadata] keeps parsed Parquet footers, page indexes included, in memory. A query that opens a cached file skips the footer read. Its only key is max_size, in MiB, 256 by default. 0 disables it. [cache.object] caches byte ranges of remote objects on local disk. The local object backend bypasses it. When the cache grows past max_size or free disk space falls below min_free_size, the least recently used blocks go first. When the garbage collector deletes an object, the node that deletes it also drops the object’s blocks, provided it has read the object since it started. Other nodes evict those blocks like any other.

Incremental range cache

[search.stream_agg_cache] caches closed windows of range PromQL queries such as rate(metric[5m]), so a dashboard refresh recomputes only the newest window.

Cluster and rate limits

The rate limit applies to the router role only, and each router replica counts separately. See Role-based deployment.

Alerting and email

[notify.smtp] configures platform email such as sign-up approval. Notification channels of type email keep their own credentials as encrypted connectors. SMTP stays disabled while host is empty.

Authentication

MoleSignal creates the root account on the first start, when the database holds no users and both values are set. Changing root_password later does not change the password of an existing account. Change it in the web UI instead. At every start, the account with root_email becomes the platform administrator, so root_email must belong to an existing user. The JWT signing secret is generated on first start and stored in PostgreSQL. The [auth].jwt_secret key from older releases is ignored. Use MS_AUTH_JWT_SECRET_OVERRIDE to pin a secret, and POST /api/v1/auth/jwt/rotate to rotate it.

Self-observability

Process logs and self-collected telemetry use [telemetry]. See Self-observability. The last three keys are commented out in the sample file. The values shown apply when log_output is file.

Self-collected telemetry

[telemetry.self_collect] writes the metrics, traces, and profiles of the process into the reserved _molesignal stream family. The _molesignal streams are created with a retention of 7 days. Change it on the stream’s Retention tab in the _sys organization; a restart keeps the value.

Trace capture and tail sampling

[telemetry.trace] controls the spans that the service records about itself and the tail sampler that decides which traces to keep. [telemetry.trace.slow_thresholds] marks spans as slow, in milliseconds: http_ms = 1000, query_ms = 5000, batch_intake_ms = 2000, database_ms = 200, object_store_ms = 500, external_ms = 1000, background_ms = 30000. [telemetry.trace.external] exports traces to an external OTLP receiver. It stays off while endpoint is empty.

APM

[apm] controls the application performance monitoring projection. It starts on nodes that own trace candidates or run the alert role rollup. See APM. The limits on how many services, endpoints, dependencies, operations, error groups, versions, and instances APM keeps apart an hour are a platform setting: APM → Settings → Cardinality limits, for whoever holds sys.settings.manage. Every node reads them again every 30 seconds. See APM settings. A configuration file that still has an [apm.cardinality] section fails to load.

Features and integrations

IP geolocation data by DB-IP, licensed under CC BY 4.0. The release binary includes the JavaScript function runtime and VRL. Neither needs a setting. See Functions. Scheduled reports in PDF or PNG form render pages with headless Chrome: When Chrome is unavailable, PDF and PNG exports return an error and no placeholder file. Scheduled log inspections run on nodes with the alert role. See Log inspections: The daily Mole Agent token budget applies to each organization. An organization administrator can set a limit of its own in Mole Agent → Settings → Usage. See Mole Agent. The skill folders serve every organization; see Skills:

Settings stored in the database

These settings live in PostgreSQL, and the web UI or API changes them. They have no TOML keys:
  • SSO providers (OIDC, SAML, and LDAP).
  • Remote clusters for federated queries.
  • Status page domains and certificates, and the Slack app that visitors add a page to Slack with.
  • Notification channels, schedules, and escalation policies.
  • Mole Agent model providers, prompts, tools, and approval policy.
  • Organization cipher keys, field masking rules, and sharing policy.
Last modified on October 26, 2026