How it is configured
Levelrail is an infrastructure deployment, so this is a runtime setting. You manage it from the dashboard or the CLI, a stored value applies at once with no restart, andshow prints the effective value and where it came from (stored or default). The APP_DDNS_* environment variables only seed the default while nothing is stored. Once you save a setting, the stored value always wins. See Environment variables.
Set it up
Dashboard: Settings, Ingress, “Dynamic DNS” card. CLI, DuckDNS:--target - reads the DuckDNS token from stdin. You can also export LEVELRAIL_DDNS_TARGET instead, which keeps the secret out of shell history.
CLI, generic update URL (the URL must contain {ip}):
https://dns.example.com/update?host=home&key=SECRET&ip={ip} on stdin. The updater sends a GET request with {ip} replaced by the detected address. Any 2xx answer counts as success.
Other verbs:
set: --interval, --timeout, --min-update-gap, --reassert (durations such as 5m), --probe-urls (comma separated), --probe-quorum, --fail-alert-after, --allow-private on|off, --allow-insecure-http on|off.
Providers
Not built yet: a Cloudflare provider and IPv6 (AAAA) updates. The updater writes IPv4 only.
How the address is found
Each check asks the probe URLs for the public address. The defaults arehttps://api.ipify.org, https://icanhazip.com and https://ifconfig.me/ip. A new address is accepted only when at least probe-quorum probes agree (default 2). If they disagree, or the answer is not a public address, the check is logged as a warning and nothing is written. This stops one bad probe from pointing your name at the wrong place.
The record is written when the address changes, but never more often than the minimum update gap. It is also written again after the reassert interval even if nothing changed, in case the provider lost the record.
Defaults
After the configured number of consecutive failures the updater raises an alert, and clears it on the next success.
settings ddns status shows the last check, last address, last result, failure count and last error.
The target is secret
The update URL or token is stored encrypted and is never returned by the API, the CLI or the dashboard. After saving, only the host is shown. It needs the secrets store, so the master key must be set; without it the API answers that the feature is not available. The target is also masked in logs and error messages. The update URL must use https unless you turn onallow-insecure-http, and private or loopback destinations are refused unless you turn on allow-private.
Disabling detection with APP_PUBLIC_IP_DETECT=off also keeps the env default off. See Environment variables.
API
All three need a root token. See the API reference.