Skip to main content

Agent Configuration & Settings


1️⃣ What?

The GetApp Agent uses a two-layer configuration system. Every setting lives in exactly one layer and is read from only that layer.

ConfigWhere storedMutable at runtime?
Startup Config.env file / system env vars⚠️ Requires agent restart — should not be changed while the agent is running
Live Configconfig.yaml in the data directory✅ Live update via API, CLI, or server push

Startup Config is loaded once at startup. It controls the network bindings, file-system paths, TLS settings, and feature flags that define how the process starts. These values should not be changed while the agent is running.

Live Config is a YAML file (config.yaml) that stores everything that can change while the agent is running — device identity, server URLs, delivery/deploy tuning, policy flags, analytics, and orchestration settings. It is seeded with defaults on first run and can be updated without restarting.

Direct YAML edit requires a reload

Editing config.yaml on disk does not automatically update in-memory state. The agent reads settings at the moment it needs them, but some state (HTTP client pool, discovery interval) is cached and must be hot-reloaded via a server push or an agent restart. A future trigger endpoint for on-demand reload is planned but not yet available.

Default file locations

FileWindows (service)Linux (service)Console / dev
.env<InstallDir>\bin\.env/etc/getapp/.env./ (current dir)
config.yaml%DataPath%\GetAppData\data\device-config.yaml/var/lib/getapp/data/device-config.yaml./GetAppData/data/device-config.yaml
device_id%DataPath%\GetAppData\device_id/etc/getapp/device_id./device_id
tip

CONFIG_YAML_PATH (in the .env file) overrides the default config.yaml location.


2️⃣ Why?

Two separate layers exist because settings have fundamentally different lifecycles:

  • Startup settings (ports, paths, certificates) are tied to the process bootstrap. You cannot change the bind port or TLS cert while the server is running — those values are baked into the TCP listener and TLS context at startup.
  • Runtime settings (which server to connect to, delivery timeouts, feature flags) must be adjustable by operators and by the GetApp management server itself — without SSH access or a service restart on every managed device.

This design also enables the server-push pattern: the GetApp server can remotely push a new config group to connected agents, updating delivery behavior, discovery intervals, and rule-engine flags across the entire fleet in one operation.

Storing the Live Config in plain YAML also makes configuration auditable: the file is human-readable, can be diffed, and is preserved across agent upgrades.


3️⃣ Where?

Agent startup

├── 1. Find .env file
│ --env <path> → GETAPP_ENV_PATH → {config_dir}/.env
│ (prints which source was used to stdout)

├── 2. Load Startup Config — read env vars into static struct, never changes again

├── 3. SettingsIO::init_defaults()
│ Open (or create) config.yaml
│ For each key: if absent → read env var → use compiled default → write to YAML
│ Save once

└── 4. Domain services start — they always read from CONFIG or SettingsIO, never env vars directly

Runtime

├── PUT /api/v2/agent/configs ─────────────▶ writes to config.yaml (Live Config)
├── getapp config set ... ─────────────▶ calls the API above
└── Server push (getapp_config) ─────────────▶ apply_server_config_group() → config.yaml
+ hot-reloads network / discovery intervals

Config directory (config_dir) is resolved at process startup:

ModeWindowsLinux
ServiceRegistry HKLM\SOFTWARE\Elbit Systems\GetApp\InstallDir + \bin/etc/getapp/getapp-release key CONFIG_PATH
ConsoleCurrent working directoryCurrent working directory

Data directory (data_dir):

ModeWindowsLinux
ServiceRegistry DataPath + \GetAppData/etc/getapp/getapp-release key DATA_PATH (or /var/lib/getapp)
Console./GetAppData./GetAppData

4️⃣ Who Cares?

As an operator, there are three aspects of device configuration you control through the Live Config: Enrollment, Metadata, and Agent Config. Each maps to a dedicated API endpoint.


1. Device Enrollment

Goal: Connect this device to the GetApp server fleet so it appears in the management UI and can receive component offerings. The enrollment payload is sent to the server on each discovery cycle. The server uses deviceType and platform to match offerings to this device.

Fields

API fieldYAML pathEnv var (seed)DefaultDescription
deviceIddevice.device_idDEVICE_IDauto-detectedUnique device identifier. Resolved from file → env var → hardware ID. Should not change after first enrollment.
deviceTypedevice.device_type_tokenDEVICE_TYPE_TOKENOS defaultArray of type tokens used by the server to match offerings to this device.
platformdevice.platformDEVICE_PLATFORM_TYPE_TOKEN""Platform type name (e.g. hardware family). Use "universal" to receive offerings for all platforms.
platformIddevice.platform_idPLATFORM_TYPE_ID""Platform serial number or hardware ID.
urlGetAppServerAvailablenetwork.getapp_server_urlsBASE_URL["http://localhost:3000"]Ordered list of GetApp server URLs. The agent tries each in sequence.
urlNetworkAvailabilitynetwork.availability_urlNETWORK_AVAILABILITY_URL""Optional URL polled to verify network reachability before connecting.
orchestrateMedevice.orchestrate_meORCHESTRATE_MEfalseOpt-in to A2A orchestration — request that a master agent manage this device.
reactiveModedevice.reactive_modeREACTIVE_MODEfalseSubscribe to the master's SSE command channel. Requires orchestrateMe: true.

Response-only fields (returned by the API, not writable):

FieldDescription
orchestratedByID of the master agent currently managing this device. Written during the A2A handshake.
orchestratorIdCDN node ID of the orchestrator. Written during the A2A handshake.
deliverySourceCurrent delivery mode: cache (download locally) or remote (pass-through metadata only).

Enrollment flow

  1. Set server URL — point the agent at your GetApp server.
  2. Set device identity — assign type tokens and platform so the server can match offerings.
  3. Agent connects — on the next discovery cycle, the agent sends its enrollment payload.
  4. Server registers the device — it appears in the management UI with its ID, type, platform, and metadata.
  5. (Optional) Enable orchestration — set orchestrateMe: true if this device should be managed by a master agent.

API

# Set server URL and device identity in one call
curl -X PUT http://localhost:2220/api/v2/device/enrollment \
-H "Content-Type: application/json" \
-d '{
"urlGetAppServerAvailable": ["https://getapp.example.com"],
"deviceType": ["edge-server", "zone-a"],
"platform": "ruggedized-v2",
"platformId": "SN-00142"
}'

# Read current enrollment
curl http://localhost:2220/api/v2/device/enrollment

# Enable A2A orchestration
curl -X PUT http://localhost:2220/api/v2/device/enrollment \
-H "Content-Type: application/json" \
-d '{"orchestrateMe": true, "reactiveMode": true}'

CLI

# Set server URL and platform
getapp device set-enrollment \
--server-urls "https://getapp.example.com" \
--platform ruggedized-v2 \
--platform-id SN-00142 \
--device-type "edge-server,zone-a"

# View current enrollment
getapp device get

2. Device Metadata

Goal: Describe this device to operators in the management UI and expose attributes to the rule engine for policy targeting.

Metadata has two kinds of fields: fields you set manually, and fields the agent computes automatically at runtime.

User-settable fields

API fieldYAML pathDescription
namedevice.meta_data.nameHuman-readable name shown in the management UI (e.g. "field-unit-7").
locationGeographic coordinates {"latitude": 32.08, "longitude": 34.78}. Not persisted to YAML; held in memory.
<any custom key>device.meta_data.misc.*Any key not matching a known field is stored as a custom attribute in misc. Available to the rule engine for policy evaluation. Delete a key by sending null.

Agent-computed fields (🔒 read-only)

Evaluated by the agent at runtime — cannot be written via the API:

API fieldDescription
macAddressNetwork MAC address
ipAddressCurrent IP address
osOperating system name
osReleaseOS version string
storageAvailableAvailable disk space in bytes, updated periodically
batteryBattery status {level, charging}
bandwidthLatest bandwidth measurement (download/upload kbps, connection type)
urlGetAppServerActiveCurrently active GetApp server URL

API

# Set name, location, and custom attributes
curl -X PUT http://localhost:2220/api/v2/device/metadata \
-H "Content-Type: application/json" \
-d '{
"name": "field-unit-7",
"location": {"latitude": 32.0853, "longitude": 34.7818},
"fleet": "field-ops",
"site": "alpha"
}'

# Delete a custom field (set to null)
curl -X PUT http://localhost:2220/api/v2/device/metadata \
-H "Content-Type: application/json" \
-d '{"site": null}'

# Read current metadata
curl http://localhost:2220/api/v2/device/metadata

3. Agent Config

Goal: Tune agent behavior for delivery, deployment, connectivity, and analytics.

Fields

API fieldDefaultTypeDescription
tcpTimeout5secondsTCP connection timeout
deliveryAutoTriggerfalseboolAuto-start download when a component is offered
deliveryStorageBufferBytes0bytesExtra free-space reserve required before allowing a delivery
maxParallelDeliveries1intMaximum concurrent downloads
deliveryTimeoutMins30minutesPer-delivery hard timeout
downloadRetryCount2intRetry attempts on failure (exponential backoff: delay × 2^attempt)
deliveryRetryDelaySecs5secondsBase delay between retries
deployAutoOnPullfalseboolAuto-deploy after a successful download
deployTimeoutSec60secondsSeconds to wait for the deploy process to complete
logsRunDispatchJobtrueboolEnable background job that ships logs to the server
matomoUseBuffertrueboolBuffer analytics events locally before batching
matomoServerUrl""URLMatomo analytics server base URL
matomoSiteId""stringSite ID in Matomo
matomoDimensionId""stringCustom dimension ID for agent tracking
matomoMaxRetentionHours720hoursMax retention of buffered events (30 days default)
matomoMaxBufferSizeMb20MBMax buffer file size before forced dispatch
orchSysinfoCheckMins5minutesHow often the slave pushes sysinfo to the master (A2A)
networkConnectionRefreshEnabledfalseboolPeriodically force-reconnect to recover stale connections
networkConnectionRefreshIntervalSecs60secondsInterval between connection refresh attempts
discoveryPeriodicIntervalMin60minutesHow often the agent polls for new component offerings
queryStatusIntervalSec2secondsPolling interval for status background tasks

API

# Read current config
curl http://localhost:2220/api/v2/agent/configs

# Update fields (partial update — unspecified fields unchanged)
curl -X PUT http://localhost:2220/api/v2/agent/configs \
-H "Content-Type: application/json" \
-d '{
"deployAutoOnPull": true,
"deployTimeoutSec": 300,
"maxParallelDeliveries": 3
}'

# Delete a field (resets to default)
curl -X DELETE http://localhost:2220/api/v2/agent/configs/matomoServerUrl

CLI

# Read all current config
getapp config get

# Set fields (only passed flags are modified)
getapp config set \
--deploy-auto-on-pull true \
--deploy-timeout 300 \
--tcp-timeout 10 \
--comp-dir /mnt/fast-drive/comps \
--matomo-server-url https://matomo.example.com \
--matomo-site-id 42

Live Config Reference (config.yaml)

All keys below live in config.yaml. They are seeded once on first run (priority: existing YAML value → env var → compiled default). After seeding, env vars have no effect — changes must be made via API, CLI, or direct YAML edit (followed by a restart for cached zones).

"Env Var" column

The env var listed is used once during first run (or when the key is missing from YAML). It is not re-read on subsequent starts if the key already exists in the file.


Device Enrollment Keys

API: PUT /api/v2/device/enrollment

These keys define how the device identifies itself to the GetApp server and which server it connects to.

YAML pathAPI fieldEnv var (seed)DefaultDescription
device.device_iddeviceIdDEVICE_ID (+ file + hardware)auto-detectedUnique device identifier. Resolved: file → env var → hardware ID.
device.device_type_tokendeviceTypeDEVICE_TYPE_TOKENOS defaultArray of type tokens for offering matching.
device.platformplatformDEVICE_PLATFORM_TYPE_TOKEN""Platform type name. Use "universal" to receive all-platform offerings.
device.platform_idplatformIdPLATFORM_TYPE_ID""Platform serial number or hardware ID.
network.getapp_server_urlsurlGetAppServerAvailableBASE_URL["http://localhost:3000"]Ordered server URL list; agent tries each in sequence.
network.availability_urlurlNetworkAvailabilityNETWORK_AVAILABILITY_URL""URL polled to verify network reachability before connecting.
device.orchestrate_meorchestrateMeORCHESTRATE_MEfalseRequest A2A orchestration by a master agent.
device.reactive_modereactiveModeREACTIVE_MODEfalseSubscribe to the master's SSE command channel.
device.orchestrated_byorchestratedBy🔒 Written by A2A handshake. ID of the managing master.
orch.orchestrator_idorchestratorId🔒 Written by A2A handshake. CDN node ID of the orchestrator.

Device Metadata Keys

API: PUT /api/v2/device/metadata

Metadata describes the device to operators and the rule engine. Fields marked 🔒 are computed by the agent at runtime and cannot be set via the API.

YAML pathAPI fieldWritableDescription
device.meta_data.namenameHuman-readable name shown in the management UI.
locationGeographic coordinates {latitude, longitude}. Not persisted to YAML; held in memory.
device.meta_data.misc.*<any custom key>Any unrecognised key is stored as a custom attribute in misc. Send null to delete a key. Available to the rule engine for policy evaluation.
macAddress🔒MAC address — resolved at runtime.
ipAddress🔒Current IP address — resolved at runtime.
os🔒Operating system name — resolved at runtime.
osRelease🔒OS version string — resolved at runtime.
storageAvailable🔒Available disk space (bytes) — updated periodically.
battery🔒Battery level and charging status — resolved at runtime.
bandwidth🔒Latest bandwidth measurement (download/upload, connection type) — updated periodically.
urlGetAppServerActive🔒Currently active GetApp server URL — set by the connection manager.

Agent Config Keys

API: PUT /api/v2/agent/configs — CLI: getapp config set

🛠️ device — Agent behavior
YAML pathAPI fieldEnv var (seed)DefaultDescription
device.local_config_priorityLOCAL_CONFIG_PRIORITYfalseWhen true, existing local config.yaml values are preserved when the server pushes config — only keys absent locally are written
🌐 network — Connectivity tuning
YAML pathAPI fieldEnv var (seed)DefaultDescription
network.net_tcp_stream_timeout_sectcpTimeoutTCP_STREAM_TIMEOUT5TCP connection timeout (seconds)
network.connection_refresh_enablednetworkConnectionRefreshEnabledNETWORK_CONNECTION_REFRESH_ENABLEDfalsePeriodically force-reconnect to recover from stale connections
network.connection_refresh_interval_secsnetworkConnectionRefreshIntervalSecsNETWORK_CONNECTION_REFRESH_INTERVAL_SECS60Interval between forced reconnections (seconds)
📥 delivery — Download behavior
YAML pathAPI fieldEnv var (seed)DefaultDescription
delivery.delivery_auto_triggerdeliveryAutoTriggerfalseAutomatically start download when a component is offered
delivery.delivery_storage_buffer_bytesdeliveryStorageBufferBytesSTORAGE_DELIVERY_BUFFER_BYTES0Extra free-space reserve (bytes) required beyond the component size before a delivery starts
delivery.use_only_artifacts_size_for_storage_calculationfalseUse raw artifact size instead of totalSize for the disk-space check
delivery.max_parallel_deliveriesmaxParallelDeliveriesMAX_PARALLEL_DELIVERIES1Maximum number of concurrent downloads
delivery.delivery_timeout_minsdeliveryTimeoutMinsDELIVERY_TIMEOUT_MINS30Per-delivery hard timeout (minutes)
delivery.delivery_retry_countdownloadRetryCountDELIVERY_RETRY_COUNT / DOWNLOAD_RETRY_COUNT2Retry attempts on download failure
delivery.delivery_retry_delay_secsdeliveryRetryDelaySecsDELIVERY_RETRY_DELAY_SECS5Base delay between retries (seconds). Grows exponentially: delay × 2^attempt.
delivery.delivery_sourceDELIVERY_SOURCEcacheDelivery mode: cache (download locally) or remote (pass remote metadata only)
🚀 deploy — Deployment behavior
YAML pathAPI fieldEnv var (seed)DefaultDescription
deploy.deploy_auto_on_pulldeployAutoOnPullAUTO_DEPLOY_ON_PULLfalseAutomatically trigger deploy after a successful download
deploy.deploy_timeout_secdeployTimeoutSecDEPLOYMENT_WAIT_TIMEOUT60Seconds the agent waits for the deploy process to complete
📡 discovery — Component polling
YAML pathAPI fieldEnv var (seed)DefaultDescription
discovery.periodic_interval_mindiscoveryPeriodicIntervalMinDISCOVERY_PERIODIC_INTERVAL60How often (minutes) the agent polls the server for new component offerings
discovery.component_last_runRFC3339 timestamp of the last successful discovery run (managed internally)
⚖️ rules — Policy engine
YAML pathEnv var (seed)DefaultDescription
rules.device_anyRULES_DEVICE_ANYtrueWhen true, the device is eligible for all offerings regardless of attribute filters
rules.allow_no_policiesALLOW_NO_POLICIEStrueWhen true, components with no configured policies are still offered
rules.enforceENFORCE_POLICIEStrueGlobal enforcement switch — set false to bypass all policy checks
rules.enforcement_modePOLICY_ENFORCEMENT_MODEofferingLifecycle stage where policies are checked: offering, delivery, or deploy
📶 bandwidth — Bandwidth monitoring
YAML pathEnv var (seed)DefaultDescription
bandwidth.measurement_interval_secBANDWIDTH_MEASUREMENT_INTERVAL_SEC60Interval between bandwidth measurements (seconds)
bandwidth.tier_high_kbpsBANDWIDTH_TIER_HIGH_KBPS5000Threshold for "high" bandwidth classification (kbps)
bandwidth.tier_medium_kbpsBANDWIDTH_TIER_MEDIUM_KBPS1000Threshold for "medium" bandwidth classification (kbps)
bandwidth.measurement_timeout_secBANDWIDTH_MEASUREMENT_TIMEOUT_SEC5Timeout for a single bandwidth probe (seconds)
📊 matomo — Analytics
YAML pathAPI fieldEnv var (seed)DefaultDescription
matomo.matomo_use_buffermatomoUseBufferUSE_MATOMO_BUFFERtrueBuffer events locally before batching to Matomo
matomo.matomo_server_urlmatomoServerUrlMATOMO_URL""Matomo server base URL
matomo.matomo_site_idmatomoSiteIdMATOMO_SITE_ID""Site ID in Matomo
matomo.matomo_dimension_idmatomoDimensionIdMATOMO_DIMENSION_ID""Custom dimension ID for agent-specific tracking
matomo.matomo_max_retention_hoursmatomoMaxRetentionHoursMATOMO_MAX_RETENTION_HOURS720 (30 days)Max hours buffered events are retained before forced dispatch
matomo.matomo_max_buffer_size_mbmatomoMaxBufferSizeMbMATOMO_MAX_BUFFER_SIZE_MB20Max buffer file size (MB) before forced dispatch
📋 logs — Log dispatch
YAML pathAPI fieldEnv var (seed)DefaultDescription
logs.logs_run_dispatch_joblogsRunDispatchJobtrueEnable the background job that ships log files to the server
🔗 orch — Orchestration timing (A2A slave side)
YAML pathAPI fieldEnv var (seed)DefaultDescription
reactive.sysinfo_push_interval_minsorchSysinfoCheckMinsSYSINFO_PUSH_INTERVAL_MINS5How often (minutes) the slave pushes system-info updates to the master
⚙️ general — Misc intervals
YAML pathAPI fieldEnv var (seed)DefaultDescription
general.query_status_interval_secqueryStatusIntervalSecQUERY_STATUS_INTERVAL2Polling interval for status background tasks (seconds)