Skip to content
Docs / dflux EdgeGuard
ContactGet started

Config schema

Every top-level block of the YAML/JSON config file. The only accepted schema version is v1. Most fields are optional; the minimal config in examples/edge-minimal.yaml shows the smallest valid file. The full example with comments lives at examples/edge-full.yaml.

version

Schema version. The only accepted value today is "v1". Empty defaults to "v1". A future v2 will be a hard break.

mode

Top-level role selector:

  • "" (default) — auto. SBI on unless Diameter is enabled with no SBI workload.
  • sbi — SBI listener only.
  • diameter — Diameter listener only.
  • both — both protocols.

server (SBI HTTP/2 listener)

Inbound transport is HTTPS+HTTP/2 when server.tls is set, h2c (HTTP/2 cleartext) otherwise. There is no HTTP/1.1 fallback — 3GPP SBI mandates HTTP/2.

FieldTypeDefaultDescription
listenstring:8090Listen address.
tls.cert_filestringServer certificate. Required when tls is set.
tls.key_filestringServer private key. Required when tls is set.
tls.ca_filestringCA bundle. Required when require_client_cert: true.
tls.insecureboolfalseDisable cert verification on the server side. Rare.
require_client_certboolfalseEnforce mTLS.
timeouts.read_timeoutduration30s
timeouts.read_header_timeoutduration10s
timeouts.write_timeoutduration60s
timeouts.idle_timeoutduration120s
timeouts.max_header_bytesint10485761 MiB.
max_request_body_sizeint10485761 MiB.

diameter (relay)

See Diameter peering for the full connection-mode model.

FieldTypeDefaultDescription
enabledboolfalseEnable the Diameter relay.
listen_addrstringListen address. Required when any peer is responder or both.
transportstringtcptcp or sctp.
origin_hoststringOrigin-Host AVP value.
origin_realmstringSingle Origin-Realm form. Ignored when origin_realms is non-empty.
origin_realms[]stringAll realms this node is authoritative for; first entry is primary (RFC 6733 §6.3 requires one per message).
vendor_iduint320Vendor-Id AVP.
accept_undefined_peerboolfalseAccept CER from peers not listed in peers[].
product_namestringEdgeguardProduct-Name AVP in CER/CEA.
host_ip_addresses[]stringlibrary-derivedHost-IP-Address AVPs.
timers.cea_timeoutduration10sCER/CEA capabilities-exchange timeout.
timers.dwa_timeoutduration10sDWR/DWA watchdog answer timeout.
timers.dpa_timeoutduration5sDPR/DPA disconnect timeout.
timers.stop_timeoutduration10sGraceful-shutdown bound. Caller deadlines win.
duplicate_protectionboolfalseEnable RFC 6733 §6.3.4 duplicate detection.
duplicate_timerduration240sPer-entry TTL when protection is on.
watchdog_intervaldurationlibrary defaultDWR send cadence.
reconnect_intervaldurationlibrary defaultDelay before reconnecting a dropped peer.
request_timeoutduration10sUpper bound on how long the relay waits for an upstream answer.
max_missed_watchdogsintlibrary defaultClose the peer after this many missed DWA answers.
applications[]listEach entry: app_id, vendor_id, app_type (auth/acct).
peers[]listEach entry: address, connection_mode (initiator/responder/both), optional name, realm, rating.
routes[]listRealm-based routes: realm, application_ids, peers, local_action.
sctpobjectSCTP tuning (used only when transport: sctp).
tlsobjectTLS configuration (used only when transport: tcp).
Duration format
Every duration field below — across server, diameter, process, admin, and the rest — uses the same encoding. YAML accepts Go duration strings (10s, 250ms). JSON requires nanoseconds as an integer (10000000000 for 10s).

process

FieldTypeDefaultDescription
drain_delayduration0sLame-duck pause after readiness flips to draining. Set ~2× your probe interval in a cluster; leave 0 on a laptop.
shutdown_timeoutduration15sGraceful-shutdown bound after the drain delay.
store_watch_intervalduration5sControl-plane store poll cadence.

storage

See Using PostgreSQL for the production patterns.

FieldTypeDefaultDescription
control_plane_db.driverstringsqlitesqlite or postgres.
control_plane_db.dsnstringin-memory shared-cache sqliteConnection string.

admin

See Securing the admin API.

FieldTypeDefaultDescription
grpc_listenstringEdgeControl gRPC listen address. Empty leaves the admin surface down. Set 127.0.0.1:9091 or :9091 to match the port d3x-edgectl targets by default. The legacy admin.listen field is not used.
default_actionstringdenyallow or deny. Seeded into the policy store on first run.
allow_anonymousboolfalseMust be true if auth is empty, otherwise the proxy refuses to start.
allow_insecureboolfalseOpt into cleartext gRPC. Production should use TLS.
auth.users[]listOperator roster for the Login RPC. Each entry: username, password_hash (bcrypt), role (admin/operator/viewer). Empty disables login.
auth.login_token_ttlduration1hValidity window of a JWT issued by Login. The shipped examples/edge-minimal.yaml sets 24h.
auth.api_keystringLegacy single key. Prefer api_key_file.
auth.api_key_filestringPath to a file holding the API key.
auth.jwt_secretstringHMAC secret used to validate (and, for the login form, issue) JWTs. Prefer jwt_secret_file.
auth.jwt_secret_filestringPath to a file holding the HMAC secret.
auth.jwt_public_keystringPath to RSA/ECDSA public key for JWT verification.
tlsobjectTLS material. Configuring this lets you drop allow_insecure.
require_client_certboolfalsemTLS on the admin listener.

observability

FieldTypeDefaultDescription
service_namestringedgeCanonical identity stamped on logs as service and used as OTel service.name when tracing.service_name is empty.
metrics_listenstringDedicated HTTP listener for /metrics, /health, and /ready. Empty disables it. Required for Diameter-only scrapes (CLI: -metrics :9100). The SBI listener still serves the same paths when SBI is on.
logging.levelstringinfotrace | debug | info | warn | error.
logging.formatstringconsoleconsole or json.
logging.logfilestringstderrAppend log output here instead of stderr.
logging.callerboolfalseInclude file:line on every line.
logging.db_query_logboolfalseLog every SQL query (debug; warn for slow > 200 ms).
pprof.enabledboolfalseExpose net/http/pprof on the SBI listener.
tracing.endpointstringOTLP gRPC endpoint.
tracing.service_namestringobservability.service_nameOTLP service.name. Empty falls back to observability.service_name (edge).
tracing.sample_ratefloat1.00.0 to 1.0.
tracing.insecureboolfalseDisable TLS on the OTLP connection.

nrf

FieldTypeDefaultDescription
urls[]stringOrdered NRF URLs, primary first. Empty disables NRF.
heartbeat_intervalduration60sHow often to heartbeat the registered profile.
discover_producersboolfalseDiscover downstream producers from the NRF.
outbound_h2cboolfalseUse HTTP/2 cleartext for outbound NRF / producer calls.
callback_base_urlstringExternally-reachable base URL for NRF subscription notifications.
register_max_attemptsint5Retries on initial register.
register_backoffduration2sBackoff between register attempts.
profileslistNF profiles this proxy registers as.
producerslistStatic producer endpoints.

response_policy

FieldTypeDefaultDescription
strip_headers[]stringHeaders to remove from every response.
topology_hiding.enabledboolfalseRewrite producer-side hostnames in responses.
topology_hiding.external_addressstringHostname or URL to substitute.

defaults

FieldTypeDefaultDescription
producer.retry.max_attemptsint0 (one attempt, no retry)Set > 0 to enable retries. examples/edge-full.yaml sets 3.
producer.retry.base_delayduration100ms when retry is on
producer.retry.max_delayduration2s when retry is on
producer.circuit_breaker.thresholdint5Consecutive failures before opening.
producer.circuit_breaker.timeoutduration30sOpen-state cool-down.
producer.timeoutduration30sPer-request producer timeout.
producer.redirectboolfalse307 redirect to producer instead of proxying.

request_signing / request_verification

Optional message-level signing for outbound requests, and verification for inbound. When both sides of a proxy chain use signing, you can confirm that an in-flight message hasn't been tampered with by an intermediate.

FieldTypeDefaultDescription
request_signing.enabledboolfalse
request_signing.private_key_filestringPEM-encoded private key.
request_signing.key_idstringCarried in the signature header for the verifier.
request_signing.algorithmstringrsa-pss-sha256rsa-pss-sha256 or ecdsa-p256-sha256.
request_verification.enabledboolfalse
request_verification.public_key_filestringPEM-encoded public key.

Examples

Minimal — the smallest valid file:

YAML

Full — see examples/edge-full.yaml in the repo for the canonical commented example.