Configuration reference
Every EdgeSettings field, config file lookup order, GEO_EDGE_* environment variables, size strings
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.
- The file that the
GEO_EDGE_CONFIGenvironment 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. /etc/geo-mlops/edge.yamledge.yamlin 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.
| Unit | Multiplier | Unit | Multiplier |
|---|---|---|---|
B | 1 | ||
KB | 1000 | KiB | 1024 |
MB | 1000² | MiB | 1024² |
GB | 1000³ | GiB | 1024³ |
TB | 1000⁴ | TiB | 1024⁴ |
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
| Key | Default | Description |
|---|---|---|
central | (below) | Connection to the central server |
device | (below) | Device name and location |
data_dir | /var/lib/geo-mlops-edge | Holds 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_s | 30 | Heartbeat interval (seconds) |
commands_poll_s | 25 | Command 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_source | central | With central, the policy sent by Central overrides heartbeat_interval_s, commands_poll_s, retention and sync. With local, this file wins |
log_level | INFO | DEBUG, INFO, WARNING, ERROR |
central
| Key | Default | Description |
|---|---|---|
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_s | 10.0 | Request timeout (seconds) |
verify_tls | true | TLS certificate verification |
The agent talks to Central only when both base_url and token are set.
device
| Key | Default | Description |
|---|---|---|
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 |
location | none | Location 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.
| Key | Default | Description |
|---|---|---|
max_bytes | 50GiB | Upper limit on total queue size |
max_age_days | 30 | Items older than this are dropped. 0 means no age limit |
free_disk_min_bytes | 5GiB | When free disk space falls below this, items are dropped to make room. 0 disables the check |
sync — upload throttling
| Key | Default | Description |
|---|---|---|
batch_size | 500 | Records per request (server limit 1000) |
chunk_bytes | 32MiB | Requested file chunk size. The actual size is the value the server decides and returns |
max_bytes_per_s | 0 | Upload rate limit. 0 means unlimited |
cpu_pause_percent | 85 | Pauses 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 |
concurrency | 1 | Number of concurrent uploads |
urgent_priority | 90 | Items at this priority or above ignore windows and are sent |
link — link monitoring
| Key | Default | Description |
|---|---|---|
probe_interval_s | 5.0 | How often Central's /api/v1/health is probed |
backoff_max_s | 60.0 | Upper limit on the interval as it grows during repeated failures |
online_after_ok | 2 | How many successes in a row count as online |
offline_after_fail | 3 | How 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
| Key | Default | Description |
|---|---|---|
enabled | true | Whether to start the local API |
host | 0.0.0.0 | Bind address. 127.0.0.1 on a development PC |
port | 8600 | Port |
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_bytes | 2GiB | Request body limit. Exceeding it gives 413. 0 disables the check |
models — model cache
| Key | Default | Description |
|---|---|---|
keep_versions | 2 | Versions kept on disk per model. When a new version arrives, the oldest are deleted first. 0 means unlimited |
auto_activate | Production | The 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