Skip to content

Edge environment variables reference

This page is the complete, grouped reference of every environment variable that configures a logiccloud Control edge deployment. It is written so you can build and configure a custom logiccloud Control container with your own reverse proxy (no bundled Caddy) from this page alone.

If you only need to put an unmodified edge stack behind your own proxy under a path prefix, start with the concise walkthrough in Configuring an outbound proxy on the edge and the sections below.

  • Read by names the component(s) that consume the variable (edge-admin, edge-connect, edge-bootstrapper, init.sh, or the shared edge settings library).
  • Prefix-affected? indicates whether EDGE_ROUTE_PREFIX changes the variable’s behavior. Only routing variables are prefix-affected.
VariableDefaultRead byEffectPrefix-affected?
USE_UDSfalseallUse Unix Domain Sockets for inter-process communication instead of TCP.no
UDS_BASE_PATH/var/run/logiccloud/ipcinit.sh, edge-connect, settingsBase directory for all IPC sockets.no
RUNTIME_SOCKET_PATH$UDS_BASE_PATH/runtime.sockinit.sh, edge-admin, settingsPLC runtime IPC socket.no
LICENSING_SOCKET_PATH$UDS_BASE_PATH/license-service.sockinit.sh, edge-admin, settingsLicense service IPC socket.no
EDGE_ADMIN_SOCKET_PATH$UDS_BASE_PATH/control.sockinit.sh, edge-admin, bootstrapper, settingsedge-admin listen socket (control.sock) — the primary upstream your proxy forwards to.no
EDGE_CONNECT_SOCKET_PATH$UDS_BASE_PATH/edge-connect.sockinit.shedge-connect (pairing UI) listen socket — the cold-start upstream used before a device is bound.no
RUNTIME_TCP_PORT45600init.shRuntime TCP port when USE_UDS is not true.no
LICENSING_TCP_PORT45601init.shLicense service TCP port when USE_UDS is not true.no
EDGE_ADMIN_RUNTIME_HOSTlocalhostsettingsRuntime TCP host override.no
EDGE_ADMIN_RUNTIME_PORT45600settingsRuntime TCP port override.no
EDGE_ADMIN_RUNTIME_PROTOCOLtcpsettingsRuntime protocol override.no
VariableDefaultRead byEffectPrefix-affected?
EDGE_ADMIN_PORT18000alledge-admin HTTP listen port (TCP mode).no
EDGE_ADMIN_STATIC_DIR/app/storage/edge-admin-ui/currentedge-adminDirectory of the built edge-admin UI.no
EDGE_ADMIN_INITIAL_ADMIN_PASSWORDlogiccloudedge-admin, settingsInitial local admin password (first boot).no
TARGET_NAMEedge-adminedge-adminLog target name for the supervisor process.no
EDGE_ADMIN_IS_CLOUDfalsesettingsCloud-mode flag (vPLC image). Off for edge devices.no
EDGE_ADMIN_IMPORT_FILE_PATHsettingsOptional device import file consumed at startup.no
EDGE_ADMIN_LOG_MEMORYsettingsEnable memory-usage logging.no
EDGE_DNS_HOSTedge-adminOverride the device DNS host reported to the portal (tests/dev).no
LC_METRICS_HOST_DISK_ROOT/edge-adminMount path measured as the host root-disk gauge.no
LC_METRICS_HOST_DISK_DATA/dataedge-adminMount path measured as the host data-disk gauge.no
LC_METRICS_CLK_TCKsystem valueedge-adminOverride clock ticks/sec for CPU accounting.no
LC_METRICS_EDGE_ADMIN_PER_COREtrueedge-adminEmit edge-admin CPU as per-core percentages.no
LC_METRICS_SERVICE_PER_COREtrueedge-adminEmit per-service CPU as per-core percentages.no
VariableDefaultRead byEffectPrefix-affected?
EDGE_CONNECT_STATIC_DIRdist/edge-connect-uiedge-connectDirectory of the built edge-connect (pairing) UI.no
isDebugfalseedge-connect, settingsDebug mode (also disables outbound TLS verification). Note the lowercase-first spelling.no

edge-connect also reads EDGE_ADMIN_PORT, STORAGE_FOLDER, EDGE_ROUTE_PREFIX, USE_UDS, UDS_BASE_PATH, and LOG_LEVEL, documented in their own groups.

VariableDefaultRead byEffectPrefix-affected?
CHILD_BINARY/app/bin/edge-adminbootstrapperPath to the edge-admin binary.no
EDGE_CONNECT_BINARY./bin/edge-connectbootstrapperPath to the edge-connect binary.no
LC_EDGE_CONTAINER_VERSIONbootstrapper, edge-admin, settingsPinned container/bootstrapper version stamped into the device. edge-admin still auto-updates to the latest published version.no
DEVICE_TOKENinit.sh, bootstrapper, settingsPre-provisioned device token. Its presence marks the device as already bound (warm start).no
BOOTSTRAPPER_HEALTH_PORT8081bootstrapperPort for the bootstrapper /healthz server (see Health and readiness).no
EDGE_ADMIN_APP_FOLDER/appbootstrapper, settingsOverride the app folder for edge-admin.no
VariableDefaultRead byEffectPrefix-affected?
EDGE_ROUTE_PREFIX/ (no prefix)edge-admin, edge-connect, settingsThe single routing knob. See Route-prefix contract.defines it
EDGE_ADMIN_PATH/edge-admin onlyVestigial edge-admin-only base-href override. Do not use for new deployments.yes (edge-admin only)
USE_REVERSE_PROXYinit.sh, bootstrappercaddy starts the bundled Caddy; any other value (for example none) disables it so your proxy can own the listen port.no
REVERSE_PROXY_PORT8080init.sh, bootstrapperPort the bundled Caddy listens on. Irrelevant when Caddy is disabled.no
CADDY_CONFIG_PATH$STORAGE_FOLDER/reverse-proxyinit.sh, bootstrapperDirectory holding the generated Caddyfiles. Bundled Caddy only.no
CADDY_RELOAD_PATH/usr/bin/caddy-reload.shbootstrapperPath to the Caddy reload helper. Bundled Caddy only.no
READINESS_GATED_PROXYtrueinit.sh, bootstrapperServe a static “starting” page until edge-admin readiness passes, then flip. Set false to switch immediately.no
EDGE_STARTING_DIR$APP_FOLDER/startinginit.shDirectory of the static loading page. Bundled Caddy only.no
VariableDefaultRead byEffectPrefix-affected?
BOOTSTRAPPER_HEALTH_PORT8081bootstrapperTCP port for the bootstrapper-owned /healthz (kubelet liveness), decoupled from the reverse proxy and edge-admin.no
EDGE_ADMIN_HEALTHZ_PATH/healthzedge-adminRemap edge-admin’s own diagnostics health path. Always served at root, never under the route prefix.no
EDGE_ADMIN_READYZ_PATH/readyzedge-adminRemap edge-admin’s readiness path (the UI-bundle gate the bootstrapper polls to flip the proxy). Always served at root.no

See Health and readiness topology for details.

VariableDefaultRead byEffectPrefix-affected?
LOG_LEVEL3 (edge-admin), warn (others)allLog verbosity (05).no
LOG_FILE<APP_FOLDER>/logs/logiccloud-control.logedge-adminExplicit log file path override.no
LC_LOG_MAX_SIZE_MB5edge-adminPer-file size cap before truncation. Legacy alias LOG_MAX_SIZE_MB.no
LC_LOG_TRUNCATE_KEEP_MB1edge-adminTail retained when a file hits its cap.no
LC_LOG_MAX_BACKUPS3edge-adminRetained backups (kept for compatibility).no
LC_LOG_MAX_AGE_DAYS7edge-adminMax age (kept for compatibility).no
LC_LOG_DIR_BUDGET_MB64edge-adminDirectory-level byte budget the log janitor enforces.no
LC_LOG_DIR_HIGH_WATER_PCT80edge-adminHigh-water percent that triggers cleanup.no
LC_LOG_DIR_LOW_WATER_PCT50edge-adminLow-water percent the janitor cleans down to.no
LC_LOG_DIR_INTERVAL_SEC10edge-adminJanitor scan interval.no
LC_LOG_DIR_MIN_HEADROOM_RATIO2.0edge-adminMinimum tmpfs headroom ratio safety check.no
NODE_TLS_REJECT_UNAUTHORIZEDverify (unset)log upload, connectors0 disables outbound TLS verification (escape hatch).no
VariableDefaultRead byEffectPrefix-affected?
LOGICCLOUD_RAM_BUDGET_FRACTION0.75init.sh, runtimeFraction of detected device RAM used as the device-wide budget.no
LOGICCLOUD_RAM_BUDGET_MBfraction-driveninit.sh, runtimePin an explicit device-wide RAM budget in MiB; overrides the fraction.no
GOGC75init.sh, Go runtimeGC aggressiveness backstop.no
GODEBUGmadvdontneed=1init.sh, Go runtimeReturn freed memory pages to the OS promptly (important on 32-bit ARM).no

These tune on-device polling and delays. Defaults are auto-selected by detected RAM: constrained for devices with 512 MiB or less, otherwise normal. Any value you set overrides both.

VariableConstrainedNormalEffect
EDGE_PROCESS_STATE_INTERVAL_MS150003000Process-state forwarding interval.
EDGE_UNBIND_CHECK_INTERVAL_MS600005000Unbind-check interval.
EDGE_ONLINE_STATUS_INTERVAL_MS80008000Online-status forwarding (must stay below 10 s).
EDGE_DOWNLOAD_DELAY_MS20000Delay between downloads.
EDGE_BOOTSTRAP_DOWNLOAD_DELAY_MS30000Delay between bootstrap downloads.
EDGE_CONTROLLER_STARTUP_DELAY_MS50000Delay between controller startups.
EDGE_DEVICE_PROCESS_SYNC_INTERVAL_MS6000060000Device/process reconcile interval.
EDGE_BOOT_STAGE_DELAY_MS10000Delay between boot stages.
EDGE_LOW_PRIORITY_SCRIPTStruefalseRun device scripts at low OS priority.

All of these are read by the shared edge settings library and are not prefix-affected.

VariableDefaultRead byEffectPrefix-affected?
STORAGE_FOLDER<CWD>/storageallStorage root for all on-device data.no
APP_FOLDER/appallApplication root folder.no
LOCAL_DEBUGsettingsWhen set, resolve APP_FOLDER to the current working directory (dev).no

EDGE_ROUTE_PREFIX is the single knob that drives routing across the whole edge stack. Set it once for the container and it governs edge-connect route mounting, edge-admin route mounting (UI, GraphQL, auth, log download), and the on-device <base href> in the served UI.

  1. A leading slash is added if missing.
  2. Any trailing slash is stripped.
  3. / (or unset) means no prefix — everything is served at root.
ValueNormalizedEffect
logiccloud/logiccloudServed under /logiccloud
/logiccloud/logiccloudServed under /logiccloud
/logiccloud//logiccloudServed under /logiccloud
/ (or unset)(empty)Served at root, no prefix

With EDGE_ROUTE_PREFIX=/logiccloud:

Under the prefix (forward these unmodified): the UI and all assets, /api/graphql (including the WebSocket upgrade), /api/auth/login, /api/auth/logout, GET/POST /login, and /download-log/....

At root — never prefixed: /readyz and /healthz.

RouteConsumerWhy it stays at root
/readyzbootstrapper readiness gate (over the socket)The bootstrapper polls /readyz at root to flip the proxy upstream. A prefixed /readyz would never answer and the loading page would hang.
/healthzkubelet liveness on port 8081Kubelet expects a fixed root path, decoupled from the proxy and edge-admin.
  • Bootstrapper :8081/healthz — kubelet liveness probe on the bootstrapper’s own port (BOOTSTRAPPER_HEALTH_PORT), deliberately decoupled from the reverse proxy and edge-admin so a busy edge-admin never fails liveness.
  • edge-admin /readyz — the UI-bundle readiness gate. Returns 200 only when edge-admin can serve the UI; otherwise 503 with Retry-After. The bootstrapper polls this over the socket at root and flips the proxy upstream from the loading page to edge-admin once it is ready.
  • edge-admin /healthz and edge-connect /healthz — lightweight diagnostics endpoints.
  • EDGE_ADMIN_HEALTHZ_PATH / EDGE_ADMIN_READYZ_PATH — remap edge-admin’s health and readiness paths. Both are always served at root. If you rename them, route the renamed paths at root as well.

The on-device UI is patched at boot with a <base href> derived from EDGE_ROUTE_PREFIX, and it must carry a trailing slash:

<base href="/logiccloud/">

The browser resolves relative asset URLs against <base href>. With /logiccloud/, assets/index.js resolves to /logiccloud/assets/index.js (correct). Without the trailing slash it resolves to /assets/index.js at root, producing 404s. The trailing slash is re-added automatically at patch time; you do not set the base href directly.

Expose the UI at https://device.example.com/logiccloud/, forward /logiccloud/* unmodified to the edge-admin and edge-connect sockets, and keep /readyz and /healthz at root.

Terminal window
# Routing: the single knob, already normalized (no trailing slash).
export EDGE_ROUTE_PREFIX=/logiccloud
# IPC over Unix sockets. UDS_BASE_PATH defaults to /var/run/logiccloud/ipc;
# the entrypoint derives control.sock (edge-admin) and edge-connect.sock.
export USE_UDS=true
# Disable the bundled Caddy so your proxy owns the listen port and TLS.
export USE_REVERSE_PROXY=none

Everything else uses defaults. Set DEVICE_TOKEN only for pre-provisioned (cloud) devices; a device paired interactively leaves it unset and uses edge-connect for pairing.

upstream edge_admin { server unix:/var/run/logiccloud/ipc/control.sock; }
upstream edge_connect { server unix:/var/run/logiccloud/ipc/edge-connect.sock; }
server {
listen 443 ssl;
server_name device.example.com;
# Root-only probes: never under the prefix.
location = /readyz { proxy_pass http://edge_admin; }
location = /healthz { proxy_pass http://edge_admin; }
# Everything under the prefix, forwarded unmodified. No trailing slash on
# proxy_pass, so nginx keeps the original /logiccloud/... URI.
location /logiccloud/ {
proxy_pass http://edge_admin; # use edge_connect during pairing
proxy_http_version 1.1; # GraphQL WebSocket upgrade:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Terminal window
curl -sk -o /dev/null -w '%{http_code}\n' https://device.example.com/logiccloud/
curl -sk -o /dev/null -w '%{http_code}\n' https://device.example.com/logiccloud/assets/index.js
curl -sk -o /dev/null -w '%{http_code}\n' https://device.example.com/readyz

All three should return 200. If /logiccloud/ is 200 but assets 404, check the base-href trailing slash. If /readyz hangs, it is being routed under the prefix instead of root.