The agent's configuration is a single EdgeSettings. You fill it from a YAML (or JSON) file and environment variables.

Precedence: environment variables > file > defaults

When the same key is set in several places, the environment variable wins. This order supports a layout where secrets such as the token live in /etc/geo-mlops/edge.env and the site setup (collectors, addresses, retention limits) lives in edge.yaml. You can rotate the token without touching the YAML.

Config file lookup order

Without --config, the agent looks in this order and reads only the first file it finds.

  1. The file that the GEO_EDGE_CONFIG environment variable points to — if it is set, the search stops here. If that file does not exist, it does not look anywhere else and starts with defaults.
  2. /etc/geo-mlops/edge.yaml
  3. edge.yaml in the current directory

The agent starts with defaults even when there is no file at all. In that case central is empty, so the link stays offline and data only accumulates locally. Check the values actually applied with geo-mlops-edge config.

Environment variables

Put the key name in upper case after the GEO_EDGE_ prefix, and join nested keys with a double underscore (__).

GEO_EDGE_CENTRAL__BASE_URL=https://mlops.example.com
GEO_EDGE_CENTRAL__TOKEN=<device-token>
GEO_EDGE_DATA_DIR=/var/lib/geo-mlops-edge
GEO_EDGE_API__TOKEN=<your-secret>
GEO_EDGE_RETENTION__MAX_BYTES=100GiB
GEO_EDGE_LOG_LEVEL=DEBUG

Lists (collectors, sync.windows, api.cors_origins) are better written in the file. To pass them as environment variables they must be JSON strings (GEO_EDGE_SYNC__WINDOWS='["22:00-06:00"]').

Size strings

Size fields accept strings such as 50GiB instead of an integer byte count. Case does not matter.

UnitMultiplierUnitMultiplier
B1
KB1000KiB1024
MB1000²MiB1024²
GB1000³GiB1024³
TB1000⁴TiB1024⁴

Applies to: retention.max_bytes, retention.free_disk_min_bytes, sync.chunk_bytes, sync.max_bytes_per_s, api.max_body_bytes, and the http collector's max_body_bytes.

All fields

Top level

KeyDefaultDescription
central(below)Connection to the central server
device(below)Device name and location
data_dir/var/lib/geo-mlops-edgeHolds the queue DB (edge.db), the file spool (spool/) and the model cache (models/)
disk_path""Filesystem whose disk usage is measured and on which retention limits are enforced. Empty means data_dir
heartbeat_interval_s30Heartbeat interval (seconds)
commands_poll_s25Command long-poll wait time (seconds)
retention(below)Local retention limits
sync(below)Upload throttling
link(below)Link monitoring
api(below)Local HTTP API
collectors[]Collector list — Data collectors
models(below)Model cache
policy_sourcecentralWith central, the policy sent by Central overrides heartbeat_interval_s, commands_poll_s, retention and sync. With local, this file wins
log_levelINFODEBUG, INFO, WARNING, ERROR

central

KeyDefaultDescription
base_url""Central API address (https://mlops.example.com). Empty means offline only
token""Device token. Pass it only through the GEO_EDGE_CENTRAL__TOKEN environment variable
timeout_s10.0Request timeout (seconds)
verify_tlstrueTLS certificate verification

The agent talks to Central only when both base_url and token are set.

device

KeyDefaultDescription
id""Device name. Empty means the host name, or if that is missing too, edge-<first 8 characters of the machine ID>. Characters other than letters, digits, ., _ and - become -, and it is cut at 64 characters
locationnoneLocation reported to Central at registration

retention — local retention limits

Whichever of the three is hit first wins. When exceeded, items are dropped lowest priority first, and oldest first within the same priority.

KeyDefaultDescription
max_bytes50GiBUpper limit on total queue size
max_age_days30Items older than this are dropped. 0 means no age limit
free_disk_min_bytes5GiBWhen free disk space falls below this, items are dropped to make room. 0 disables the check

sync — upload throttling

KeyDefaultDescription
batch_size500Records per request (server limit 1000)
chunk_bytes32MiBRequested file chunk size. The actual size is the value the server decides and returns
max_bytes_per_s0Upload rate limit. 0 means unlimited
cpu_pause_percent85Pauses uploads when system CPU exceeds this value. 0 disables the check
windows[]Allowed upload windows (device local time), for example ["22:00-06:00"]. Empty means always
concurrency1Number of concurrent uploads
urgent_priority90Items at this priority or above ignore windows and are sent
KeyDefaultDescription
probe_interval_s5.0How often Central's /api/v1/health is probed
backoff_max_s60.0Upper limit on the interval as it grows during repeated failures
online_after_ok2How many successes in a row count as online
offline_after_fail3How many failures in a row count as offline

Factory links flap often, so these two counters keep a single lucky success from starting a transfer of tens of GB.

api — local HTTP API

KeyDefaultDescription
enabledtrueWhether to start the local API
host0.0.0.0Bind address. 127.0.0.1 on a development PC
port8600Port
token""Empty means no authentication. If set, callers must send it in the X-Edge-Api-Token header
cors_origins["*"]Allowed browser origins
max_body_bytes2GiBRequest body limit. Exceeding it gives 413. 0 disables the check

models — model cache

KeyDefaultDescription
keep_versions2Versions kept on disk per model. When a new version arrives, the oldest are deleted first. 0 means unlimited
auto_activateProductionThe setting exists, but the 0.2.0 runtime does not read it. For automatic activation behaviour, see Models and inference

Full example

central:
  base_url: https://mlops.example.com
  timeout_s: 10
  verify_tls: true

device:
  id: edge-line-01
  location: line-1

data_dir: /var/lib/geo-mlops-edge

retention:
  max_bytes: 50GiB
  max_age_days: 30
  free_disk_min_bytes: 5GiB

sync:
  batch_size: 500
  chunk_bytes: 32MiB
  max_bytes_per_s: 0
  cpu_pause_percent: 85
  windows: []
  urgent_priority: 90

link:
  probe_interval_s: 5
  backoff_max_s: 60
  online_after_ok: 2
  offline_after_fail: 3

heartbeat_interval_s: 30
commands_poll_s: 25

api:
  enabled: true
  host: 0.0.0.0
  port: 8600
  token: ""
  max_body_bytes: 2GiB

models:
  keep_versions: 2

policy_source: central
log_level: INFO

collectors: []   # see the Data collectors page

Written for the platform as of 2026-09-21.

© Geo-MLOps