Skip to content

Configuration Reference

Complete reference for all configuration directives, auto-generated from the Hexon Gateway source code. Each section corresponds to a TOML section in /etc/hexon/.

Precedence (highest to lowest): Environment variables (HEXON_*) > GitOps repository > TOML files > Built-in defaults.

Hot-reload: Most sections reload within 1 second of file changes — no restart needed.


Core Service

TOML: [service] · Env: HEXON_SERVICE_<KEY>

KeyTypeDefaultDescription
hostnamestringPublic hostname for the gateway Sets OIDC issuer URL, SAML metadata base URL, and ACME CA external URL. Changing post-deployment invalidates existing OIDC tokens and SAML SP registrations Required.
portint443HTTPS port to listen on Ports below 1024 require elevated privileges or CAP_NET_BIND_SERVICE Range: 1–65535.
public_portintnonePublic-facing port for URL generation when behind NAT/LB Set when behind a load balancer on a different port than service.port
auto_tlsboolfalseIssue wildcard TLS cert from internal ACME CA Uses internal ACME CA; must not be used together with acme_client. Wildcard covers *.hostname Requires hostname.
auto_tls_renewalduration720hAutoTLS renewal cycle Must be less than auto_tls_validity; overlap enforced at 20-80% of validity Requires auto_tls=true.
auto_tls_validityduration1440hAutoTLS certificate validity Must be greater than auto_tls_renewal; default 1440h = 60 days Requires auto_tls=true.
network_interfacestringeth0Network interface to bind to Default for cluster.cluster_interface, health.interface, vpn.network_interface, and bastion.network_interface when not set explicitly
releases_urlstringhttps://downloads.hexon.io/releasesBase URL for release artifacts and version manifest
enable_portalbool (optional)trueEnable unified portal SPA at /profile
admin_socketbool (optional)trueEnable Unix socket for local admin CLI access Allows ‘hexon admin <command>’ on the server host without bastion
admin_socket_pathstring/tmp/hexon-admin.sockUnix socket path for admin CLI Override with HEXON_ADMIN_SOCK env var on the client side
read_timeoutduration30sHTTP read timeout WebSocket and streaming responses may require longer values
write_timeoutduration30sHTTP write timeout Applies to entire response delivery; set higher for large file downloads or streaming
idle_timeoutduration120sHTTP idle connection timeout
max_header_bytesstring64KBMaximum HTTP request header size
graceful_shutdown_timeoutduration30sTotal time to wait for graceful shutdown Max: 10m.
ikev2_shutdown_timeoutduration15sMax time for IKEv2 client notification during shutdown Max: 10m.
listener_drain_timeoutduration10sMax time for listener connection draining during shutdown Max: 10m.
background_task_timeoutduration5sMax time for background goroutines to stop during shutdown Max: 10m.
http2_enablebooltrueEnable HTTP/2 support When false, JA4H fingerprinting and HTTP/2 server push are also disabled
http2_maxstreamsint1000Max concurrent HTTP/2 streams per connection Max: 1000000.
http2_maxframesizeint1048576Max HTTP/2 frame size in bytes Max: 16777216.
http2_idletimeoutduration120sHTTP/2 idle timeout
http2_keepalivebooltrueEnable HTTP/2 keepalive pings
http2_keepalive_intervalduration30sHTTP/2 keepalive ping interval
http2_push_enabledbooltrueEnable HTTP/2 server push Only effective when http2_enable is true
http2_push_max_resourcesint8Max resources to push per HTTP/2 request
http2_push_timeoutduration100msHTTP/2 push operation timeout
http2_push_cache_enabledbooltrueEnable push cache to avoid redundant HTTP/2 pushes
http2_push_cache_ttlduration1hHTTP/2 push cache TTL
http2_push_only_securebooltrueOnly push resources over secure connections
http3_enableboolfalseEnable HTTP/3 over QUIC alongside HTTP/2 Requires UDP port open on firewall. Activates QUIC affinity and 0-RTT replay tracking
http3_idle_timeoutduration30sQUIC idle timeout
http3_max_streamsduration100Max bidirectional QUIC streams per connection Range: 0–1000000.
http3_max_uni_streamsduration100Max unidirectional QUIC streams per connection Range: 0–1000000.
http3_allow_0rttbooltrueAllow 0-RTT early data with replay protection
http3_altsvc_max_ageduration24hAlt-Svc header max-age
http3_0rtt_token_ttlduration2mHTTP/3 0-RTT replay protection token TTL
quic_affinity_enabledboolfalseEnable QUIC affinity routing via UDP fingerprint Routes QUIC connections to the same cluster node based on connection ID
quic_cid_mapping_limitint100000Max tracked QUIC connection IDs
quic_affinity_idle_timeoutduration5mIdle timeout for QUIC CID mappings
quic_migration_max_per_connint10Max QUIC migrations per connection before rejection Range: 0–100.
quic_migration_cooldownduration1sMinimum time between QUIC migrations
quic_migration_ttlduration30mIdle QUIC connection tracking timeout
quic_migration_cleanupduration5mQUIC expired connection cleanup interval
quic_0rtt_token_ttlduration2mQUIC 0-RTT token validity duration
quic_0rtt_bind_to_ipbooltrueRequire IP match for QUIC 0-RTT token use
quic_0rtt_max_tokensint100000Maximum QUIC 0-RTT tokens to track per node Range: 0–10000000.
quic_0rtt_cleanupduration1mQUIC 0-RTT token cleanup interval
handshake_timeoutduration10sTLS handshake timeout
block_malformed_tlsboolfalseBlock malformed TLS connections Rejects TLS connections with invalid ClientHello; may block legacy clients
tls_min_versionstring1.3Minimum TLS version for inbound connections Values: 1.2, 1.3.
tls_max_versionstringMaximum TLS version for inbound connections Defaults to latest supported version if not set Values: 1.2, 1.3.
tls_session_ticketsboolfalseEnable TLS session tickets Disabled by default for forward secrecy
tls_renegotiationboolfalseAllow TLS renegotiation Disabled by default for security
tls_prefer_server_ciphersbooltrueServer prefers its own cipher suite order
tls_strict_cipher_suitesbooltrueUse only AEAD ciphers with forward secrecy
outbound_tls_min_versionstring1.3Minimum TLS version for outbound connections to backends Does not affect internal cluster (hexdcall) which always uses TLS 1.3 Values: 1.2, 1.3.
pqcbool (optional)trueEnable hybrid post-quantum key exchange ML-KEM-768 + X25519 for service TLS RFC FIPS203.
mtls_modestringnoneClient certificate requirement level With proxy=true and mandatory mode, proxy_header_clientcert is required Values: none, optional, mandatory.
x509_auto_authbool (optional)trueAuto-authenticate clients presenting a valid TLS client certificate
fingerprinting_enabledboolfalseEnable composite client fingerprinting (TLS+HTTP/2+TCP) Enables JA4 TLS fingerprint extraction; used for affinity routing and security analytics
fingerprint_max_entriesint10000Maximum fingerprint entries in cache
fingerprint_ttlduration5mBase TTL for fingerprint cache entries
fingerprint_cleanupduration30sFingerprint cache cleanup interval
quic_fingerprint_reassembly_max_packetsint10Max packets for QUIC ClientHello reassembly
quic_fingerprint_reassembly_max_bytesstring15KBMax bytes for QUIC reassembly buffer
quic_fingerprint_reassembly_timeoutduration5sQUIC reassembly state timeout
ja4_formatstringcompositeJA4 fingerprint format: composite (internal optimized) or canonical (FoxIO JA4 standard) canonical enables interop with Wireshark, Zeek, and threat intel feeds
ja4_max_extensionsint200Max TLS extensions to parse for JA4 fingerprinting Typical clients send 10-30 extensions
ja4_max_sigalgsint100Max signature algorithms to parse for JA4 fingerprinting Typical clients send 10-20 signature algorithms
http2_fingerprint_cache_sizeint10000Max entries in HTTP/2 fingerprint cache
http2_fingerprint_cache_evict_pctint10Percentage of oldest entries to evict when HTTP/2 fingerprint cache is full
fingerprint_max_entries_per_ipint10Max fingerprint entries per client IP for anti-abuse
quic_max_crypto_frame_offsetstring64KBMax QUIC CRYPTO frame offset for DoS protection
proxyboolfalseEnable proxy mode when behind a reverse proxy, load balancer, or CDN Requires proxy_header_clientip and proxy_cidr when enabled
proxy_cidr[]stringTrusted proxy IP ranges for header trust Required when proxy=true; prevents header spoofing Requires proxy=true.
hexon_edge_protocolboolfalseEnable Hexon Edge Protocol for edge-to-gateway communication Set true when edge.enabled in Helm; parses HXEP header for real client IP
hexon_edge_cidr[]stringTrusted CIDRs for Hexon Edge Protocol header parsing Defaults to trust-all (0.0.0.0/0, ::/0); set to pod network CIDR in production
proxy_header_clientipstringHTTP header containing real client IP from proxy Required when proxy=true Requires proxy=true.
proxy_header_clientcertstringHTTP header containing client certificate from proxy for mTLS passthrough
proxy_header_clientfingerprintstringHTTP header containing client fingerprint from proxy, replaces JA4
proxy_header_traceidstringHTTP header containing trace ID from proxy for distributed tracing
preserve_client_portbooltrueUse client connection port in redirects for NAT/LB port mapping
correlation_id_headerstringX-Hexon-IDHTTP header name for request correlation ID
disable_server_headerboolfalseDisable the Server response header
security_headers_enabledbooltrueEnable security response headers
x_frame_optionsstringDENYX-Frame-Options header value Also supports ALLOW-FROM uri Values: DENY, SAMEORIGIN.
x_content_type_optionsstringnosniffX-Content-Type-Options header value
x_xss_protectionstring1; mode=blockX-XSS-Protection header value Values: 0, 1, 1; mode=block.
content_security_policystringContent-Security-Policy header value Empty means no CSP header; max 8192 characters
e2oeboolfalseEnable End-to-Origin Encryption (requires PoW)
e2oe_strictboolfalseNo degradation — reject all requests without E2OE channel Requires e2oe=true.
compression_enabledbooltrueEnable response compression
compression_levelstringbalancedResponse compression level Values: none, fast, balanced, best.
config_hot_reload_enabledbooltrueEnable automatic config hot-reload on file changes
config_file_watching_enabledbooltrueEnable file system monitoring for config changes
config_cache_enabledbooltrueEnable config section caching for faster access
config_cache_max_entriesint100Maximum config cache entries Range: 0–10000.
config_callback_throttle_msint100Config change callback throttle window in milliseconds Range: 0–10000.
config_poll_interval_msint1000Config file polling interval in milliseconds Range: 100–60000.
config_diff_history_enabledbooltrueStore config change history in a ring buffer
config_diff_history_sizeint10Maximum config diff entries to retain Range: 1–100. Requires config_diff_history_enabled=true.
inline_assetsbooltrueEmbed CSS/JS directly in HTML responses Set false for external asset serving via CDN
hide_statusbool (optional)trueHide HTTP status codes in user-facing message pages
default_languagestringenDefault UI language code
detect_browser_languagebool (optional)trueAuto-detect language from browser Accept-Language header
disclaimerstringBy logging in, you agree to acceptable use policy and monitoring terms.Footer disclaimer text for emails and forms
cookie_noticebool (optional)trueShow informational cookie notice banner Informational only — all cookies are essential and exempt from consent
privacy_policy_urlstringPrivacy policy URL linked from cookie notice Shows ‘More info’ link when set
cookie_namestringhexonDefault cookie name for sessions
cookie_domainstringCookie domain for cross-subdomain session sharing Empty means current hostname only
cookie_ttlduration12hDefault session cookie TTL
session_ttlduration24hAuthenticated user session TTL
session_password_expiredduration15mPassword expired session TTL
session_mfa_pendingduration5mMFA pending session TTL
max_concurrent_sessionsint1Maximum concurrent sessions per user Set to 0 for unlimited
runtime_metricsbooltrueEnable runtime package metrics collection
runtime_metrics_ttlduration24hRetention window for runtime metrics
runtime_metrics_queueint10000Event queue size for runtime metrics Range: 0–1000000.
runtime_metrics_exporterboolfalseEnable Prometheus metrics exporter endpoint
runtime_metrics_portint9090Prometheus metrics exporter listen port Range: 1–65535.
runtime_metrics_network_interfacestringeth0Network interface for metrics exporter listener
runtime_metrics_allow_from[]stringCIDR ranges allowed to scrape Prometheus metrics Empty means no IP restrictions; restrict to Prometheus scraper CIDRs in production
debug_modeboolfalseEnable Server-Timing debug headers with request tracing Exposes internal timing and infrastructure details; use only for debugging
geo_enabledboolfalseEnable geo-IP access restrictions
geo_databasestringnonePath to MaxMind GeoLite2-Country.mmdb database Required when geo_enabled=true. Download from MaxMind GeoLite2
geo_asn_databasestringnonePath to MaxMind GeoLite2-ASN.mmdb database Required only when geo_allow_asn or geo_deny_asn rules are configured
geo_allow_countries[]stringnoneISO 3166-1 alpha-2 country codes to allow Empty means allow all countries
geo_deny_countries[]stringnoneISO 3166-1 alpha-2 country codes to deny
geo_allow_asn[]stringnoneASN numbers to allow
geo_deny_asn[]stringnoneASN numbers to deny
geo_bypass_cidr[]stringnoneCIDRs that bypass geo-IP checks
geo_deny_codeint403HTTP status code for geo-IP denial Range: 400–599.
geo_deny_messagestringAccess denied from your location.Custom message shown on geo-IP denial
geo_country_headerstringCDN header containing ISO country code, skips MaxMind lookup Requires proxy=true; common values: CF-IPCountry, CloudFront-Viewer-Country
time_enabledboolfalseEnable time-based access restrictions Global default inherited by proxy, VPN, bastion, forward_proxy, tcp_proxy, and webshell; each can override
time_bypass_cidr[]stringnoneCIDRs that bypass time-based checks Service-level bypass; per-service bypass CIDRs are merged with this list
time_deny_codeint403HTTP status code for time-based denial Range: 400–599.
time_deny_messagestringAccess not permitted at this time.Custom message shown on time-based denial
time_default_timezonestringUTCDefault IANA timezone for time-based restrictions
time_default_allow_days[]stringDefault allowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
time_default_deny_days[]stringDefault denied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
time_default_allow_hoursstringDefault allowed hours range in 24h format Format: HH:MM-HH:MM
time_default_deny_hoursstringDefault denied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

Cross-Origin Resource Sharing configuration for API endpoints

TOML: [service.cors] · Env: HEXON_SERVICE_CORS_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable Cross-Origin Resource Sharing
allowed_origins[]stringAllowed CORS origins Required when CORS is enabled; use * for all origins (not with credentials) Requires enabled=true.
allow_credentialsboolfalseAllow cookies and credentials in CORS requests Cannot be true when allowed_origins contains * Requires enabled=true.
allowed_methods[]stringAllowed HTTP methods for CORS Values: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS. Requires enabled=true.
allowed_headers[]stringAllowed request headers for CORS Requires enabled=true.
exposed_headers[]stringResponse headers exposed to browser via CORS Requires enabled=true.
max_ageint3600CORS preflight response cache duration in seconds Range: 0–86400. Requires enabled=true.

UI theme configuration for colors and branding (hot-reloadable)

TOML: [service.theme] · Env: HEXON_SERVICE_THEME_<KEY>

KeyTypeDefaultDescription
modestringautoTheme behavior mode Values: light, dark, auto.
allow_user_overridebool (optional)trueAllow browser to select dark/light based on OS preferences Only applies when mode is auto

Color configuration for theme

TOML: [service.theme.colors] · Env: HEXON_SERVICE_THEME_COLORS_<KEY>

KeyTypeDefaultDescription
successstring142 71% 45%Success state color in HSL format
warningstring38 92% 50%Warning state color in HSL format
infostring217 91% 60%Info state color in HSL format
radiusstring0.5remBorder radius as CSS length value

Light mode color overrides

TOML: [service.theme.colors.light] · Env: HEXON_SERVICE_THEME_COLORS_LIGHT_<KEY>

KeyTypeDefaultDescription
backgroundstringPage background color in HSL format Light default: 60 9% 98%; Dark default: 60 3% 15%
foregroundstringPrimary text color in HSL format
cardstringCard/panel background color in HSL format
card_foregroundstringCard text color in HSL format
primarystringPrimary action color in HSL format
primary_hoverstringPrimary hover state color in HSL format
primary_foregroundstringPrimary action text color in HSL format
secondarystringSecondary action color in HSL format
secondary_hoverstringSecondary hover state color in HSL format
destructivestringDestructive action color in HSL format
destructive_foregroundstringDestructive action text color in HSL format
mutedstringMuted background color in HSL format
muted_foregroundstringMuted text color in HSL format
accentstringAccent background color in HSL format
accent_foregroundstringAccent text color in HSL format
borderstringBorder color in HSL format
inputstringInput border color in HSL format

Dark mode color overrides

TOML: [service.theme.colors.dark] · Env: HEXON_SERVICE_THEME_COLORS_DARK_<KEY>

KeyTypeDefaultDescription
backgroundstringPage background color in HSL format Light default: 60 9% 98%; Dark default: 60 3% 15%
foregroundstringPrimary text color in HSL format
cardstringCard/panel background color in HSL format
card_foregroundstringCard text color in HSL format
primarystringPrimary action color in HSL format
primary_hoverstringPrimary hover state color in HSL format
primary_foregroundstringPrimary action text color in HSL format
secondarystringSecondary action color in HSL format
secondary_hoverstringSecondary hover state color in HSL format
destructivestringDestructive action color in HSL format
destructive_foregroundstringDestructive action text color in HSL format
mutedstringMuted background color in HSL format
muted_foregroundstringMuted text color in HSL format
accentstringAccent background color in HSL format
accent_foregroundstringAccent text color in HSL format
borderstringBorder color in HSL format
inputstringInput border color in HSL format

Branding assets configuration

TOML: [service.theme.branding] · Env: HEXON_SERVICE_THEME_BRANDING_<KEY>

KeyTypeDefaultDescription
logostringDefault logo path or URL, used if mode-specific logos not set
logo_lightstringLogo for light mode and emails
logo_darkstringLogo for dark mode
faviconstringFavicon path or URL
allow_http_imagesboolfalseAllow HTTP (non-HTTPS) URLs for branding images Enabling is a security risk; use HTTPS URLs instead
assets_base_pathstring/opt/hexon/assetsBase directory for local branding asset files Must be an absolute path

Sign-in authentication flow configuration

TOML: [service.signin] · Env: HEXON_SERVICE_SIGNIN_<KEY>

KeyTypeDefaultDescription
primarystringPrimary authentication method
secondary[]stringAlternative authentication methods
require_mfa[]stringAuthentication methods that require MFA step
mfa_methods[]stringAllowed MFA methods

TOML: [service.signin.magiclink] · Env: HEXON_SERVICE_SIGNIN_MAGICLINK_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable magic link passwordless sign-in Requires SMTP to be configured; auto-enables device code module
code_lengthint10Magic link token length (BASE-20 encoding) 10 chars = ~43 bits entropy; sufficient with short TTL and rate limiting Range: 6–40. Requires enabled=true.
code_ttlduration10mMagic link validity duration Requires enabled=true.
rate_limitrate_limit5/1mRate limit for magic link requests per IP Requires enabled=true.
rate_limit_emailrate_limit3/10mRate limit per email address Prevents inbox flooding for a single user Requires enabled=true.

Sign-up registration flow configuration

TOML: [service.signup] · Env: HEXON_SERVICE_SIGNUP_<KEY>

KeyTypeDefaultDescription
primarystringPrimary signup/registration method
secondary[]stringAlternative signup methods
signin[]stringSign-in methods enabled after signup Inherits MFA requirements from signin config

Time access windows by country or CIDR

TOML: [service.time_windows] · Env: HEXON_SERVICE_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

Cluster

TOML: [cluster] · Env: HEXON_CLUSTER_<KEY>

KeyTypeDefaultDescription
cluster_modeboolfalseEnable cluster mode for distributed multi-node operation
cluster_peers[]stringStatic list of cluster peer addresses including self (IPs or hostnames) Minimum 2 entries (includes self). When set, cluster_dns is ignored. Hostnames are resolved to IPs on each refresh cycle Min: 2. Requires cluster_mode=true.
cluster_dnsstringDNS name used for peer discovery in cluster mode Used for DNS-based node discovery. Ignored when cluster_peers is set Requires cluster_mode=true.
cluster_dnssecbool (optional)trueEnable DNSSEC validation for cluster DNS lookups Nil means not set (defaults to true for security); set explicitly to false to disable Requires cluster_mode=true.
cluster_dns_resolvers[]stringCustom DNS resolvers for cluster peer discovery Port defaults to :53 if not specified; leave empty to use OS DNS resolvers Requires cluster_mode=true.
cluster_portint7946NATS messaging port for inter-node cluster communication Range: 1–65535. Requires cluster_mode=true.
cluster_port_routingintnoneNATS cluster routing port for route gossip protocol Defaults to cluster_port+1 at runtime Range: 1–65535. Requires cluster_mode=true.
cluster_interfacestringNetwork interface for cluster communication Defaults to the value of [service].network_interface if not set Requires cluster_mode=true.
cluster_pathstringShared filesystem path for NATS JetStream persistence NFS mount shared across all cluster nodes. Without this, JetStream is memory-only and persistent state is lost on restart Requires cluster_mode=true.
cluster_refreshduration15sInterval for refreshing peer list and affinity ring Range: 1s–24h. Requires cluster_mode=true.
cluster_startup_delayduration0sDelay before starting cluster operations after boot Allows time for peers to become available before joining the cluster Range: 0s–5m. Requires cluster_mode=true.
cluster_affinityboolfalseEnable consistent hashing for affinity-based request routing Routes requests to the same node based on fingerprint for session stickiness Requires cluster_mode=true.
max_concurrent_forwardsint1000Maximum number of concurrent connection forwards between cluster nodes Set to 0 for unlimited (not recommended); applied only when cluster_mode is enabled Range: 0–100000. Requires cluster_mode=true.
cluster_min_nodesint0Minimum number of nodes required before the server starts accepting traffic Use 0 to start immediately or 2+ for quorum; value of 1 is not allowed Range: 0–100. Requires cluster_mode=true.
config_file_sharedbooltrueWhether the config file is shared across nodes via NFS When false, each node reads its own local config file; hot-reload propagates only locally
persist_memorybooltruePersist memory module data to JetStream file storage Requires cluster_path; enables restart-resilient sessions, PATs, audit trail, etc. Requires cluster_path.
memory_kv_max_writeint10Maximum concurrent KV write operations for memory persistence Controls how many entries are written to JetStream KV simultaneously; increase for large directories Range: 1–100. Requires persist_memory=true.
threshold_requiredboolfalseRequire threshold signing for OIDC JWTs (fail-closed after bootstrap grace) When true, token issuance fails (503) if threshold signing unavailable after grace period Requires cluster_mode=true.
threshold_bootstrap_graceduration2mGrace period for DKG completion before enforcing threshold requirement Fallback to deterministic key during this period; after expiry, fail-closed (503) Range: 30s–10m. Requires threshold_required=true.
threshold_nodesint0Minimum signers required (t value; t+1 nodes cooperate to sign) 0 = auto (majority quorum: n/2). For 3-node cluster, t=2 means any 2 of 3 can sign Range: 0–100. Requires cluster_mode=true.

Operations

TOML: [operations] · Env: HEXON_OPERATIONS_<KEY>

KeyTypeDefaultDescription
leader_election_intervalduration5sHow often to run leader election check
health_check_intervalduration10sHow often to check NATS health
nats_ready_timeoutduration30sHow long to wait for NATS to be ready at startup
max_concurrent_opsint2000Maximum concurrent operations Range: 0–100000.
operation_timeoutduration5mTimeout for operation execution
max_payload_bytesstring8MBMaximum NATS message payload size
once_dedupe_ttlduration5mTTL for Once operation deduplication
wait_timeoutduration2sTimeout for Wait() on single operations
fire_and_forget_timeoutduration25msAuto-cleanup timeout for fire-and-forget detection
quorum_timeoutduration5sTimeout for WaitBroadcast() with quorum
cluster_timeoutduration10sTimeout for WaitBroadcast() waiting for all nodes
encryption_ready_timeoutduration10sTimeout waiting for encryption key sync during startup
cluster_operational_timeoutduration2mTimeout for cluster operational readiness before accepting traffic
metrics_retention_windowduration1hHow long to retain operations metrics
shutdown_timeoutduration30sTimeout for graceful shutdown of operations
max_queued_once_opsint1000Maximum queued Once operations during leadership gap Range: 0–1000000.
max_dedupe_map_sizeint10000Maximum deduplication map entries Range: 0–10000000.
publish_max_retriesint3Maximum retries for NATS publish failures Range: 0–100.
publish_retry_delayduration10msInitial retry delay for NATS publish with exponential backoff
publish_timeoutduration5sPer-attempt timeout for NATS publish
broadcast_dedupe_ttldurationnoneTTL for Broadcast deduplication to prevent echo races Auto-calculated as publish_timeout * 3 (min 2s) if not set
circuit_breaker_failure_thresholdint5Consecutive failures before tripping circuit breaker Range: 0–1000.
circuit_breaker_open_durationduration30sHow long circuit breaker stays open before half-open
circuit_breaker_half_open_successesint2Consecutive successes to close circuit from half-open Range: 0–100.
mtlsbooltrueEnable mTLS for NATS cluster communication
internal_ca_valid_sincestring2025-01-01T00:00:00ZInternal CA certificate valid-from date ISO 8601 format. Changing invalidates all previously issued internal mTLS certificates
internal_ca_valid_forduration17520hInternal CA validity duration 17520h=2 years
internal_cert_max_validityduration8760hMaximum validity for internal certificates and CA overlap period 8760h=1 year
internal_ca_subject_cnstringHexon Internal CA Root SubsystemInternal CA Subject Common Name
acme_ca_valid_sincestringnoneACME CA certificate valid-from date ISO 8601; changing invalidates all previously issued ACME CA certificates
acme_ca_valid_forduration175200hACME CA validity duration 175200h=20 years
acme_ca_subject_cnstringHexon ACME CA Root SubsystemACME CA Subject Common Name
acme_ca_renewalduration8760hACME CA rotation and refresh interval 8760h=1 year
acme_cert_max_validityduration8760hMaximum validity for ACME-issued certificates and CA overlap period 8760h=1 year
acme_ca_thresholdboolfalseEnable threshold ECDSA (P-256) for ACME CA private key Fail-closed: no ACME certs until DKG completes (~30s). CA key never exists on any single node. Requires cluster_mode=true.
encrypt_payloadsbooltrueEnable HMAC-authenticated AES-256-GCM payload encryption Disabling removes application-layer encryption from hexdcall RPC; mTLS still protects transport. Only disable for debugging
forward_secrecybooltrueEnable forward secrecy with X3DH key exchange Requires JetStream KV with persistent storage (cluster_path). On single-node without cluster_path, pre-keys are memory-only and lost on restart
forward_secrecy_key_intervalduration1hForward secrecy key rotation interval
forward_secrecy_grace_periodduration5sGrace period for accepting old keys during rotation
forward_secrecy_prekey_rotationduration168hPre-key rotation interval 168h = 7 days
forward_secrecy_prekey_batch_sizeint100Number of pre-keys to generate per batch Range: 0–10000.
forward_secrecy_prekey_low_watermarkint20Minimum pre-keys to maintain before replenishment Must be less than or equal to prekey_batch_size Min: 0.
forward_secrecy_prekey_ttlduration168hTime-to-live for pre-keys 168h = 7 days
cluster_pqcbool (optional)trueEnable hybrid post-quantum key exchange (ML-KEM-768 + X25519) for cluster TLS FIPS 203 compliant
scheduler_max_workersint8Maximum concurrent scheduler workers Range: 0–1000.
scheduler_queue_sizeint100Priority queue buffer size per priority level Range: 0–100000.
scheduler_adaptive_enabledboolfalseEnable adaptive worker scaling based on CPU load Automatically adjusts task scheduling based on cluster load
scheduler_cpu_thresholdstring80CPU utilization threshold for adaptive scaling Percentage value, with or without % suffix Range: 10–99.
scheduler_load_check_intervalduration5sInterval for checking system load for adaptive scaling
persistent_max_value_bytesstring1MBMaximum value size for persistent storage Range: 1KB to 8MB

Telemetry & Logging

TOML: [telemetry] · Env: HEXON_TELEMETRY_<KEY>

KeyTypeDefaultDescription
service_namestringnoneService name for telemetry identification Appears in OTLP trace spans and log entries
service_versionstringnoneService version for telemetry metadata Appears in OTLP trace metadata
environmentstringnoneDeployment environment name Appears in OTLP trace metadata; common values: production, staging, development
log_levelstringinfoGlobal log level Recommended: info for production, debug for troubleshooting Values: trace, debug, info, warn, error, fatal.
log_formatstringjsonLog output format json for machine parsing; human for interactive debugging Values: json, human.
outputstringstdoutLog output destination otlp requires otlp_endpoint; both sends to stdout and OTLP Values: stdout, otlp, both.
otlp_endpointstringnoneOTLP gRPC endpoint for telemetry export Required when output is otlp or both Requires output=otlp.
log_buffer_sizeint0Ring buffer entries for log queries 0 disables the ring buffer Range: 0–10000000.
auditbool (optional)trueEnable audit log class (always displayed regardless of log level) Audit-class events (SFTP, bastion, admin CLI) bypass level filtering when enabled

DNS

TOML: [dns] · Env: HEXON_DNS_<KEY>

KeyTypeDefaultDescription
timeoutduration5sDNS query timeout
cache_ttlduration5mCache TTL, used when server TTL is unavailable or cache_override is true
cache_overrideboolfalseIgnore DNS server TTL and always use cache_ttl value
dnssec_strictboolfalseFail DNS queries if DNSSEC is requested but the zone is not signed
dnssec_full_validationboolfalsePerform full cryptographic RRSIG/DNSKEY/DS chain-of-trust verification Recommended with DoT/DoH for maximum security; disabling trusts the resolver AD bit
dnssec_sha1_policystringwarnControls how SHA-1 usage in DNSSEC is handled Rejecting SHA-1 may break zones still using NSEC3-SHA1 Values: allow, warn, deprecate, reject.
resolvers[]stringDNS resolver addresses for the infrastructure DNS module Separate from cluster.cluster_dns_resolvers. Empty = use OS resolver. Port defaults to :53
dot_enabledboolfalseEnable DNS-over-TLS for encrypted DNS queries RFC 7858.
dot_portint853DNS-over-TLS port RFC 7858 mandates port 853 for interoperability RFC 7858.
dot_verify_server_certbooltrueVerify TLS server certificates for DoT connections Disabling is not recommended as it removes authentication of DNS servers RFC 7858.
dot_connection_pool_enabledbooltrueEnable TLS connection pooling for DoT resolvers Reduces TLS handshake overhead when querying same resolvers Requires dot_enabled=true.
dot_connection_pool_max_sizeint100Maximum pooled connections per resolver Maximum persistent TLS connections to DoT resolvers Requires dot_connection_pool_enabled=true.
dot_connection_pool_idle_timeoutduration5mClose idle pooled connections after this duration Requires dot_connection_pool_enabled=true.
flatten_cnamebooltrueFollow CNAME chains to resolve final A/AAAA records RFC 1034.
max_cname_depthint16Maximum CNAME chain depth to prevent resolution loops RFC 1034 Section 3.6.2 recommends a limit of 16 Min: 1. RFC 1034.
health_check_enabledbool (optional)trueEnable periodic health checks on DNS resolvers
health_failure_thresholdint2Consecutive failures before marking a resolver unhealthy Min: 1.
health_check_intervalduration30sHealth check interval
health_check_querystringgoogle.comDomain name used for resolver health check queries
adaptive_selector_enabledbooltrueEnable intelligent performance-based resolver selection Selects fastest resolver based on observed latency
adaptive_exploration_ratefloat0.10Fraction of queries sent to non-optimal resolvers for exploration Higher values discover faster resolvers sooner but reduce short-term performance Range: 0.0–1.0.
adaptive_smoothing_factorfloat0.3Exponential moving average smoothing factor for latency tracking Higher values weight recent measurements more heavily Range: 0.0–1.0.
adaptive_min_sample_sizeint100Minimum query count per resolver before adaptive selection activates Min: 1.
adaptive_load_balance_enabledbooltrueDistribute queries across resolvers weighted by performance Requires adaptive_selector_enabled=true.

Health

TOML: [health] · Env: HEXON_HEALTH_<KEY>

KeyTypeDefaultDescription
enabledboolEnable health monitoring and endpoints
interfacestringNetwork interface name for health server IP address is resolved automatically from the interface Requires enabled=true.
portintnonePort for health endpoints (plain HTTP, no TLS) Required when health monitoring is enabled Range: 1–65535. Requires enabled=true.
allowed_cidrs[]string0.0.0.0/0Allowed CIDR ranges for health endpoint access Requires enabled=true.
check_intervalduration10sHealth check interval for component monitoring Range: 1s–1h. Requires enabled=true.
self_healing_enabledboolfalseEnable self-healing for listener restarts When enabled, automatically restarts failed listeners within configured limits Requires enabled=true.
max_listener_restartsint3Max listener restarts in window before giving up After this many restarts in restart_window, listener is left stopped Range: 0–1000. Requires self_healing_enabled=true.
restart_windowduration5mTime window for counting listener restarts Rolling window for counting restart attempts Min: 1s. Requires self_healing_enabled=true.
restart_backoff_multiplierfloat2.0Exponential backoff multiplier for restart delays Each restart delay = previous delay * multiplier; prevents rapid restart loops Range: 0–100. Requires self_healing_enabled=true.

Memory

TOML: [memory] · Env: HEXON_MEMORY_<KEY>

KeyTypeDefaultDescription
enabledbooltrueEnable the memory management module
leak_detection_enabledbooltrueEnable goroutine and memory leak detection Monitors goroutine count growth and memory allocation trends Requires enabled=true.
resource_management_enabledbooltrueEnable tracking and cleanup of idle resources Tracks idle HTTP connections, file handles, and temporary buffers Requires enabled=true.
goroutine_check_intervalduration30sHow often to check for goroutine leaks More frequent checks detect leaks faster but add minor overhead Requires leak_detection_enabled=true.
memory_check_intervalduration1mHow often to check memory usage against thresholds Compares heap usage against max_memory threshold Requires enabled=true.
cleanup_intervalduration5mHow often to run idle resource cleanup Runs idle resource cleanup; lower values free resources faster Requires resource_management_enabled=true.
max_memorystring1GBMaximum memory usage before triggering alerts e.g. 1GB, 512MB Requires enabled=true.
max_goroutinesint10000Maximum number of goroutines before triggering alerts Alert fires when goroutine count exceeds this; typical idle: 50-200 Range: 100–1000000. Requires leak_detection_enabled=true.
max_http_connectionsint5000Maximum number of HTTP connections before triggering alerts Alert fires when total HTTP connection count exceeds this Range: 100–100000. Requires enabled=true.
alert_intervalduration5mMinimum time between repeated memory/resource alerts Prevents alert flooding; one alert per interval per threshold Min: 1m. Requires enabled=true.
resource_timeoutduration30mMaximum idle time before a resource is eligible for cleanup Resources idle longer than this are eligible for cleanup Min: 5m. Requires resource_management_enabled=true.
max_resource_ageduration2hMaximum total age of a resource before forced cleanup regardless of activity Forces cleanup regardless of activity; prevents long-lived resource leaks Min: 30m. Requires resource_management_enabled=true.

SMTP

TOML: [smtp] · Env: HEXON_SMTP_<KEY>

KeyTypeDefaultDescription
hoststringSMTP server hostname Required by magic link, OTP email delivery, WebAuthn expiry reminders, X.509 renewal notifications, and VPN PSK reminders Required.
portint587SMTP server port 587 for STARTTLS, 465 for SSL, 25 for plain Range: 1–65535. Requires host.
encryptionstringnoneSMTP encryption mode Empty defaults to plaintext; always set ssl or starttls in production to protect credentials Values: ssl, starttls, none. Requires host.
userstringnoneSMTP authentication username SMTP AUTH username; leave empty if server does not require authentication Requires host.
fromstringnoneSender email address RFC 5322 sender address (e.g., noreply@example.com); required for email delivery Requires host.
reply_tostringnoneReply-To email address Reply-To address; defaults to From address if empty Requires host.
namestringnoneSender display name Display name shown in From header (e.g., Hexon Gateway) Requires host.
skip_tlsboolfalseSkip TLS certificate verification Skips server certificate validation for SSL/STARTTLS; NOT recommended for production — use only when the SMTP server presents an untrusted or mismatched certificate Requires host.

Notifications

TOML: [notify] · Env: HEXON_NOTIFY_<KEY>

KeyTypeDefaultDescription
digest_windowduration5mBatch window for digest notifications Batches notifications within this window into a single digest

Email notification settings (requires SMTP module)

TOML: [notify.email] · Env: HEXON_NOTIFY_EMAIL_<KEY>

KeyTypeDefaultDescription
enabledbooltrueEnable email notifications via existing SMTP module

Outgoing webhook endpoints for notifications

TOML: [notify.webhooks] · Env: HEXON_NOTIFY_WEBHOOKS_<KEY>

KeyTypeDefaultDescription
namestringUnique webhook name (used in notify_webhook param) Required.
formatstringgenericBuiltin payload format Values: slack, teams, discord, pagerduty, generic.
body_templatestringCustom Go text/template for JSON body (overrides format) Template variables: {{.Subject}}, {{.Body}}, {{.Severity}} (info/warning/critical), {{.Username}}, {{.Hostname}}, {{.Timestamp}} (RFC3339), {{.Metadata}} (map), {{.Items}} (digest list), {{.ItemCount}}. Helper: {{json .Field}} for JSON-safe escaping
content_typestringapplication/jsonHTTP Content-Type header
timeoutduration10sHTTP request timeout

ACME CA (Internal)

TOML: [acme] · Env: HEXON_ACME_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable ACME certificate authority server RFC 8555.
allowed_cidrs[]stringAllowed CIDRs for ACME API access If empty, no IP restrictions apply Requires enabled=true.
allowed_identifiers[]stringAllowed domain patterns for certificate issuance Supports wildcards; if empty, any domain allowed Requires enabled=true.
challenges_enabled[]stringhttp-01Enabled ACME challenge types Values: http-01, dns-01, tls-alpn-01. RFC 8555. Requires enabled=true.
challenge_validityduration15mChallenge validity period RFC 8555. Requires enabled=true.
dns_deterministicboolfalseEnable deterministic DNS challenges for internal domains Generates deterministic DNS challenge tokens from cluster_key HMAC Requires enabled=true.
dns_deterministic_cidrs[]stringCIDRs where deterministic DNS is allowed Only domains resolving within these CIDRs can use deterministic DNS Requires dns_deterministic.
nonce_validityduration15mNonce validity period for anti-replay protection RFC 8555. Requires enabled=true.
max_validityduration2160hMaximum certificate validity period 2160h=90 days, 8760h=1 year RFC 8555. Requires enabled=true.
default_validityduration2160hDefault certificate validity when client does not specify 720h=30 days, 2160h=90 days RFC 8555. Requires enabled=true.
max_san_countint100Maximum Subject Alternative Names per certificate Matches Let’s Encrypt limit Min: 0. Requires enabled=true.
enable_ip_identifiersbool (optional)trueAllow IP address identifiers in certificates IP challenges use http-01 or tls-alpn-01 only RFC 8738. Requires enabled=true.
caa_checkingboolfalseEnable CAA record checking before issuance Verifies DNS CAA records authorize this CA RFC 8659. Requires enabled=true.
caa_identifiers[]stringCAA identifiers that authorize this CA Defaults to service hostname if empty RFC 8659. Requires caa_checking.
rate_limit_orders_per_ipint50Maximum new orders per IP per hour Min: 0. Requires enabled=true.
rate_limit_certs_per_domainint50Maximum certificates per domain per week Min: 0. Requires enabled=true.
path_prefixstring/acmePath prefix for ACME endpoints Endpoints: {prefix}/directory, {prefix}/newNonce, etc. Requires enabled=true.
external_urlstringExternal URL for ACME directory responses Must end with path_prefix value. When empty, derived as https://<service.hostname><path_prefix> Requires enabled=true.
terms_of_servicestringnoneTerms of Service text served at /acme/tos URL to CA terms of service; displayed to ACME clients Requires enabled=true.
ocsp_enabledbool (optional)trueEnable OCSP responder endpoint Serves real-time certificate status at /acme/ocsp RFC 6960. Requires enabled=true.
ocsp_cache_ttlduration5mOCSP response cache TTL RFC 6960. Requires ocsp_enabled.
ocsp_cidrs[]string0.0.0.0/0,::/0Allowed CIDRs for OCSP endpoint RFC 6960. Requires ocsp_enabled.
crl_enabledbool (optional)trueEnable CRL distribution endpoint Serves Certificate Revocation List at /acme/crl RFC 5280. Requires enabled=true.
crl_cidrs[]string0.0.0.0/0,::/0Allowed CIDRs for CRL endpoint RFC 5280. Requires crl_enabled.
crl_next_updateduration48hCRL NextUpdate offset from ThisUpdate Determines client CRL cache lifetime RFC 5280. Requires crl_enabled.

Advanced multi-dimensional rate limiting configuration

TOML: [acme.rate_limits] · Env: HEXON_ACME_RATE_LIMITS_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable comprehensive rate limiting
orders_per_accountint5000Maximum orders per account within window Let’s Encrypt: 300 Min: 0. Requires enabled=true.
orders_per_account_windowduration3hSliding window for orders per account Requires enabled=true.
certs_per_domainint500Maximum certificates per registered domain (eTLD+1) within window Let’s Encrypt: 50; applies across all subdomains Min: 0. Requires enabled=true.
certs_per_domain_windowduration168hSliding window for certificates per domain Requires enabled=true.
certs_per_exact_setint50Maximum certificates for exact same domain set within window Let’s Encrypt: 5; prevents duplicate issuance Min: 0. Requires enabled=true.
certs_per_exact_set_windowduration168hSliding window for certificates per exact set Requires enabled=true.
auth_failures_per_domainint50Maximum authorization failures per domain within window Let’s Encrypt: 5; throttles misconfigured domains Min: 0. Requires enabled=true.
auth_failures_windowduration1hSliding window for authorization failures Requires enabled=true.
orders_per_ipint1000Maximum orders per IP address within window Let’s Encrypt: ~50; IPv6 grouped by /64 prefix Min: 0. Requires enabled=true.
orders_per_ip_windowduration1hSliding window for orders per IP Requires enabled=true.
failed_finalizations_per_orderint10Maximum failed finalization attempts per order Prevents CSR spam on a single order Min: 0. Requires enabled=true.
min_order_intervalduration100msMinimum interval between orders (global throttle) Prevents thundering herd scenarios Requires enabled=true.
buffer_percentint10Buffer percentage below limits to trigger warnings Warnings logged at (100-buffer)% capacity Range: 0–100. Requires enabled=true.
max_issued_at_entriesint10000Maximum timestamps to track per rate limit entity Higher values use more memory but improve precision Min: 0. Requires enabled=true.

ACME Client (External)

TOML: [acme_client] · Env: HEXON_ACMECLIENT_<KEY>

KeyTypeDefaultDescription
enabledboolEnable ACME client for automatic certificate management RFC 8555.
directory_urlstringhttps://acme-v02.api.letsencrypt.org/directoryACME directory URL RFC 8555. Requires enabled=true.
emailstringContact email for ACME account Requires enabled=true. Required.
accept_tosboolAccept CA Terms of Service Requires enabled=true. Required.
resetboolfalseDelete all ACME data on startup and start fresh Removes account, certificates, and keys Requires enabled=true.
renewal_thresholdduration720hRenew when cert expires within this duration 720h=30 days, 2160h=90 days Requires enabled=true.
renewal_check_intervalduration6hHow often to check for renewals Range: 1m–24h. Requires enabled=true.
challenge_portint80Port for HTTP-01 challenge server Range: 1–65535. RFC 8555. Requires enabled=true.
additional_domains[]stringAdditional domains beyond main service hostname Requires enabled=true.
auto_proxy_domainsbool (optional)trueAuto-include proxy mapping hosts in certificate Requires enabled=true.
key_typestringecdsa256Certificate key type Values: ecdsa256, ecdsa384, rsa2048, rsa4096. Requires enabled=true.
timeoutduration60sTimeout for ACME operations Range: 10s–5m. Requires enabled=true.
max_retriesint10Max issuance retries before marking domain as failed Range: 0–100. Requires enabled=true.
network_retriesint3Max retries for ACME network requests Range: 0–10. Requires enabled=true.
allow_bootstrap_fallbackbool (optional)trueAllow self-signed bootstrap certificate on ACME failure Generates temporary cert so server can start Requires enabled=true.
startup_timeoutduration60sMax time to wait for ACME on startup before fallback Range: 10s–5m. Requires enabled=true.
startup_retriesint3Retries within startup_timeout before fallback Range: 0–10. Requires enabled=true.
ari_enabledbool (optional)trueEnable ARI for optimal renewal timing Enables rate-limit-exempt renewals via CA-provided windows RFC 8739. Requires enabled=true.
ari_check_intervalduration6hHow often to refresh ARI data Range: 1m–24h. RFC 8739. Requires enabled=true.

Client-side rate limit tracking to avoid hitting CA limits

TOML: [acme_client.rate_limits] · Env: HEXON_ACMECLIENT_RATE_LIMITS_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable client-side rate limit tracking
orders_per_accountint300Max orders per account per window Min: 0. Requires enabled=true.
orders_windowduration3hOrders window duration Time window for counting certificate orders Requires enabled=true.
certs_per_domainint50Max certs per registered domain per window Min: 0. Requires enabled=true.
certs_per_domain_windowduration168hCerts per domain window duration 168h = 7 days Requires enabled=true.
certs_per_exact_setint5Max certs per exact domain set per window Min: 0. Requires enabled=true.
certs_per_exact_set_windowduration168hExact set window duration 168h = 7 days Requires enabled=true.
auth_failures_per_domainint5Max auth failures per domain per window Min: 0. Requires enabled=true.
auth_failures_windowduration1hAuth failures window duration Time window for counting authorization failures Requires enabled=true.
buffer_percentint10Percent of limit to reserve as safety margin Range: 0–90. Requires enabled=true.
min_order_intervalduration1sMin time between orders Minimum time between certificate order attempts Requires enabled=true.
max_retry_after_waitduration1hMax wait time before scheduling retry Maximum time to honor Retry-After headers from ACME server Requires enabled=true.
respect_retry_afterbool (optional)trueHonor server Retry-After header Requires enabled=true.

Authentication

TOML: [authentication] · Env: HEXON_AUTHENTICATION_<KEY>

One-Time Password (email OTP) configuration

TOML: [authentication.otp] · Env: HEXON_AUTHENTICATION_OTP_<KEY>

KeyTypeDefaultDescription
lengthint6OTP code length Range: 4–12.
typestringbase20OTP encoding type Values: numeric, base20.
validduration5mOTP validity duration
domains[]stringAllowed email domains for OTP delivery. Empty or [”*”] allows all domains Leave empty or set to * to allow any email domain
avoid_replaybooltrueDelete OTP after first use to prevent replay
resend_timeduration60sMinimum interval between OTP resend requests
max_retriesint5Maximum failed validation attempts before OTP invalidation Range: 0–100.
rate_limit_requestrate_limit10/1mRate limit for OTP requests
rate_limit_verifyrate_limit20/1mRate limit for OTP verification
mask_emailbool (optional)trueMask email address in MFA template When enabled, user@example.com shows as u***@example.com

TOTP authenticator app configuration

TOML: [authentication.totp] · Env: HEXON_AUTHENTICATION_TOTP_<KEY>

KeyTypeDefaultDescription
enabledboolEnable TOTP authenticator app
issuerstringHexonGatewayIssuer name shown in authenticator app (2-16 chars, no spaces) Range: 2–16. Requires enabled=true.
algorithmstringSHA1HMAC algorithm SHA1 required for Google Authenticator, Authy, and most apps. Changing after enrollment breaks existing codes Values: SHA1, SHA256, SHA512. Requires enabled=true.
digitsint6TOTP code digits Values: 6, 8. Requires enabled=true.
periodduration30sTOTP time step duration Requires enabled=true.
skewint1Allowed time skew steps Range: 0–2. Requires enabled=true.
recovery_codesint10Number of recovery codes Range: 0–20. Requires enabled=true.
recovery_code_lengthint6Length of each recovery code Range: 4–16. Requires enabled=true.
rate_limit_authrate_limit10/1mTOTP verification rate limit Requires enabled=true.

OpenID Connect Provider configuration

TOML: [authentication.oidc] · Env: HEXON_AUTHENTICATION_OIDC_<KEY>

KeyTypeDefaultDescription
enabledboolEnable OIDC provider Issuer URL derives from [service].hostname
signing_algorithmstringES256ID token signing algorithm ES256/384/512 (ECDSA) are compatible with Kubernetes kube-apiserver; EdDSA (Ed25519) is faster but not supported by all OIDC consumers Values: ES256, ES384, ES512, EdDSA. Requires enabled=true.
access_token_ttlduration1hAccess token lifetime Shorter TTLs improve security but increase token refresh traffic Range: 1m–24h. RFC 6749. Requires enabled=true.
refresh_token_ttlduration720hRefresh token lifetime RFC 6749. Requires enabled=true.
id_token_ttlduration1hID token lifetime RFC 7519. Requires enabled=true.
auth_code_ttlduration10mAuthorization code lifetime RFC 6749. Requires enabled=true.
refresh_token_rotationbooltrueRotate refresh tokens on each use Prevents refresh token replay attacks; disabling allows unlimited reuse of refresh tokens Requires enabled=true.
force_dpopboolfalseRequire DPoP proof-of-possession for all clients Binds tokens to the client’s key pair, preventing token theft RFC 9449. Requires enabled=true.
dpop_strict_replayboolfalseWait for cluster quorum on DPoP JTI storage Eliminates replay window but adds latency due to quorum write RFC 9449. Requires force_dpop=true.
dpop_proactive_noncebool (optional)trueSend DPoP-Nonce in all token responses Encourages nonce-based replay protection per RFC 9449 Section 8 RFC 9449. Requires force_dpop=true.
disable_wildcard_redirectsboolfalseDisable wildcard matching in redirect URIs Recommended for production to prevent open redirect attacks Requires enabled=true.
enable_test_clientboolfalseEnable built-in OIDC test client Exposes /_hexon/oidc/test endpoint for authorization code flow testing; disable in production Requires enabled=true.
groups_test_client[]stringGroups allowed to access the test client Empty means any authenticated user can access Requires enable_test_client=true.
rate_limit_authrate_limit100/1mAuthorization endpoint rate limit Requires enabled=true.
rate_limit_auth_coderate_limitPer-user-per-client auth code generation rate limit Empty means unlimited (not recommended); prevents auth code flooding per user per client Requires enabled=true.
rate_limit_tokenrate_limit60/1mToken endpoint rate limit Requires enabled=true.
rate_limit_introspectrate_limit300/1mIntrospection endpoint rate limit RFC 7662. Requires enabled=true.
device_code_ttlduration10mDevice code expiration RFC 8628. Requires enabled=true.
par_enabledbooltrueEnable Pushed Authorization Request endpoint PAR improves security by keeping authorization parameters server-side RFC 9126. Requires enabled=true.
par_requiredboolfalseRequire PAR for all authorization requests RFC 9126. Requires par_enabled=true.
par_ttlduration5mPAR request_uri lifetime Range: 1m–10m. RFC 9126. Requires par_enabled=true.
rate_limit_parrate_limitPAR endpoint rate limit Requires par_enabled=true.
enable_dcrboolfalseEnable Dynamic Client Registration (RFC 7591) Allows native OAuth clients to register dynamically via POST /oidc/register RFC 7591. Requires enabled=true.
rate_limit_dcrrate_limit10/1mDCR endpoint rate limit RFC 7591. Requires enable_dcr=true.
allow_dcr_from[]stringIP/CIDR allowlist for DCR endpoint Empty means allow from any IP. Restrict to trusted networks in production Requires enable_dcr=true.
allow_dcr_redirect_domains[]stringAllowed redirect URI domains for DCR clients Loopback always allowed. Use * to allow any HTTPS domain. Supports exact match and wildcard subdomains (*.example.com). Non-loopback requires HTTPS Requires enable_dcr=true.
disable_plain_pkcebool (optional)falseReject plain PKCE method, requiring S256 OAuth 2.1 recommends S256 only. Enable this to reject plain PKCE code challenges Requires enabled=true.
pat_enabledbool (optional)Enable Personal Access Tokens for CLI and automation When false (default), the PAT subsystem is completely disabled — no UI, no CLI, no API Requires enabled=true.
pat_max_ttlduration2160hMaximum PAT lifetime Default 90 days (2160h), maximum 365 days (8760h). Supports Go duration format. Requires enabled=true,pat_enabled=true.
pat_max_per_userint10Maximum active PATs per user Range: 1–100. Requires enabled=true,pat_enabled=true.
pat_required_groups[]stringGroups allowed to create PATs; empty allows any authenticated user User must have ANY of the listed groups to create or hold PATs Requires enabled=true,pat_enabled=true.

OIDC client configurations

TOML: [authentication.oidc.clients] · Env: HEXON_AUTHENTICATION_OIDC_CLIENTS_<KEY>

KeyTypeDefaultDescription
namestringUnique client identifier Required.
require_pkceboolfalseRequire Proof Key for Code Exchange Must be true for public clients (no client_secret) RFC 7636.
origin_urls[]stringAllowed CORS origins
redirect_urls[]stringAllowed OAuth redirect URIs after authentication
allow_auth_from[]string*Who can authenticate through this client Use * for any origin, or restrict to specific patterns
allow_client_from[]string0.0.0.0/0IP/CIDR allowlist for token endpoint access Restricts /token endpoint access by client IP; tighten to backend IP ranges for confidential clients
allowed_scopes[]stringScopes this client can request Values: openid, profile, email, groups, ssh_keys, certificates, wireguard.
skip_consentbool (optional)falseSkip consent screen for trusted first-party clients When true, authorization is granted silently for authenticated users. Not recommended for third-party clients
allowed_grant_types[]stringauthorization_code,refresh_tokenAllowed OAuth grant types Values: authorization_code, refresh_token, client_credentials, jwt-bearer. RFC 6749.
client_credentials_ttldurationToken TTL for machine-to-machine client credentials grant RFC 6749. Requires allowed_grant_types=client_credentials.
publicboolfalsePublic client (no secret required) For SPAs, native apps, and device code flow. Must enable require_pkce
jwt_public_keystringPEM-encoded public key for JWT bearer assertion verification RFC 7523. Requires allowed_grant_types=jwt-bearer.
jwt_algorithmstringES256JWT signature algorithm Values: RS256, RS384, RS512, ES256, ES384, ES512, EdDSA. RFC 7523. Requires allowed_grant_types=jwt-bearer.
jwt_issuerstringExpected issuer claim in JWT assertion Recommended for security — prevents token reuse across clients Requires allowed_grant_types=jwt-bearer.
jwt_subjectstringExpected subject claim in JWT assertion Requires allowed_grant_types=jwt-bearer.
token_endpoint_auth_methodstringclient_secret_basicClient authentication method at token endpoint Values: client_secret_basic, private_key_jwt, tls_client_auth. RFC 8705.
tls_client_auth_subject_dnstringExpected Subject DN for mTLS client certificate Must match Go pkix.Name.String() format, e.g. CN=client,O=Org,C=US RFC 8705. Requires token_endpoint_auth_method=tls_client_auth.
tls_client_auth_san_uristringExpected URI SAN in client certificate (spiffe:// or https://) RFC 8705. Requires token_endpoint_auth_method=tls_client_auth.
tls_client_auth_san_dnsstringExpected DNS SAN in client certificate RFC 8705. Requires token_endpoint_auth_method=tls_client_auth.
tls_client_auth_san_emailstringExpected Email SAN in client certificate RFC 8705. Requires token_endpoint_auth_method=tls_client_auth.
certificate_bound_tokensboolfalseBind issued tokens to the client certificate thumbprint Prevents token use without the original certificate RFC 8705. Requires token_endpoint_auth_method=tls_client_auth.
client_ca_pemstringCA PEM to verify client certificate issuer Inline PEM or file path. Per-client CA trust for defense-in-depth Requires token_endpoint_auth_method=tls_client_auth.

WebAuthn/Passkey authentication configuration

TOML: [authentication.webauthn] · Env: HEXON_AUTHENTICATION_WEBAUTHN_<KEY>

KeyTypeDefaultDescription
enabledboolEnable WebAuthn/Passkey authentication
rpidstringRelying Party ID (typically the domain) Requires enabled=true. Required.
originstringExpected origin URL for WebAuthn ceremonies Typically https://[service].hostname; exact origin match required Requires enabled=true. Required.
skip_port_checkbool (optional)trueSkip port check in origin validation Useful for K8s/Docker where external port differs from internal Requires enabled=true.
domainstringCookie domain for WebAuthn sessions Requires enabled=true.
namestringRelying Party display name shown to users Requires enabled=true.
typestringpreferredAuthenticator attachment preference platform=built-in (TouchID/Windows Hello), cross-platform=USB keys, preferred=any Values: platform, cross-platform, preferred. Requires enabled=true.
validityduration2160hPasskey validity duration 0 means no expiry. Users are reminded before expiry via email Requires enabled=true.
rate_limit_registerrate_limit5/1hPasskey registration rate limit Requires enabled=true.
rate_limit_authrate_limit20/1mPasskey authentication rate limit Requires enabled=true.
renewal_reminder_enabledbool (optional)trueEnable passkey expiration reminder emails Requires [smtp] to be configured; silently no-ops if SMTP is not set up Requires enabled=true.
renewal_reminder_intervalduration24hHow often to check for expiring passkeys Requires renewal_reminder_enabled.
renewal_reminder_beforeduration360hHow long before expiry to start sending reminders Requires renewal_reminder_enabled.
renewal_reminder_timeoutduration5mTimeout for each reminder check run Requires renewal_reminder_enabled.
renewal_reminder_retriesint3Retry count on transient reminder failures Requires renewal_reminder_enabled.
renewal_reminder_retry_delayduration30sDelay between reminder retries Requires renewal_reminder_enabled.

Kerberos authentication configuration

TOML: [authentication.kerberos] · Env: HEXON_AUTHENTICATION_KERBEROS_<KEY>

KeyTypeDefaultDescription
realmstringKerberos realm name Must be uppercase by convention
kdcstringPrimary Key Distribution Center address
kdc_fallback[]stringFallback KDC addresses for HA Tried in order if primary KDC fails Requires kdc.
ticket_ttlduration8hKerberos ticket lifetime for sessions
password_changeboolfalseEnable password change via kpasswd protocol Requires realm.
kpasswd_pathstringPath to kpasswd binary Auto-detected in PATH if not specified Requires password_change=true.
spnego_enabledboolfalseEnable SPNEGO/Negotiate browser SSO for domain-joined workstations Requires realm.
keytab_pathstringPath to service keytab file containing HTTP/<hostname>@REALM principal Requires spnego_enabled=true.
keytab_base64stringService keytab as base64 string (alternative to keytab_path, for K8s/containers) Requires spnego_enabled=true.
service_principalstringService principal name override Defaults to HTTP/<service.hostname> if empty Requires spnego_enabled=true.
spnego_auto_authboolfalseTransparent SPNEGO for proxy routes (like x509_auto_auth) Tries Negotiate challenge before OIDC redirect Requires spnego_enabled=true.
spnego_exclude_nets[]stringCIDRs to exclude from auto-SPNEGO challenges External/non-domain networks Requires spnego_auto_auth=true.

X.509 client certificate authentication

TOML: [authentication.x509] · Env: HEXON_AUTHENTICATION_X509_<KEY>

KeyTypeDefaultDescription
enabledboolEnable X.509 client certificate authentication
ca_pemstringTrusted CA certificate(s) in PEM format Can contain root + intermediate CAs. If omitted, only hexdcall ACME CA bundle is used Requires enabled=true.
ocsp_enabledboolfalseEnable OCSP revocation checking Requires enabled=true.
ocsp_urlstringOCSP responder URL Requires ocsp_enabled=true.
ocsp_url_fallback[]stringFallback OCSP URLs for HA Tried in order if primary OCSP responder fails Requires ocsp_enabled=true.
ocsp_cacheduration15mOCSP response cache duration Requires ocsp_enabled=true.
ocsp_timeoutduration5sOCSP HTTP request timeout Range: 1s–60s. Requires ocsp_enabled=true.
ocsp_soft_failbool (optional)trueAllow auth if OCSP responder unreachable Revoked certs are always blocked regardless of this setting Requires ocsp_enabled=true.
crl_enabledboolfalseEnable CRL revocation checking Requires enabled=true.
crl_urlstringCRL download URL Requires crl_enabled=true.
crl_url_fallback[]stringFallback CRL URLs for HA Tried in order if primary CRL URL fails Requires crl_enabled=true.
crl_refreshduration1hCRL refresh interval Requires crl_enabled=true.
crl_timeoutduration30sCRL download HTTP timeout Requires crl_enabled=true.
crl_max_sizestring0Maximum CRL size 0 means unlimited Requires crl_enabled=true.
enroll_enabledboolfalseEnable self-service certificate enrollment Requires enabled=true.
enroll_validityduration2160hCertificate validity duration Requires enroll_enabled=true.
enroll_algorithmstringECDSA-P256Key algorithm for enrolled certificates Values: ECDSA-P256, RSA-2048. Requires enroll_enabled=true.
enroll_pkcs12_profilestringLegacyDESPKCS#12 encryption profile LegacyDES uses 3DES (all macOS versions). Modern2023 uses AES-256 (requires macOS Ventura 13.0+ or Windows 10 v1607+) Values: LegacyDES, Modern2023. Requires enroll_enabled=true.
enroll_organizationstringHexon Authenticated UsersOrganization name in certificate Subject Requires enroll_enabled=true.
enroll_max_active_certsint10Maximum active certificates per user Oldest certificate is auto-revoked when limit is reached Range: 1–50. Requires enroll_enabled=true.
enroll_rate_limitrate_limit3/1hEnrollment rate limit per user Requires enroll_enabled=true.
revoke_rate_limitrate_limit5/1hRevocation rate limit per user Requires enroll_enabled=true.
enroll_p12_min_entropyint60Minimum entropy bits for PKCS#12 password Higher values enforce stronger passwords for certificate export Requires enroll_enabled=true.
enroll_auto_renewbool (optional)trueEnable automatic certificate renewal before expiry Renews silently; notification emails require [smtp] Requires enroll_enabled=true.
enroll_auto_renew_daysint15Days before expiry to trigger auto-renewal Must be less than enroll_validity in days Requires enroll_enabled=true.
enroll_auto_renew_intervalduration24hHow often to check for certificates needing renewal Min: 1h. Requires enroll_enabled=true.
enroll_auto_renew_timeoutduration5mTimeout for each renewal check run Requires enroll_enabled=true.
enroll_auto_renew_retriesint3Retry count on transient renewal failures Requires enroll_enabled=true.
enroll_auto_renew_retry_delayduration30sDelay between renewal retries Requires enroll_enabled=true.

Device Authorization Grant (RFC 8628)

TOML: [authentication.devicecode] · Env: HEXON_AUTHENTICATION_DEVICECODE_<KEY>

KeyTypeDefaultDescription
enabledboolEnable device authorization grant RFC 8628.
device_code_ttlduration10mDevice code validity duration RFC 8628. Requires enabled=true.
user_code_lengthint8User code length (BASE-20 encoding) 8 chars gives ~37 bits of entropy, sufficient for human-typed codes Range: 6–12. Requires enabled=true.
polling_intervalduration5sMinimum polling interval Clients polling faster receive slow_down error response (RFC 8628 §3.5) RFC 8628. Requires enabled=true.
rate_limit_authorizerate_limit10/1mDevice authorization endpoint rate limit Requires enabled=true.

SAML 2.0 Identity Provider configuration

TOML: [authentication.saml] · Env: HEXON_AUTHENTICATION_SAML_<KEY>

KeyTypeDefaultDescription
enabledboolEnable SAML 2.0 Identity Provider
assertion_ttlduration5mSAML assertion validity duration Requires enabled=true.
session_ttlduration8hSession duration for Single Logout tracking Requires enabled=true.
require_signed_requestsboolfalseRequire Service Providers to sign AuthnRequests Requires enabled=true.
sign_responsesbool (optional)trueSign full SAML Response XML Requires enabled=true.
sign_assertionsbool (optional)trueSign SAML Assertion within Response Requires enabled=true.
encrypt_assertionsboolfalseEncrypt assertions (requires SP certificate) SP must provide certificate_pem for encryption Requires enabled=true.
name_id_formatstringpersistentDefault NameID format for all SPs Values: persistent, transient, email, unspecified. Requires enabled=true.
rate_limit_ssorate_limitSSO endpoint rate limit Requires enabled=true.
rate_limit_slorate_limitSLO endpoint rate limit Requires enabled=true.
enable_test_clientboolfalseEnable built-in SAML test client Exposes /_hexon/saml/test endpoint for SP-initiated SSO testing; disable in production Requires enabled=true.
groups_test_client[]stringGroups allowed to access test client Requires enable_test_client=true.

Configured SAML Service Providers

TOML: [authentication.saml.service_providers] · Env: HEXON_AUTHENTICATION_SAML_SERVICE_PROVIDERS_<KEY>

KeyTypeDefaultDescription
namestringHuman-readable SP name Required.
entity_idstringSP entity ID (unique identifier) Required.
acs_urlstringAssertion Consumer Service URL Required.
slo_urlstringSingle Logout URL
certificate_pemstringSP certificate in PEM format for signature verification and encryption
name_id_formatstringOverride default NameID format for this SP Values: persistent, transient, email, unspecified.
allowed_groups[]stringGroups that can access this SP Empty means any authenticated user

SCIM 2.0 server for identity provisioning

TOML: [authentication.scim] · Env: HEXON_AUTHENTICATION_SCIM_<KEY>

KeyTypeDefaultDescription
enabledboolEnable SCIM 2.0 server
allow_from[]stringDefault IP/CIDR allowlist for SCIM clients Requires enabled=true.
rate_limitrate_limit100/1mDefault rate limit for SCIM clients Requires enabled=true.
max_resultsint100Default max items per page Max: 1000. Requires enabled=true.
default_resultsint20Default items per page when not specified Must not exceed max_results Requires enabled=true.

Per-client SCIM configurations

TOML: [authentication.scim.clients] · Env: HEXON_AUTHENTICATION_SCIM_CLIENTS_<KEY>

KeyTypeDefaultDescription
namestringClient identifier Required.
allow_from[]stringIP/CIDR allowlist (overrides global) Empty uses global allow_from default
rate_limitrate_limitRate limit (overrides global) Empty uses global rate_limit default
max_resultsintMax items per page (overrides global) 0 uses global max_results default
valid_fromstringToken valid from RFC3339 format. Empty means always valid
valid_untilstringToken valid until RFC3339 format. Empty means never expires

Identity

TOML: [identity] · Env: HEXON_IDENTITY_<KEY>

LDAP directory provider configuration

TOML: [identity.ldap] · Env: HEXON_IDENTITY_LDAP_<KEY>

KeyTypeDefaultDescription
urlstringLDAP server URL
url_fallback[]stringFallback LDAP URLs for HA, tried in order if primary fails
base_dnstringLDAP base distinguished name
user_attributestringPrimary user identifier attribute
user_base_dnstringBase DN for user searches
group_base_dnstringBase DN for group searches
user_filterstringLDAP filter for user searches RFC 4515 LDAP filter syntax. Common: (objectClass=posixAccount), (&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) for AD active users
delta_syncdurationDelta sync interval Only active when sync_mode=delta; requires delta_field to be set Requires sync_mode=delta.
delta_fieldstringLDAP attribute used for delta sync timestamps LDAP attribute used as watermark; modifyTimestamp is the standard choice Requires sync_mode=delta.
full_syncdurationFull sync interval
sync_modestringdeltaDirectory synchronization mode persistent=LDAP persistent search (real-time, requires server support). delta=poll using modifyTimestamp (delta_field). syncrepl=RFC 4533 sync replication (most efficient) Values: persistent, delta, syncrepl.
max_persistent_failuresintSwitch to delta sync after this many persistent search failures 0 means never fall back; after switching to delta sync, restart required to re-enable persistent search Range: 0–1000. Requires sync_mode=persistent.
nested_groupsboolEnable transitive nested group resolution Resolves groups recursively; can increase LDAP query load with deep hierarchies
page_sizeint100LDAP paged search result size Range: 0–10000.
ldap_connection_poolint5Number of pooled LDAP connections Range: 0–1000.
bind_dnstringBind DN for LDAP authentication
ignore_group_prefixes[]stringIgnore groups whose names start with these prefixes
ca_pemstringCustom CA certificate in PEM format for LDAP TLS verification Inline PEM or file path. When empty, system CA pool is used
search_timeoutduration30sTimeout for LDAP search operations
bind_timeoutduration10sTimeout for LDAP bind operations
connection_timeoutduration10sTimeout for new LDAP connection establishment
pool_wait_timeoutduration5sTimeout waiting for an available pool connection

LDAP attribute-to-user field mapping

TOML: [identity.ldap_attribute_map] · Env: HEXON_IDENTITY_LDAP_ATTRIBUTE_MAP_<KEY>

KeyTypeDefaultDescription
usernamestringnoneLDAP attribute for user identifier
full_namestringnoneLDAP attribute for user full name
emailstringnoneLDAP attribute for email address
given_namestringnoneLDAP attribute for given/first name
surnamestringnoneLDAP attribute for surname/last name
member_ofstringnoneLDAP attribute for group membership
cert_attributestringnoneLDAP attribute for user X.509 certificate
group_name_attrstringnoneRDN attribute to extract group name from group DNs Extracts ‘admins’ from ‘cn=admins,cn=groups,dc=example,dc=com’
account_lockstringnoneLDAP attribute indicating account lock status
password_expirystringnoneLDAP attribute for password expiration timestamp
modify_timestampstringnoneLDAP attribute for entry modification timestamp
create_timestampstringnoneLDAP attribute for entry creation timestamp
krb_principalstringnoneLDAP attribute for Kerberos principal name
krb_last_pwdstringnoneLDAP attribute for Kerberos last password change
employee_idstringnoneLDAP attribute for employee ID
titlestringnoneLDAP attribute for job title
phonestringnoneLDAP attribute for phone number

X.509 certificate subject field mapping

TOML: [identity.cert_subject_map] · Env: HEXON_IDENTITY_CERT_SUBJECT_MAP_<KEY>

KeyTypeDefaultDescription
usernamestringX.509 subject field to use as username Common values: cn, uid, emailAddress

External OIDC identity providers for federated login

TOML: [identity.oidc_providers] · Env: HEXON_IDENTITY_OIDC_PROVIDERS_<KEY>

KeyTypeDefaultDescription
namestringInternal provider identifier Required.
display_namestringUI display name, falls back to name if empty
iconstringUI icon URL or identifier for the provider
issuerstringOIDC issuer URL, must use HTTPS Required.
client_idstringOAuth 2.0 client identifier Required.
scopes[]stringopenid,profile,emailOAuth 2.0 scopes to request, must include openid
pkce_requiredbooltrueRequire Proof Key for Code Exchange Must be true for public clients (no client_secret) RFC 7636.
dpop_enabledboolEnable Demonstrating Proof of Possession token binding RFC 9449.
redirect_uris[]stringAllowed OAuth 2.0 callback URLs, exact match required Must use HTTPS except localhost for development RFC 6749.
dev_modeboolfalseEnable relaxed validation for development NEVER enable in production
suppress_error_detailsbooltrueHide internal error details in responses Defaults to true in production (non-dev) mode
clock_skew_toleranceduration2mAllowed clock skew for token validation Max: 5m.
strict_key_expiryboolfalseReject tokens signed with expired JWKS keys Enable to reject tokens when JWKS signing key has expired
required_amr[]stringRequired Authentication Method Reference values Empty means no AMR requirement
par_preferredbool (optional)truePrefer Pushed Authorization Requests when provider supports it RFC 9126.
timeoutduration30sHTTP client timeout for provider requests Range: 1s–60s.
discovery_ttlduration24hOIDC discovery document cache TTL Range: 1h–720h.

External SCIM identity providers for directory sync

TOML: [identity.scim_providers] · Env: HEXON_IDENTITY_SCIM_PROVIDERS_<KEY>

KeyTypeDefaultDescription
namestringInternal provider identifier, must be unique Required.
display_namestringUI display name, falls back to name if empty
enabledboolEnable this SCIM provider
priorityintMerge priority for multi-provider conflicts, lower wins Lower value = higher priority Range: 0–1000. Requires enabled=true.
base_urlstringSCIM server base URL, must use HTTPS in production Requires enabled=true. Required.
auth_typestringAuthentication method for SCIM API Values: bearer, basic, oauth2. Requires enabled=true. Required.
basic_usernamestringUsername for auth_type=basic Requires auth_type=basic.
oauth2_token_urlstringToken endpoint URL for auth_type=oauth2 Requires auth_type=oauth2.
oauth2_client_idstringClient ID for auth_type=oauth2 Requires auth_type=oauth2.
oauth2_scopestringscim.readOAuth2 scope for auth_type=oauth2 Requires auth_type=oauth2.
sync_intervalduration5mBackground incremental sync interval Range: 1m–24h. Requires enabled=true.
full_sync_intervalduration24hFull directory sync interval Range: 1h–168h. Requires enabled=true.
sync_modestringfullSynchronization strategy full=periodic full directory pull. incremental=poll for changes since last sync. push=webhook-driven from IdP. all=full+incremental+push combined Values: full, incremental, push, all. Requires enabled=true.
sync_usersbooltrueSync user resources from this provider Requires enabled=true.
sync_groupsbooltrueSync group resources from this provider Requires enabled=true.
sync_group_membersboolInclude member lists when syncing groups Requires enabled=true.
page_sizeint100SCIM list pagination page size Range: 0–1000. Requires enabled=true.
nested_groupsboolEnable transitive nested group resolution Requires enabled=true.
nested_groups_directionstringupDirection for nested group traversal up=resolve parent groups (user→team→dept). down=resolve child groups (dept→team→members). both=resolve in both directions Values: up, down, both. Requires nested_groups=true.
max_nesting_depthint10Maximum recursion depth for nested group resolution Range: 0–100. Requires nested_groups=true.
ca_pemstringCustom CA certificate in PEM format for TLS verification Requires enabled=true.
insecure_skip_verifyboolSkip TLS certificate verification NEVER enable in production Requires enabled=true.
timeoutduration30sHTTP client timeout for SCIM API requests Range: 1s–5m. Requires enabled=true.

Map SCIM attributes to internal directory fields

TOML: [identity.scim_providers.attribute_map] · Env: HEXON_IDENTITY_SCIM_PROVIDERS_ATTRIBUTE_MAP_<KEY>

KeyTypeDefaultDescription
usernamestringuserNameSCIM attribute for user identifier
full_namestringdisplayNameSCIM attribute for display name
emailstringemails[primary eq true].valueSCIM path expression for primary email SCIM path syntax: dot notation for nested (name.givenName), bracket filter for arrays (emails[primary eq true].value), [] for all items (groups[].display)
given_namestringname.givenNameSCIM path expression for given name
surnamestringname.familyNameSCIM path expression for family name
groupsstringgroups[].displaySCIM path expression for group membership
activestringactiveSCIM attribute for account active status
employee_idstringemployeeNumberSCIM attribute for employee ID
titlestringtitleSCIM attribute for job title
phonestringphoneNumbers[primary eq true].valueSCIM path expression for primary phone number
departmentstringurn:ietf:params:scim:schemas:extension:enterprise:2.0:User:departmentSCIM attribute for department Uses SCIM enterprise extension schema

Proxy

TOML: [proxy] · Env: HEXON_PROXY_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable the reverse proxy service
hostnamestringnoneHostname for proxy landing page Hostname only, no scheme or port Requires enabled=true.
header_userstringX-Hexon-UserHeader name for authenticated username Requires enabled=true.
header_mailstringX-Hexon-MailHeader name for authenticated user email Requires enabled=true.
header_namestringX-Hexon-NameHeader name for authenticated user full name Requires enabled=true.
header_groupsstringX-Hexon-GroupsHeader name for authenticated user groups Requires enabled=true.
gzipboolfalseEnable gzip compression for proxied responses Compresses proxied responses; negotiated via Accept-Encoding header Requires enabled=true.
brotli_supportbool (optional)trueEnable Brotli decode/reencode for HTML rewriting Requires enabled=true.
expose_circuit_statebool (optional)trueInclude X-Circuit-State header in 503 responses when circuit is open Requires enabled=true.
signing_enabledbooltrueEnable HMAC-SHA256 signing of auth headers Shared rotating HMAC key used by per-mapping sign_request=true. Disabling breaks all sign_request verifications Requires enabled=true.
signing_rotationduration15mHMAC signing key rotation interval Requires enabled=true.
verify_max_body_sizestring4KBMax request body size for signature verify endpoint Requires enabled=true.
verify_rate_limitstring100/1sRate limit for signature verify endpoint Requires enabled=true.
max_idle_connsint100Total idle connections across all backend hosts Requires enabled=true.
max_idle_conns_per_hostint50Idle connections per backend host Requires enabled=true.
max_conns_per_hostint100Max total connections per backend host Requires enabled=true.
idle_conn_timeoutduration90sIdle backend connection timeout Requires enabled=true.
response_header_timeoutduration30sTimeout waiting for backend response headers Requires enabled=true.
expect_continue_timeoutduration1sTimeout waiting for HTTP 100-Continue response Requires enabled=true.
tls_handshake_timeoutduration10sTLS handshake timeout with backends Requires enabled=true.
force_attempt_http2booltrueEnable HTTP/2 for backend connections Requires enabled=true.
cache_enabledboolfalseEnable in-memory response caching for static assets Requires enabled=true.
cache_sizestring100MBMaximum response cache size Requires cache_enabled=true.
cache_ttlduration5mResponse cache time-to-live Requires cache_enabled=true.
enable_http3boolfalseEnable HTTP/3 (QUIC) for backend connections Requires enabled=true.
http3_fallback_enabledbooltrueFall back to HTTP/2 or HTTP/1.1 if HTTP/3 fails Requires enable_http3=true.
default_0rttbooltrueEnable 0-RTT early data for backend HTTP/3 connections Requires enable_http3=true.
quic_idle_timeoutduration30sQUIC idle timeout for backend connections Requires enable_http3=true.
quic_max_streamsint100Max concurrent streams per QUIC backend connection Requires enable_http3=true.
maglev_table_sizeint65537Maglev consistent hash lookup table size Must be prime number; ~256KB memory per load balancer Min: 10007. Requires enabled=true.
proxy_protocolbool (optional)falseEnable HAProxy PROXY protocol for backend connections Requires enabled=true.
proxy_protocol_versionstringv2PROXY protocol version v1=text format, v2=binary format (more efficient) Values: v1, v2. Requires proxy_protocol.
disable_affinity_hosts[]stringnoneHostnames where cluster affinity forwarding is disabled Use for CDN, static content, stateless APIs Requires enabled=true.
group_refresh_intervalduration15mInterval for checking OIDC proxy session group membership changes Only applies to OIDC-authenticated proxy sessions. LDAP group changes reflected via directory sync. Set to 0 to disable Requires enabled=true.
bearer_cache_ttlduration5mCache TTL for verified JWT Bearer tokens Caches Ed25519 verification result. Set to 0 to disable. Per-mapping override available Requires enabled=true.

Array of reverse proxy route mappings

TOML: [proxy.mapping] · Env: HEXON_PROXY_MAPPING_<KEY>

KeyTypeDefaultDescription
appstringApplication display name Required.
hoststringFrontend hostname to match via SNI/Host header Required.
pathstringPath regex pattern to match Go regexp syntax; anchored with ^…$ automatically. Use /api/.* not /api/. Literal dots need escaping: /api/v1.0/. Required.
allowed_methods[]stringAllowed HTTP methods; empty allows all Empty allows all HTTP methods Values: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH.
priorityintnoneRoute matching priority nil (omit)=auto-calculated from path specificity. 0-1000=auto range. >1000=manual override, higher wins. Most specific path should have highest priority
service[]stringBackend service URLs Required.
authboolfalseRequire authentication for this mapping Requires [authentication] to be configured
auth_flowstringnoneNamed auth flow profile References [auth_flow.name]. Defaults to ‘default’ when omitted. Requires auth=true
oidc_providers[]stringinternalOIDC providers for authentication Provider names from [authentication.oidc] clients. Requires auth=true Requires auth=true.
mtlsboolfalseRequire client certificate (mTLS) for this mapping Uses mapping cert/key if set, falls back to service certificate. Configure x509.ca_pem for client CA trust
lb_strategystringadaptiveLoad balancing algorithm for multiple backends Values: adaptive, round_robin, weighted, least_connections, hash, random, maglev.
lb_hash_keystringnoneHash key source for hash/maglev strategies Used with lb_strategy=hash or lb_strategy=maglev. Variables: header:<name>, cookie:<name>, query:<param>, ip, uri Requires lb_strategy=hash.
lb_weights[]intnoneBackend weights for weighted strategy Must match service count; only valid with lb_strategy=weighted Min: 1. Requires lb_strategy=weighted.
maglev_table_sizeint65537Maglev lookup table size override Only valid with lb_strategy=maglev; must be prime Min: 10007. Requires lb_strategy=maglev.
dns_discoveryboolfalseEnable STRICT_DNS service discovery mode Resolves single service hostname to multiple endpoints; requires exactly one service URL
dns_refreshdurationnoneDNS refresh interval for service discovery Default respects TTL Min: 5s. Requires dns_discovery=true.
groups[]stringnoneRequired group memberships for access Group names from [identity] directory. Requires auth=true
allowed_subnets[]stringnoneRestrict access to specific CIDR subnets Empty allows all client IPs
add_auth_headersboolfalseAdd X-Hexon-User/Mail/Name/Groups headers to backend requests Injects X-Hexon-User/Mail/Name/Groups headers to backend
add_bearerboolfalseInject signed JWT Bearer token into backend requests Backend must trust HexonGateway OIDC issuer. Verify via /oidc/cert JWKS endpoint
forward_request_headersbooltrueForward original client request headers to backend Forward all original request headers to backend
forward_response_headersbooltrueForward backend response headers to client Forward all backend response headers to client
allow_upgradeboolfalseAllow WebSocket and HTTP upgrade requests
host_headerstringnoneOverride Host header sent to backend Overrides Host header sent to backend; empty uses original request host
cookie_domainstringnoneCookie domain for OIDC session Use leading dot for multi-subdomain; must have at least two labels
tls_checkboolfalseVerify backend TLS certificates When false, skips TLS certificate verification for this backend
rewrite_hosts[][2]stringnoneHost rewriting rules as [from, to] pairs Array of [from, to] pairs. Rewrites Location headers and HTML href/src attributes in responses
folderstringnoneFolder for grouping mappings in the UI
tags[]stringnoneTags for search and filtering in the UI UI metadata only; does not affect routing or access control
displaybool (optional)trueShow this mapping in the portal and access list Set to false to hide API-only or internal mappings from the user portal
audiencestringnoneAudience claim for header signing Defaults to service URL if not set
disable_rate_limitboolfalseBypass global rate limiting for this mapping
rate_limitstringnoneCustom rate limit override for this mapping Per-mapping rate limit; overrides global protection.rate_limit
disable_size_limitboolfalseBypass global size limiting for this mapping
max_bytesstringnoneCustom max request body size override Per-mapping body size limit; overrides global protection.max_bytes
disable_cacheboolfalseBypass response caching for this mapping
disable_powboolfalseBypass proof-of-work protection for this mapping
dnssecbool (optional)noneOverride DNSSEC validation for this mapping’s backend resolution Inherits from global proxy setting when not set
dns_resolvers[]stringnoneOverride DNS resolvers for this mapping’s backend resolution
rewrite_hostbool (optional)trueEnable URL rewriting in HTML responses When false, HTML responses are streamed without rewriting href/src attributes — use for SSE or binary content
inject_toolbarbool (optional)trueInject logout toolbar into HTML responses Only effective when auth=true
brotli_supportbool (optional)noneOverride global Brotli decode/reencode for this route Inherits from global proxy setting when not set
cobrowseboolfalseEnable co-browse capability for this mapping
cobrowse_mask_inputsbool (optional)trueMask all input field values in co-browse replay Requires cobrowse=true.
cobrowse_block_selectorstringnoneCSS selector to block from co-browse recording Requires cobrowse=true.
max_idle_conns_per_hostintnoneOverride idle connections per backend host Inherits from global setting when not set
max_conns_per_hostintnoneOverride max connections per backend host Inherits from global setting when not set
idle_conn_timeoutdurationnoneOverride idle connection timeout
response_header_timeoutdurationnoneOverride response header timeout
expect_continue_timeoutdurationnoneOverride HTTP 100-Continue timeout
tls_handshake_timeoutdurationnoneOverride TLS handshake timeout
force_attempt_http2bool (optional)noneOverride HTTP/2 backend connection setting Inherits from global proxy setting when not set
enable_http3bool (optional)noneOverride HTTP/3 (QUIC) for this backend Inherits from global proxy setting when not set
force_http3boolfalseForce HTTP/3 only, fail if unavailable Requires enable_http3=true Requires enable_http3.
enable_0rttbool (optional)noneOverride 0-RTT early data for this backend Inherits from global proxy setting when not set Requires enable_http3.
protocol_preferencestringautoHTTP protocol version preference Values: prefer_http3, prefer_http2, force_http3, auto.
proxy_protocolbool (optional)noneOverride HAProxy PROXY protocol for this backend Inherits from global proxy setting when not set
sign_requestboolfalseEnable HMAC request signing for backend verification
sign_request_max_bodystring10MBMax body size to include in request signature Use 0 to skip body hashing
bearer_cache_ttldurationnoneOverride Bearer token cache TTL for this mapping Inherits from global proxy setting when not set. Set to 0 to disable caching
grpcboolfalseEnable gRPC mode with streaming, trailer extraction, and gRPC-aware circuit breaker
sitestringnoneConnector site ID for remote proxying When set, requests route through the named connector tunnel instead of direct backend connection. Site must be defined in [connector.sites]
expose_circuit_statebool (optional)noneOverride X-Circuit-State header exposure for this mapping Inherits from global proxy setting when not set
geo_enabledbool (optional)noneOverride service-level geo-IP access check Inherits from global proxy setting when not set
geo_allow_countries[]stringnoneOverride allowed countries (replaces global list) ISO 3166-1 alpha-2 codes
geo_deny_countries[]stringnoneOverride denied countries (replaces global list) ISO 3166-1 alpha-2 codes
geo_allow_asn[]stringnoneOverride allowed ASNs for this mapping
geo_deny_asn[]stringnoneOverride denied ASNs for this mapping
geo_bypass_cidr[]stringnoneAdditional geo bypass CIDRs (merged with service level)
geo_deny_codeintnoneOverride HTTP status code for geo denial Inherits from global setting when not set Range: 400–599.
geo_deny_messagestringnoneOverride denial message for geo-blocked requests Inherits from global setting when not set
time_enabledbool (optional)noneOverride service-level time-based access check Inherits from global proxy setting when not set
time_bypass_cidr[]stringnoneAdditional time-check bypass CIDRs (merged with service level)
time_deny_codeintnoneOverride HTTP status code for time-based denial Inherits from global setting when not set Range: 400–599.
time_deny_messagestringnoneOverride denial message for time-blocked requests Inherits from global setting when not set
time_default_timezonestringnoneOverride default timezone for time checks Inherits from global setting when not set
time_default_allow_days[]stringOverride default allowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
time_default_deny_days[]stringOverride default denied days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
time_default_allow_hoursstringnoneOverride default allowed hours range Format: HH:MM-HH:MM
time_default_deny_hoursstringnoneOverride default denied hours range Format: HH:MM-HH:MM
permissions_policystringnonePermissions-Policy response header override Empty=inherit from backend, dash=strip, value=override
referrer_policystringnoneReferrer-Policy response header override Empty=inherit from backend, dash=strip, value=override

Just-In-Time 2FA configuration

TOML: [proxy.mapping.jit2fa] · Env: HEXON_PROXY_MAPPING_JIT2FA_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable JIT-2FA for this mapping
inject_credentialsbool (optional)trueEncrypt and replay credentials to backend after OTP When false, backend must trust auth headers (requires add_auth_headers=true) Requires enabled=true.
login_urlstringRedirect URL when user is not authenticated Requires enabled=true. Required.
login_path_regexstringRegex to match login POST requests Requires enabled=true. Required.
logout_path_regexstringRegex to match logout requests Requires enabled=true.
username_fieldstringusernameForm field name for username Requires enabled=true.
password_fieldstringpasswordForm field name for password Requires enabled=true.
error_no_emailstringnoneError message when webhook returns no email Empty uses built-in default message Requires enabled=true.
error_credentialsstringnoneError message for invalid credentials Empty uses built-in default message Requires enabled=true.
error_otp_expiredstringnoneError message when OTP code expires Empty uses built-in default message Requires enabled=true.
error_otp_invalidstringnoneError message for invalid OTP code Empty uses built-in default message Requires enabled=true.
error_max_retriesstringnoneError message when max OTP retries exceeded Empty uses built-in default message Requires enabled=true.
cookie_namestringjit2fa_keyCookie name for session key storage Requires enabled=true.
cookie_pathstring/Cookie path Requires enabled=true.
cookie_domainstringCookie domain (empty = current domain) Requires enabled=true.
session_ttlduration8hAuthenticated session time-to-live Requires enabled=true.

Webhook configuration for credential validation

TOML: [proxy.mapping.jit2fa.webhook] · Env: HEXON_PROXY_MAPPING_JIT2FA_WEBHOOK_<KEY>

KeyTypeDefaultDescription
urlstringWebhook URL for credential validation Required.
methodstringPOSTHTTP method for webhook request Values: GET, POST, PUT.
request_formatstringjsonRequest body encoding format query format requires method=GET Values: json, query, form.
username_paramstringusernameParameter name for username in query/form formats Requires request_format=query.
password_paramstringpasswordParameter name for password in query/form formats Requires request_format=query.
body_templatestringCustom request body template for POST/PUT Supports {{username}} and {{password}} placeholders Requires request_format=json.
timeoutduration5sWebhook request timeout Range: 1s–60s.
success_fieldstringJSONPath to success field in response JSONPath syntax: $.field, $.nested.field, $.array[0].field. Either success_field or success_regex is required
success_valuestringExpected value for success field Exact string match against the JSONPath result. Required when using success_field
extract_emailstringJSONPath to email field in response JSONPath syntax: $.field, $.nested.field. Either extract_email or email_regex is required
success_regexstringRegex pattern to detect successful authentication Fallback for non-JSON responses; either this or success_field required
email_regexstringRegex with capture group to extract email from response Must have at least one capture group
tls_skip_verifybool (optional)falseSkip TLS certificate verification for webhook
tls_certstringClient certificate for mTLS to webhook (PEM) Must be specified together with tls_key
tls_castringCustom CA certificate for webhook TLS verification (PEM)
max_idle_connsint50Total idle connections in pool Range: 0–1000.
max_idle_conns_per_hostint20Idle connections per host Range: 0–200.
force_attempt_http2bool (optional)trueForce HTTP/2 connection attempts
disable_compressionbool (optional)trueDisable transport compression Auth payloads are too small to benefit from compression
write_buffer_sizestring32KBHTTP transport write buffer size
read_buffer_sizestring32KBHTTP transport read buffer size
dial_timeoutduration30sTCP dial timeout for webhook connections Range: 1s–120s.
keep_aliveduration30sTCP keepalive interval for webhook connections Range: 0s–300s.

OTP generation and validation settings

TOML: [proxy.mapping.jit2fa.otp] · Env: HEXON_PROXY_MAPPING_JIT2FA_OTP_<KEY>

KeyTypeDefaultDescription
lengthint6OTP code length Range: 4–12.
typestringOTP code type Empty = use global OTP type config Values: numeric, base20.
validduration5mOTP validity duration Range: 1m–30m.
max_retriesint3Maximum OTP entry attempts before lockout Range: 1–10.
resend_timeduration30sInterval before OTP resend is allowed Range: 10s–5m.
rate_limitrate_limit10/1mRate limit for OTP verification attempts

Envoy-style outlier detection for endpoint ejection

TOML: [proxy.mapping.outlier_detection] · Env: HEXON_PROXY_MAPPING_OUTLIER_DETECTION_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable outlier detection for endpoint ejection Auto-enabled when multiple backends are configured
consecutive_5xxint5Eject endpoint after N consecutive 5xx responses Min: 1. Requires enabled=true.
consecutive_gateway_failureint3Eject endpoint after N consecutive 502/503/504 responses Min: 1. Requires enabled=true.
consecutive_local_origin_failureint5Eject endpoint after N consecutive connection failures Min: 1. Requires enabled=true.
intervalduration10sOutlier detection evaluation interval Min: 1s. Requires enabled=true.
base_ejection_timeduration30sInitial ejection duration before re-evaluation Min: 1s. Requires enabled=true.
max_ejection_timeduration5mMaximum ejection duration cap Min: 1s. Requires enabled=true.
max_ejection_percentint50Max percentage of endpoints that can be ejected simultaneously Range: 0–100. Requires enabled=true.
success_rate_minimum_hostsint3Min healthy hosts required for success rate calculation Min: 1. Requires enabled=true.
success_rate_request_volumeint100Min requests per host required for success rate calculation Min: 1. Requires enabled=true.
success_rate_stdev_factorint1900Standard deviation factor x1000 for success rate ejection 1900 means 1.9 standard deviations Min: 0. Requires enabled=true.
failure_percentage_thresholdint50Eject endpoint if failure percentage exceeds this value Range: 0–100. Requires enabled=true.
failure_percentage_minimum_hostsint3Min hosts required for failure percentage calculation Min: 1. Requires enabled=true.
failure_percentage_request_volumeint50Min requests required for failure percentage calculation Min: 1. Requires enabled=true.

Active health check configuration for backend probing

TOML: [proxy.mapping.health_check] · Env: HEXON_PROXY_MAPPING_HEALTH_CHECK_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable active health checking for backends Probes backends on a schedule to detect failures before traffic is affected
typestringhttpHealth check protocol Values: tcp, http, http3, grpc.
pathstring/healthHTTP path for health check requests Requires type=http,type=http3.
methodstringGETHTTP method for health check requests Values: GET, HEAD. Requires type=http,type=http3.
expected_status[]intnoneExpected HTTP status codes from healthy backends. Empty means any non-5xx response is healthy. Range: 100–599. Requires type=http,type=http3.
grpc_servicestringnonegRPC service name for grpc.health.v1.Health/Check Empty checks the overall server health Requires type=grpc.
intervalduration10sInterval between health check probes Min: 1s.
timeoutduration5sTimeout per health check probe Min: 100ms.
unhealthy_thresholdint3Consecutive failures before marking backend unhealthy Min: 1.
healthy_thresholdint2Consecutive successes before marking backend healthy Min: 1.
tls_skip_verifybool (optional)noneSkip TLS certificate verification for health checks Inherits from mapping tls_check when not set

Override circuit breaker settings for this mapping

TOML: [proxy.mapping.circuit_breaker] · Env: HEXON_PROXY_MAPPING_CIRCUIT_BREAKER_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable circuit breaker for backend health tracking
error_ratio_thresholdfloat0.25Trip circuit if 5xx error ratio exceeds this threshold Range: 0.0–1.0. Requires enabled=true.
error_ratio_windowduration10sRolling window for error ratio calculation Requires enabled=true.
latency_p95_thresholdduration1sTrip circuit if P95 latency exceeds this duration Requires enabled=true.
latency_p99_thresholddurationnoneTrip circuit if P99 latency exceeds this duration Requires enabled=true.
network_error_thresholdfloat0.15Trip circuit if network error ratio exceeds this threshold Range: 0.0–1.0. Requires enabled=true.
fallback_durationduration30sDuration the circuit stays open before entering half-open Requires enabled=true.
recovery_durationduration10sDuration in half-open state before deciding to close or re-open Requires enabled=true.
success_thresholdint2Successful requests needed in half-open state to close circuit Min: 1. Requires enabled=true.
response_codeint503HTTP status code returned when circuit is open Range: 400–599. Requires enabled=true.
fallback_modestringerrorHow to handle requests when circuit is open Values: error, service. Requires enabled=true.
fallback_service[]stringnoneBackend URLs for fallback when mode is service Required when fallback_mode=service Requires fallback_mode=service.
fallback_sitestringnoneConnector site ID for fallback backend routing When set, fallback requests route through the named connector tunnel. Site must be defined in [connector.sites] Requires fallback_mode=service.
fallback_timeoutduration5sTimeout for fallback service requests Requires fallback_mode=service.
include_fallback_headerbool (optional)trueInclude X-Circuit-Breaker and Retry-After headers in responses Requires enabled=true.
combine_modestringorHow to combine trigger conditions or=any condition trips, and=all must trip Values: or, and. Requires enabled=true.
trip_expressionstringnoneCustom boolean expression for circuit trip evaluation expr-lang boolean expression. Variables: error_rate, success_rate, latency_p50/p95/p99/avg (seconds), network_error_rate, timeout_rate, status_5xx_rate, status_4xx_rate, requests_total, requests_per_second. gRPC: grpc_error_rate, grpc_success_rate, grpc_unavailable_rate, grpc_internal_rate, grpc_timeout_rate, grpc_requests_total. Overrides threshold-based evaluation when set Requires enabled=true.
grpc_health_checkbool (optional)falseEnable active gRPC health checks using grpc.health.v1 protocol Requires enabled=true.
grpc_health_check_intervalduration10sInterval between gRPC health check probes Min: 1s. Requires grpc_health_check.
grpc_health_check_timeoutduration5sTimeout per gRPC health check probe Min: 100ms. Requires grpc_health_check.

Override time windows with country/CIDR-specific schedules

TOML: [proxy.mapping.time_windows] · Env: HEXON_PROXY_MAPPING_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

Shadow/mirror targets for request duplication

TOML: [proxy.mapping.shadow] · Env: HEXON_PROXY_MAPPING_SHADOW_<KEY>

KeyTypeDefaultDescription
namestringUnique identifier for this shadow target Required.
servicestringShadow target URL Required.
host_headerstringnoneOverride Host header sent to shadow target
timeoutdurationnoneOverride request timeout for this shadow
max_body_sizestringnoneOverride max body size for this shadow
add_headersbool (optional)noneOverride X-Hexon-Shadow-* header injection Inherits from global proxy setting when not set
sitestringnoneConnector site ID for remote shadow target When set, shadow requests route through the named connector tunnel. Site must be defined in [connector.sites]

Sampling rate for shadow requests

TOML: [proxy.mapping.shadow.runtime_fraction] · Env: HEXON_PROXY_MAPPING_SHADOW_RUNTIME_FRACTION_<KEY>

KeyTypeDefaultDescription
percentintnoneSampling percentage of requests to mirror Range: 0–100.
numeratorintnoneFractional sampling numerator Use with denominator for precise low rates, e.g. 1/1000 = 0.1% Min: 0.
denominatorintnoneFractional sampling denominator Must be >= numerator Min: 1.

Default health check applied to all mappings without explicit health_check config. Active by default even without this section.

TOML: [proxy.default_health_check] · Env: HEXON_PROXY_DEFAULT_HEALTH_CHECK_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable active health checking for backends Probes backends on a schedule to detect failures before traffic is affected
typestringhttpHealth check protocol Values: tcp, http, http3, grpc.
pathstring/healthHTTP path for health check requests Requires type=http,type=http3.
methodstringGETHTTP method for health check requests Values: GET, HEAD. Requires type=http,type=http3.
expected_status[]intnoneExpected HTTP status codes from healthy backends. Empty means any non-5xx response is healthy. Range: 100–599. Requires type=http,type=http3.
grpc_servicestringnonegRPC service name for grpc.health.v1.Health/Check Empty checks the overall server health Requires type=grpc.
intervalduration10sInterval between health check probes Min: 1s.
timeoutduration5sTimeout per health check probe Min: 100ms.
unhealthy_thresholdint3Consecutive failures before marking backend unhealthy Min: 1.
healthy_thresholdint2Consecutive successes before marking backend healthy Min: 1.
tls_skip_verifybool (optional)noneSkip TLS certificate verification for health checks Inherits from mapping tls_check when not set

Default circuit breaker settings for all routes

TOML: [proxy.circuit_breaker] · Env: HEXON_PROXY_CIRCUIT_BREAKER_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable circuit breaker for backend health tracking
error_ratio_thresholdfloat0.25Trip circuit if 5xx error ratio exceeds this threshold Range: 0.0–1.0. Requires enabled=true.
error_ratio_windowduration10sRolling window for error ratio calculation Requires enabled=true.
latency_p95_thresholdduration1sTrip circuit if P95 latency exceeds this duration Requires enabled=true.
latency_p99_thresholddurationnoneTrip circuit if P99 latency exceeds this duration Requires enabled=true.
network_error_thresholdfloat0.15Trip circuit if network error ratio exceeds this threshold Range: 0.0–1.0. Requires enabled=true.
fallback_durationduration30sDuration the circuit stays open before entering half-open Requires enabled=true.
recovery_durationduration10sDuration in half-open state before deciding to close or re-open Requires enabled=true.
success_thresholdint2Successful requests needed in half-open state to close circuit Min: 1. Requires enabled=true.
response_codeint503HTTP status code returned when circuit is open Range: 400–599. Requires enabled=true.
fallback_modestringerrorHow to handle requests when circuit is open Values: error, service. Requires enabled=true.
fallback_service[]stringnoneBackend URLs for fallback when mode is service Required when fallback_mode=service Requires fallback_mode=service.
fallback_sitestringnoneConnector site ID for fallback backend routing When set, fallback requests route through the named connector tunnel. Site must be defined in [connector.sites] Requires fallback_mode=service.
fallback_timeoutduration5sTimeout for fallback service requests Requires fallback_mode=service.
include_fallback_headerbool (optional)trueInclude X-Circuit-Breaker and Retry-After headers in responses Requires enabled=true.
combine_modestringorHow to combine trigger conditions or=any condition trips, and=all must trip Values: or, and. Requires enabled=true.
trip_expressionstringnoneCustom boolean expression for circuit trip evaluation expr-lang boolean expression. Variables: error_rate, success_rate, latency_p50/p95/p99/avg (seconds), network_error_rate, timeout_rate, status_5xx_rate, status_4xx_rate, requests_total, requests_per_second. gRPC: grpc_error_rate, grpc_success_rate, grpc_unavailable_rate, grpc_internal_rate, grpc_timeout_rate, grpc_requests_total. Overrides threshold-based evaluation when set Requires enabled=true.
grpc_health_checkbool (optional)falseEnable active gRPC health checks using grpc.health.v1 protocol Requires enabled=true.
grpc_health_check_intervalduration10sInterval between gRPC health check probes Min: 1s. Requires grpc_health_check.
grpc_health_check_timeoutduration5sTimeout per gRPC health check probe Min: 100ms. Requires grpc_health_check.

DNS module usage settings for backend resolution

TOML: [proxy.dns] · Env: HEXON_PROXY_DNS_<KEY>

KeyTypeDefaultDescription
use_clusterboolfalseUse DNS module instead of system DNS for backend resolution
dnssecbool (optional)noneOverride cluster DNSSEC setting for proxy backends Only effective when use_cluster=true Requires use_cluster=true.
resolvers[]stringnoneOverride cluster DNS resolvers for proxy backends Only effective when use_cluster=true Requires use_cluster=true.

Global shadow/mirror defaults for request duplication

TOML: [proxy.shadow] · Env: HEXON_PROXY_SHADOW_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueGlobal enable/disable shadow mirroring
timeoutduration5sRequest timeout for shadow requests Requires enabled=true.
max_body_sizestring10MBMax request body size to buffer for shadow Requires enabled=true.
add_headersbool (optional)trueAdd X-Hexon-Shadow-* headers to shadow requests Requires enabled=true.
max_idle_connsint50Total idle connections in shadow transport pool Min: 0. Requires enabled=true.
max_idle_conns_per_hostint10Idle connections per shadow backend host Min: 0. Requires enabled=true.
max_conns_per_hostint100Max total connections per shadow backend host Min: 0. Requires enabled=true.
idle_conn_timeoutduration90sIdle shadow connection timeout Requires enabled=true.
tls_handshake_timeoutduration10sTLS handshake timeout for shadow backends Requires enabled=true.
tls_verifybool (optional)trueVerify TLS certificates of shadow backends Requires enabled=true.

Connection Pool

TOML: [connection_pool] · Env: HEXON_CONNECTIONPOOL_<KEY>

KeyTypeDefaultDescription
enabledbooltrueEnable optimized connection pools
max_pools_per_typeint10Maximum pools per type (HTTP/SQL/LDAP) Min: 1. Requires enabled=true.
metrics_collection_intervalduration30sHow often to collect pool metrics Requires enabled=true.
global_health_check_intervalduration60sGlobal health check interval across all pools Requires enabled=true.
default_connection_timeoutduration30sDefault connection timeout for new pools Requires enabled=true.
default_idle_timeoutduration5mDefault idle timeout before connection is reclaimed Requires enabled=true.
enable_adaptive_scalingbooltrueEnable adaptive pool scaling based on utilization Requires enabled=true.
enable_circuit_breakerbooltrueEnable circuit breaker for backend failure protection Requires enabled=true.
log_levelstringinfoLogging level for connection pool subsystem Values: debug, info, warn, error. Requires enabled=true.

HTTP-specific pool settings

TOML: [connection_pool.http] · Env: HEXON_CONNECTIONPOOL_HTTP_<KEY>

KeyTypeDefaultDescription
max_connectionsint100Maximum connections per pool Hard cap on total connections; increase for high-traffic backends Min: 1.
min_connectionsint10Minimum connections per pool Must be less than or equal to max_connections Min: 1.
connection_timeoutduration30sTimeout for establishing a new connection Includes DNS resolution and TCP handshake; increase for high-latency backends
idle_timeoutduration5mIdle time before a connection is closed Close idle connections after this duration to free resources
health_check_intervalduration1mInterval between pool health checks Lower values detect backend failures faster but increase probe traffic
scale_up_thresholdfloat0.8Utilization threshold to trigger pool scale-up Pool grows when usage exceeds this fraction of max_connections Range: 0–1.
scale_down_thresholdfloat0.3Utilization threshold to trigger pool scale-down Must be less than scale_up_threshold Range: 0–1.
max_scale_per_minuteint3Maximum scaling operations allowed per minute Prevents rapid pool resizing oscillation under fluctuating load Min: 1.
failure_thresholdint5Consecutive failures before opening circuit breaker Lower values trip faster but may cause false positives under transient errors Min: 1.
failure_windowduration1mTime window for counting failures Failures outside this window are not counted toward the threshold
recovery_timeoutduration30sTime to wait before attempting half-open state After this delay, one probe request is sent to test backend recovery
success_thresholdint3Consecutive successes to close circuit from half-open Higher values ensure backend stability before fully resuming traffic Min: 1.
max_idle_connsint200Total maximum idle connections across all hosts Global idle connection limit; excess idle connections are closed immediately Min: 1.
max_idle_conns_per_hostint50Maximum idle connections per host Per-host idle connection limit; higher values improve throughput to frequently accessed backends Min: 1.
max_conns_per_hostint100Maximum total connections per host Caps active plus idle connections; prevents a single backend from consuming all pool capacity Min: 1.
idle_conn_timeoutduration90sIdle connection timeout before closure Close idle connections after this duration to free resources
tls_handshake_timeoutduration10sTimeout for TLS handshake completion Increase for backends with slow certificate chain validation or OCSP stapling
response_header_timeoutduration30sTimeout waiting for response headers from backend Time from request sent to first response header received; does not limit body transfer
expect_continue_timeoutduration1sTimeout waiting for 100-Continue response Only applies to requests with Expect: 100-continue header
force_attempt_http2booltrueForce HTTP/2 connection attempts Uses HTTP/2 even with custom TLS config; disable if backends do not support HTTP/2
insecure_skip_verifyboolfalseSkip TLS certificate verification for backends Not recommended for production use
write_buffer_sizestring32KBWrite buffer size Tuned for high-throughput proxy
read_buffer_sizestring32KBRead buffer size Tuned for high-throughput proxy
disable_compressionbooltrueDisable HTTP transport compression Recommended true for proxy to avoid double compression
enable_metricsbooltrueEnable connection pool metrics collection Feeds pool utilization data to adaptive scaling and Prometheus exporter
metrics_intervalduration30sInterval between metrics collection cycles Lower values give finer-grained data but increase collection overhead

Subrequest

TOML: [subrequest] · Env: HEXON_SUBREQUEST_<KEY>

KeyTypeDefaultDescription
enabledboolEnable subrequest authentication endpoint Used by nginx auth_request or similar reverse proxy authentication
pathstring/authrequestPath for subrequest endpoint
group_paramstringgroupQuery parameter name for required group
allowed_origins[]stringAllowed origins for CORS-like protection Empty list allows all origins
header_userstringX-Hexon-UserResponse header name for username
header_emailstringX-Hexon-EmailResponse header name for email
header_namestringX-Hexon-NameResponse header name for full name
header_groupsstringX-Hexon-GroupsResponse header name for groups (comma-separated)

Forward Proxy

TOML: [forward_proxy] · Env: HEXON_FORWARDPROXY_<KEY>

KeyTypeDefaultDescription
enabledboolEnable QUIC forward proxy Provides browser-native VPN-like access using MASQUE (RFC 9298)
hostnamestringHostname for forward proxy connections Use when running behind a CDN that doesn’t support HTTP CONNECT; defaults to service hostname Requires enabled=true.
portint8443Dedicated port for forward proxy listener Must differ from service.port. Must be reachable by browsers (open firewall for this port) Range: 1–65535. Requires enabled=true. Required.
network_interfacestringNetwork interface to bind to Defaults to service.network_interface if not set Requires enabled=true.
public_portintPublic-facing port for PAC URL generation Use when behind NAT/load balancer; defaults to port value Range: 0–65535. Requires enabled=true.
preserve_client_portbool (optional)trueUse client connection port in Alt-Svc header When false, Alt-Svc advertises public_port instead Requires enabled=true.
certstringTLS certificate for forward proxy hostname File path or inline PEM; falls back to service certificate if not set Requires enabled=true.
auth_modestringsession_fingerprintAuthentication mode for forward proxy ‘none’ disables all authentication — the forward proxy becomes an open proxy; use only in controlled environments Values: session_fingerprint, none. Requires enabled=true.
session_cookiestringhexon_sessionSession cookie name Requires enabled=true.
fingerprint_bindingbooltrueEnable JA4Q fingerprint binding for session security Requires enabled=true.
fingerprint_binding_ttlduration8hFingerprint binding TTL Requires fingerprint_binding=true.
enable_tcpbooltrueEnable HTTP/3 CONNECT (RFC 9114) for TCP proxying Requires enabled=true.
enable_udpbooltrueEnable CONNECT-UDP (RFC 9298) for UDP proxying Requires enabled=true.
connect_timeoutduration10sBackend connection timeout Requires enabled=true.
idle_timeoutduration5mIdle connection timeout Requires enabled=true.
max_connection_durationduration24hMaximum connection lifetime Requires enabled=true.
rate_limit_per_userint1000Requests per second per user 0 means unlimited Min: 0. Requires enabled=true.
rate_limit_per_destinationint100Requests per second per destination 0 means unlimited Min: 0. Requires enabled=true.
bandwidth_limit_per_userstring100mbpsBandwidth limit per user Supports mbps, gbps, kbps, mb/s, gb/s, kb/s Requires enabled=true.
buffer_sizestring32KBTCP relay buffer size Requires enabled=true.
udp_buffer_sizestring1500BUDP buffer size Requires enabled=true.
max_http_response_sizestring512MBMaximum response body size for plain HTTP proxy requests Limits response body for non-CONNECT HTTP forwarding; 0 means unlimited Requires enabled=true.
proxy_protocolboolfalseEnable PROXY protocol for backend connections Disabled by default; most internet servers do not support PROXY protocol Requires enabled=true.
proxy_protocol_versionstringv2PROXY protocol version v1 is text format, v2 is binary format (more efficient) Values: v1, v2. Requires proxy_protocol=true.
udp_proxy_pathstring/masqueURL path for CONNECT-UDP requests Requires enabled=true.
token_ttlduration5mExtension token validity duration Min: 30s. Requires enabled=true.
token_refresh_intervalduration60sExtension token refresh interval Min: 5s. Requires enabled=true.
geo_enabledboolEnable geo-IP restrictions for forward proxy Overrides service-level geo settings when set Requires enabled=true.
geo_allow_countries[]stringISO 3166-1 alpha-2 country codes to allow Requires geo_enabled=true.
geo_deny_countries[]stringCountry codes to deny Takes precedence over allow list Requires geo_enabled=true.
geo_allow_asn[]stringASN numbers to allow Requires geo_enabled=true.
geo_deny_asn[]stringASN numbers to deny Takes precedence over allow list Requires geo_enabled=true.
geo_bypass_cidr[]stringnoneCIDRs that bypass geo checks Requires geo_enabled=true.
geo_deny_codeint403HTTP status code for geo denials Requires geo_enabled=true.
geo_deny_messagestringCustom denial message for geo-blocked requests Requires geo_enabled=true.
time_enabledboolEnable time-based restrictions for forward proxy Overrides service-level time settings when set Requires enabled=true.
time_timezonestringDefault timezone for time restrictions IANA timezone format Requires time_enabled=true.
time_allow_days[]stringAllowed days of the week Requires time_enabled=true.
time_deny_days[]stringDenied days of the week Takes precedence over allow list Requires time_enabled=true.
time_allow_hoursstringAllowed hours range Format: HH:MM-HH:MM Requires time_enabled=true.
time_deny_hoursstringDenied hours range Takes precedence over allow hours; format: HH:MM-HH:MM Requires time_enabled=true.
time_bypass_cidr[]stringnoneCIDRs that bypass time checks Requires time_enabled=true.
time_deny_codeint403HTTP status code for time denials Requires time_enabled=true.
time_deny_messagestringCustom denial message for time-blocked requests Requires time_enabled=true.

PAC (Proxy Auto-Configuration) file settings

TOML: [forward_proxy.pac] · Env: HEXON_FORWARDPROXY_PAC_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable PAC file endpoint Serves auto-generated PAC files for browser proxy configuration
pathstring/proxy.pacURL path for PAC file Requires enabled=true.
cache_ttlduration15mBrowser cache TTL for PAC file Min: 1m. Requires enabled=true.
use_firewall_targetsbooltrueUse firewall rules to determine proxy targets PAC file includes targets from firewall rules for the authenticated user Requires enabled=true.
groupstringGroup required to access PAC file If empty, any authenticated user can access; if set, only members of this group Requires enabled=true.

Per-country or per-CIDR time windows

TOML: [forward_proxy.time_windows] · Env: HEXON_FORWARDPROXY_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

Connector

TOML: [connector] · Env: HEXON_CONNECTOR_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable QUIC connector listener for remote site access
hostnamestringHostname for connector listener Use when running behind a CDN; defaults to service hostname Requires enabled=true.
portintDedicated QUIC port for connector connections Must differ from service.port and forward_proxy.port Range: 1–65535. Requires enabled=true. Required.
network_interfacestringNetwork interface to bind connector listener Defaults to service.network_interface if not set Requires enabled=true.
certstringTLS certificate for connector hostname File path or inline PEM; falls back to service certificate if not set Requires enabled=true.
handshake_timeoutduration10sMaximum time for connector handshake Requires enabled=true.
heartbeat_intervalduration30sInterval between heartbeat messages Requires enabled=true.
adaptive_min_sample_sizeint10Round-robin until N samples per instance Range: 1–1000. Requires enabled=true.
adaptive_exploration_ratefloat0.1Exploration rate (0.0-1.0) Range: 0.0–1.0. Requires enabled=true.
adaptive_smoothing_factorfloat0.3EMA smoothing factor for latency (0.0-1.0) Range: 0.0–1.0. Requires enabled=true.

Remote site definitions

TOML: [connector.sites] · Env: HEXON_CONNECTOR_SITES_<KEY>

KeyTypeDefaultDescription
idstringUnique site identifier Required.
namestringHuman-readable site name Required.
cidrs[]stringRestrict connector source IPs to these CIDR ranges Empty means any source IP is allowed
max_instancesint0Maximum concurrent connector instances 0 means unlimited Min: 0.
rebalancebool (optional)trueEnable cluster-wide connector load balancing Soft-rejects excess connectors so they redistribute across nodes
rebalance_retriesint5Max soft-reject attempts before accepting Range: 1–10. Requires rebalance=true.
client_ip_headerstringX-Forwarded-ForHeader for client IP forwarding

SSH Bastion

TOML: [bastion] · Env: HEXON_BASTION_<KEY>

KeyTypeDefaultDescription
enabledboolEnable SSH bastion server
portintSSH listen port Range: 1–65535. Requires enabled=true. Required.
enable_adminboolEnable admin CLI shell for privileged users Requires enabled=true.
use_llmboolEnable AI assistant in bastion shell Requires [llm] section to be enabled and configured Requires llm.enabled.
admin_groups[]stringGroups allowed to access the admin CLI Groups from [identity] directory. Required when enable_admin=true Requires enable_admin=true.
network_interfacestringeth0Network interface to bind SSH listener to Requires enabled=true.
ca_user_commentstringhexon-user-ca@hexon.ioComment identifier for the User CA key Requires enabled=true.
ca_host_commentstringhexon-host-ca@hexon.ioComment identifier for the Host CA key Requires enabled=true.
ca_thresholdboolfalseEnable threshold Ed25519 (FROST) for SSH User CA signing Fail-closed: no SSH user certs until FROST DKG completes (~3s). User CA key never exists on any single node. Requires cluster.cluster_mode=true,enabled=true.
allow_internal_cert_authbooltrueAllow certificate authentication from localhost for web shell connections Requires enabled=true.
internal_cert_ttlduration5mTTL for internal service certificates used by web shell Requires enabled=true.
required_groups[]stringGroups required for bastion access; empty allows any authenticated user Groups from [identity] directory Requires enabled=true.
device_code_timeoutduration5mTimeout for device code authorization flow Requires enabled=true.
idle_timeoutduration30mSession idle timeout before automatic disconnect Requires enabled=true.
max_session_durationduration24hMaximum allowed session duration Requires enabled=true.
refresh_access_tokenduration45mInterval to refresh OAuth access token during active sessions Requires enabled=true.
refresh_user_infoduration5mInterval to refresh user info from IdP during active sessions Requires enabled=true.
enable_syntax_highlightingbooltrueEnable command syntax highlighting in the shell Requires enabled=true.
cursor_stylestringdefaultTerminal cursor appearance style Values: default, blinking_block, steady_block, blinking_underline, steady_underline, blinking_bar, steady_bar. Requires enabled=true.
bannerstringMessage displayed after login before the greeting Supports multiline text Requires enabled=true.
enable_autosuggestionsboolEnable fish-style auto-suggestions in the shell Requires enabled=true.
anomaly_watchboolEnable background anomaly alerts from log intelligence Requires enabled=true.
anomaly_watch_intervalduration30sAnomaly polling interval Requires anomaly_watch=true.
enable_status_barbool (optional)trueEnable persistent status bar at bottom of terminal by default Requires enabled=true.
enable_suggestionsboolShow contextual follow-up suggestions after commands Requires enabled=true.
client_alive_intervalduration30sInterval between SSH keepalive requests to prevent idle connection drops Set to 0 to disable; prevents firewalls/NAT from dropping idle SSH connections Requires enabled=true.
ssh_connection_timeoutduration30sTimeout for outbound SSH dial connections Requires enabled=true.
port_forward_timeoutduration10sTimeout for port forwarding TCP connections Requires enabled=true.
sql_connection_timeoutduration10sTimeout for SQL database connections Requires enabled=true.
session_cleanup_intervalduration5mInterval between session cleanup sweeps Requires enabled=true.
blocked_cidrs[]stringCIDR ranges blocked for SSH and port forwarding (SSRF protection) Empty allows all; use for DMZ bastions to block private networks Requires enabled=true.
admin_max_history_sizeint100Maximum commands stored in admin shell history per session Range: 10–10000. Requires enable_admin=true.
persist_historybooltruePersist command history across sessions (requires hexon backend) Requires enabled=true.
history_persist_maxint100Maximum commands to persist across sessions Range: 10–10000. Requires persist_history=true.
history_enabledbooltrueEnable command history Requires enabled=true.
history_case_insensitiveboolEnable case-insensitive history search Requires enabled=true.
history_ignore_dupsbooltrueIgnore consecutive duplicate commands in history Requires enabled=true.
history_ignore_spaceboolIgnore commands starting with a space from history Requires enabled=true.
history_bang_expansionbooltrueEnable bang (!) history expansion Requires enabled=true.
geo_enabledboolEnable geo-IP restrictions for bastion Overrides [service] geo settings when set Requires enabled=true.
geo_allow_countries[]stringISO 3166-1 alpha-2 country codes to allow Requires geo_enabled=true.
geo_deny_countries[]stringCountry codes to deny (takes precedence over allow) Requires geo_enabled=true.
geo_allow_asn[]stringASN numbers to allow Requires geo_enabled=true.
geo_deny_asn[]stringASN numbers to deny Requires geo_enabled=true.
geo_bypass_cidr[]stringCIDRs that bypass geo-IP checks Requires geo_enabled=true.
time_enabledboolEnable time-based access restrictions for bastion Overrides [service] time settings when set Requires enabled=true.
time_timezonestringDefault timezone for time-based restrictions IANA timezone format Requires time_enabled=true.
time_allow_days[]stringAllowed days of the week Requires time_enabled=true.
time_deny_days[]stringDenied days of the week (takes precedence over allow) Requires time_enabled=true.
time_allow_hoursstringAllowed hours range in 24h format Requires time_enabled=true.
time_deny_hoursstringDenied hours range (takes precedence over allow) Requires time_enabled=true.
time_bypass_cidr[]stringCIDRs that bypass time-based restrictions Requires time_enabled=true.
time_deny_messagestringCustom message shown when access is denied by time restrictions Requires time_enabled=true.

Session recording configuration in asciinema v2 format

TOML: [bastion.recording] · Env: HEXON_BASTION_RECORDING_<KEY>

KeyTypeDefaultDescription
enabledboolEnable session recording in asciinema v2 format
pathstringBase directory for recording storage Recordings stored in hierarchical structure: {path}/YYYY/MM/DD/ Requires enabled=true.
record_inputbooltrueRecord user input keystrokes WARNING: captures passwords and sensitive data typed by users Requires enabled=true.
record_outputbooltrueRecord terminal output Requires enabled=true.
compressbooltrueGzip compress recordings after session closes (.cast.gz) Requires enabled=true.
max_file_sizestring500MBMaximum recording file size Requires enabled=true.
max_file_disconnectbooltrueDisconnect user when max recording file size is reached If false, recording stops but session continues Requires enabled=true.
replay_allowedbooltrueAllow users to replay their own session recordings Requires enabled=true.
replay_admin_groups[]stringGroups with access to replay any user’s session recordings Empty means no admin replay access Requires enabled=true.

SFTP subsystem relay configuration

TOML: [bastion.sftp] · Env: HEXON_BASTION_SFTP_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)falseEnable SFTP subsystem relay
required_groups[]stringGroups required for SFTP access; empty allows any bastion user Groups from [identity] directory Requires enabled=true.
idle_timeoutduration10mIdle timeout for SFTP sessions Requires enabled=true.

Port forwarding access control configuration

TOML: [bastion.port_forwarding_acl] · Env: HEXON_BASTION_PORT_FORWARDING_ACL_<KEY>

KeyTypeDefaultDescription
enabledboolEnable port forwarding through the bastion
required_groups[]stringGroups required for port forwarding access Requires enabled=true.
allowed_destinations[]stringStatic whitelist of allowed forwarding destinations Format: host:port, host:*, or *:port Requires enabled=true.
dynamic_aclboolEnable per-user dynamic ACL from directory service Requires enabled=true.
default_allowboolAllow all destinations when no ACL rules match Dangerous - use only for testing Requires enabled=true.
max_forwards_per_sessionintMaximum concurrent port forwards per session Min: 0. Requires enabled=true.
idle_timeoutdurationIdle timeout for port forward connections Requires enabled=true.

Per-group/destination port forwarding access rules

TOML: [bastion.port_forwarding_acl.rules] · Env: HEXON_BASTION_PORT_FORWARDING_ACL_RULES_<KEY>

KeyTypeDefaultDescription
namestringOptional identifier for this forwarding rule
groups[]stringGroups this rule applies to; empty means all groups
destinations[]stringDestinations this rule applies to Supports hostnames, globs (*.example.com), CIDRs (10.0.0.0/8)
allowed_ports[]stringAllowed destination ports Supports single ports, ranges (3306-3307), wildcard (*)
allowed_types[]stringAllowed forwarding types; empty means all local (-L), remote (-R), dynamic (-D) Values: local, remote, dynamic.
source_cidrs[]stringClient IP ranges allowed to use this rule Empty means no restriction
max_forwards_per_sessionintMaximum concurrent forwards per session override for this rule Min: 0.

DoS protection configuration for SSH bastion

TOML: [bastion.dos_protection] · Env: HEXON_BASTION_DOS_PROTECTION_<KEY>

KeyTypeDefaultDescription
max_global_connectionsint0Maximum total concurrent SSH connections 0 means unlimited Min: 0.
max_connections_per_ipint0Maximum concurrent connections per source IP 0 means unlimited Min: 0.
connection_rate_limitrate_limitnoneNew connection rate limit per IP Empty disables; format: count/duration
auth_rate_limitrate_limitnoneAuthentication attempt rate limit per IP Empty disables; limits auth attempts per IP
auth_failure_thresholdint0Failed auth attempts before IP ban 0 disables lockout Min: 0.
auth_failure_ban_durationdurationBan duration after auth failure threshold exceeded
max_sessions_per_userint0Maximum concurrent sessions per username 0 means unlimited Min: 0.
max_sessions_per_ipint0Maximum concurrent sessions per source IP 0 means unlimited Min: 0.
max_total_sessionsint0Global maximum active bastion sessions 0 means unlimited Min: 0.
session_creation_raterate_limitnoneSession creation rate limit per IP Empty disables; limits new sessions per user
command_rate_limitrate_limitnoneCommand execution rate limit per session Empty disables; limits commands per session
command_timeoutdurationnoneMaximum execution time per command Empty disables; maximum execution time per command
max_command_lengthstring4KBMaximum command length
max_history_sizeint1000Maximum commands stored in session history Min: 0.
qr_generation_raterate_limitnoneQR code generation rate limit per IP Empty disables; limits QR code generation per user

SSH user certificate generation configuration

TOML: [bastion.ssh_cert] · Env: HEXON_BASTION_SSH_CERT_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable SSH user certificate generation Disabling prevents all SSH certificate-based outbound connections via bastion
cert_ttlduration1mCertificate validity duration Requires enabled=true.
source_cidrs[]stringRestrict certificate usage to specific source IP ranges Empty means no restriction Requires enabled=true.
force_commandstringRestrict certificate to execute only this command Empty means no restriction Requires enabled=true.
permit_ptybooltrueAllow PTY allocation in certificate Requires enabled=true.
permit_port_forwardingboolAllow port forwarding in certificate Requires enabled=true.
permit_agent_forwardingboolAllow SSH agent forwarding in certificate Requires enabled=true.
permit_x11_forwardingboolAllow X11 forwarding in certificate Requires enabled=true.
permit_user_rcboolAllow user rc script execution in certificate Requires enabled=true.

Per-group/destination certificate rules; most-privileged-wins on match

TOML: [bastion.ssh_cert.rules] · Env: HEXON_BASTION_SSH_CERT_RULES_<KEY>

KeyTypeDefaultDescription
namestringOptional identifier for this certificate rule
groups[]stringGroups this rule applies to; empty means all groups
destinations[]stringDestinations this rule applies to Supports hostnames, globs (*.example.com), CIDRs (10.0.0.0/8)
sitestringnoneConnector site ID for remote SSH access When set, SSH connections route through connector tunnel
principals[]stringUsernames allowed in the certificate Multiple principals allow user selection
cert_ttldurationCertificate TTL override for this rule
source_cidrs[]stringSource CIDR restriction override for this rule
force_commandstringForced command override for this rule
permit_ptybool (optional)Allow PTY allocation override for this rule
permit_port_forwardingbool (optional)Allow port forwarding override for this rule
permit_agent_forwardingbool (optional)Allow agent forwarding override for this rule
permit_x11_forwardingbool (optional)Allow X11 forwarding override for this rule
permit_user_rcbool (optional)Allow user rc execution override for this rule

SSH CA auto-setup endpoint for target host enrollment

TOML: [bastion.sshca_setup] · Env: HEXON_BASTION_SSHCA_SETUP_<KEY>

KeyTypeDefaultDescription
enabledbool (optional)trueEnable SSH CA auto-setup endpoint for target host enrollment
allowed_cidrs[]stringSource CIDRs allowed to access enrollment endpoints Empty allows all source IPs
cert_validityduration90dHost certificate validity duration

Per-country or per-CIDR time access windows

TOML: [bastion.time_windows] · Env: HEXON_BASTION_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

SQL Bastion

TOML: [sql_bastion] · Env: HEXON_SQLBASTION_<KEY>

KeyTypeDefaultDescription
enabledboolEnable SQL bastion for interactive database access

Available SQL database site configurations

TOML: [sql_bastion.sites] · Env: HEXON_SQLBASTION_SITES_<KEY>

KeyTypeDefaultDescription
namestringUnique identifier for this database site Required.
typestringDatabase engine type Values: mysql, postgres. Required.
hoststringDatabase server hostname or IP address Required.
portint3306Database server port TOML default is 3306; explicitly set to 5432 for PostgreSQL Range: 1–65535.
sitestringnoneConnector site ID for remote database access When set, database connections route through connector tunnel
userstringDatabase connection username Required.
databasestringDefault database/schema to connect to
sslboolEnable SSL/TLS for this database connection
skip_tlsboolSkip server certificate verification (TLS on, no cert check) For self-signed certs; MySQL: tls=skip-verify, PostgreSQL: sslmode=require Requires ssl=true.
ssl_modestringPostgreSQL SSL mode Ignored for MySQL Values: disable, require, verify-ca, verify-full. Requires type=postgres.
ssl_certstringPath to client certificate for mutual TLS Requires ssl=true.
ssl_castringPath to CA certificate for server verification Requires ssl=true.
connect_timeoutduration10sConnection timeout
tls_min_versionstring1.2Minimum TLS version Values: 1.2, 1.3.

Access control rules for this site; least restrictive match wins

TOML: [sql_bastion.sites.acls] · Env: HEXON_SQLBASTION_SITES_ACLS_<KEY>

KeyTypeDefaultDescription
aclstringGroup name required for this ACL; user must be a member Required.
readonlyboolRestrict to read-only queries (SELECT, SHOW, DESCRIBE, EXPLAIN)
query_timeoutdurationMaximum query execution time
query_must_contain[]stringRequired patterns in query (all must match, case-insensitive)
query_must_not_contain[]stringForbidden patterns in query (none may match, case-insensitive)
query_max_limitintMaximum LIMIT value enforced on queries Queries exceeding this are rewritten; queries without LIMIT get this added Min: 0.
allowed_tables[]stringTable whitelist; * for all, supports wildcards (app.) PostgreSQL: use schema-qualified names (public., analytics.*)
forbidden_tables[]stringTable blacklist (takes precedence over allowed_tables)
case_sensitive_tablesboolEnable case-sensitive table name matching MySQL is case-insensitive by default on most systems
masked_columns[]stringColumn name patterns to mask in results (glob: credit_card_*, *_email)
mask_strategystringpartialMasking display strategy Values: full, partial, hash, optional.

Query rate limiting configuration

TOML: [sql_bastion.sites.acls.rate_limit] · Env: HEXON_SQLBASTION_SITES_ACLS_RATE_LIMIT_<KEY>

KeyTypeDefaultDescription
queries_per_minuteintMaximum queries allowed per window Multi-statement queries count as multiple Min: 0.
burst_allowedintExtra queries allowed beyond rate limit (burst capacity) Total allowed = queries_per_minute + burst_allowed Min: 0.
window_sizedurationRate limit sliding window duration

Database server-side resource limit configuration

TOML: [sql_bastion.sites.acls.query_limits] · Env: HEXON_SQLBASTION_SITES_ACLS_QUERY_LIMITS_<KEY>

KeyTypeDefaultDescription
max_complexity_scoreintMaximum allowed query complexity score Base:10, JOIN:+20, subquery:+30, LIKE:+15, GROUP BY:+25, ORDER BY:+15, HAVING:+20, aggregate:+10, UNION:+25 Min: 0.
max_execution_timedurationDatabase-enforced query execution time limit MySQL: max_execution_time; PostgreSQL: statement_timeout
max_rowsintMaximum rows returned per query MySQL: sql_select_limit; PostgreSQL: not supported (use LIMIT) Min: 0.
max_memorystringMemory limit for sorting and aggregate operations MySQL: max_sort_length; PostgreSQL: work_mem

Web Shell

TOML: [webshell] · Env: HEXON_WEBSHELL_<KEY>

KeyTypeDefaultDescription
enabledboolEnable the web shell terminal service
required_groups[]stringGroups required for web shell access User must be a member of at least one group; empty inherits from bastion.required_groups Requires enabled=true.
max_sessions_per_userint3Max concurrent web shell sessions per user Min: 1. Requires enabled=true.
session_timeoutduration30mInactive session timeout duration Requires enabled=true.
geo_enabledboolfalseEnable geo-IP restrictions for web shell Overrides [service] geo settings when set Requires enabled=true.
geo_allow_countries[]stringISO 3166-1 alpha-2 country codes to allow Requires geo_enabled=true.
geo_deny_countries[]stringCountry codes to deny (takes precedence over allow) Requires geo_enabled=true.
geo_allow_asn[]stringASN numbers to allow Requires geo_enabled=true.
geo_deny_asn[]stringASN numbers to deny Requires geo_enabled=true.
geo_bypass_cidr[]stringCIDRs that bypass geo-IP checks Requires geo_enabled=true.
time_enabledboolEnable time-based restrictions for web shell Overrides [service] time settings when set Requires enabled=true.
time_timezonestringDefault timezone in IANA format IANA timezone format (e.g., America/New_York) Requires time_enabled=true.
time_allow_days[]stringAllowed days of the week Requires time_enabled=true.
time_deny_days[]stringDenied days of the week (takes precedence over allow) Requires time_enabled=true.
time_allow_hoursstringAllowed hours range Requires time_enabled=true.
time_deny_hoursstringDenied hours range (takes precedence over allow) Requires time_enabled=true.
time_bypass_cidr[]stringCIDRs that bypass time-based checks Requires time_enabled=true.
time_deny_messagestringCustom message shown when access is denied by time restriction Requires time_enabled=true.

Per-country or per-CIDR time windows

TOML: [webshell.time_windows] · Env: HEXON_WEBSHELL_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

TCP Proxy

TOML: [tcp_proxy] · Env: HEXON_TCPPROXY_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable mTLS-authenticated TCP/TLS proxy
certstringPath to service TLS certificate for mTLS listener Requires enabled=true.
buffer_sizestring32KBTCP relay buffer size Requires enabled=true.
connect_timeoutduration10sBackend connection timeout Requires enabled=true.
idle_timeoutduration5mIdle connection timeout Requires enabled=true.
max_connection_durationduration24hMaximum connection lifetime Requires enabled=true.
max_connections_per_userint0Maximum concurrent connections per user (0 = unlimited) Range: 0–10000. Requires enabled=true.

TCP proxy port mappings (listener to backend pool)

TOML: [tcp_proxy.mapping] · Env: HEXON_TCPPROXY_MAPPING_<KEY>

KeyTypeDefaultDescription
namestringUnique identifier for this mapping Alphanumeric, hyphens, underscores; max 64 chars Required.
listen_portintTCP port to listen on for connections Range: 1–65535. Required.
authbool (optional)trueEnable mTLS authentication When false, acts as pure TCP passthrough without TLS termination
certstringPath to TLS certificate for this mapping listener Falls back to global tcp_proxy.cert if not set
protocol_hintstringProtocol-specific optimizations for health checks and logging Optional protocol identifier for logging and metrics Values: mysql, postgresql, redis, mongodb, memcached, custom.
backends[]stringBackend addresses in host:port format Required.
lb_strategystringround_robinLoad balancing strategy Values: round_robin, weighted, least_connections, hash, random, maglev.
lb_hash_keystringcert_serialKey for hash-based load balancing Only used when lb_strategy=hash Values: cert_serial, cn, ip.
lb_weights[]intWeights for weighted round-robin (must match backends count) Only used when lb_strategy=weighted; defaults to equal weights Min: 1.
health_check_enabledbooltrueEnable backend health checks
health_check_intervalduration10sInterval between health checks Requires health_check_enabled=true.
health_check_timeoutduration5sTimeout for each health check Must be less than health_check_interval Requires health_check_enabled=true.
health_check_typestringtcpHealth check type Values: tcp, mysql, postgresql, redis. Requires health_check_enabled=true.
allowed_groups[]stringnoneGroups allowed to connect (OR logic, empty = all) Empty allows all authenticated users
denied_groups[]stringnoneGroups denied from connecting (takes precedence over allow) Takes precedence over allowed_groups
allowed_subnets[]stringnoneAllowed client CIDRs (empty = all) Empty allows all client IPs
geo_enabledboolfalseEnable geo-IP restrictions for this mapping
geo_allow_countries[]stringAllowed country codes (ISO 3166-1 alpha-2) Requires geo_enabled=true.
geo_deny_countries[]stringDenied country codes (takes precedence over allow) Requires geo_enabled=true.
geo_allow_asn[]stringAllowed Autonomous System Numbers Requires geo_enabled=true.
geo_deny_asn[]stringDenied Autonomous System Numbers (takes precedence over allow) Requires geo_enabled=true.
geo_bypass_cidr[]stringCIDRs that bypass geo-IP checks Requires geo_enabled=true.
time_enabledboolfalseEnable time-based access restrictions
time_timezonestringDefault timezone for time restrictions IANA timezone format Requires time_enabled=true.
time_allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun. Requires time_enabled=true.
time_deny_days[]stringDenied days of the week (takes precedence over allow) Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun. Requires time_enabled=true.
time_allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM Requires time_enabled=true.
time_deny_hoursstringDenied hours range (takes precedence over allow) Format: HH:MM-HH:MM Requires time_enabled=true.
time_bypass_cidr[]stringCIDRs that bypass time-based checks Requires time_enabled=true.
rate_limitrate_limitnoneRate limit per user Per-mapping rate limit; empty means no limit
max_connectionsint0Max concurrent connections for this mapping (0 = unlimited) Min: 0.
backend_tlsboolfalseEnable TLS for backend connections
backend_tls_verifyboolfalseVerify backend TLS certificate Requires backend_tls=true.
backend_tls_snistringSNI hostname for backend TLS Requires backend_tls=true.
backend_tls_castringCA certificate for backend verification (file path or inline PEM) Inline PEM or file path for backend TLS verification Requires backend_tls=true.
backend_tls_certstringClient certificate for mTLS to backend (file path or inline PEM) Inline PEM or file path for mTLS to backend Requires backend_tls=true.
backend_tls_min_versionstring1.3Minimum TLS version for backend connections Values: 1.2, 1.3. Requires backend_tls=true.
circuit_breaker_enabledboolfalseEnable circuit breaker for backend failures
circuit_breaker_error_thresholdfloat0.5Error ratio threshold to trip circuit breaker Range: 0–1. Requires circuit_breaker_enabled=true.
circuit_breaker_windowduration10sTime window for error rate tracking Requires circuit_breaker_enabled=true.
circuit_breaker_fallback_timeduration30sDuration circuit stays open before half-open retry Requires circuit_breaker_enabled=true.
outlier_detection_enabledboolfalseEnable outlier detection for backend ejection
outlier_detection_intervalduration10sInterval between outlier analysis runs Requires outlier_detection_enabled=true.
outlier_detection_failure_rateint50Failure percentage threshold to eject a backend Range: 1–100. Requires outlier_detection_enabled=true.
outlier_detection_min_requestsint10Minimum requests before outlier analysis applies Requires outlier_detection_enabled=true.
outlier_detection_ejection_timeduration30sBase ejection duration for outlier backends Requires outlier_detection_enabled=true.
outlier_detection_max_ejectionint50Maximum percentage of backends that can be ejected Range: 1–100. Requires outlier_detection_enabled=true.
buffer_sizestringTCP relay buffer size override Overrides global buffer_size; empty = use global default
connect_timeoutdurationBackend connection timeout override Overrides global connect_timeout; empty = use global default
idle_timeoutdurationIdle connection timeout override Overrides global idle_timeout; empty = use global default
max_connection_durationdurationMaximum connection lifetime override Overrides global max_connection_duration; empty = use global default

Time windows for specific countries or CIDRs

TOML: [tcp_proxy.mapping.time_windows] · Env: HEXON_TCPPROXY_MAPPING_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

VPN

TOML: [vpn] · Env: HEXON_VPN_<KEY>

KeyTypeDefaultDescription
enabledboolEnable IKEv2 VPN server RFC 7296.
debugboolfalseEnable verbose debug logging with packet-level traces Generates high-volume output; use only for troubleshooting Requires enabled=true.
network_interfacestringNetwork interface for VPN traffic Must match external IP reachable by VPN clients. Defaults to service.network_interface if not set Requires enabled=true.
ikev2_portint500IKEv2 protocol port (UDP) Range: 1–65535. RFC 7296. Requires enabled=true.
esp_portint4500ESP/NAT-T port (UDP) Range: 1–65535. RFC 3948. Requires enabled=true.
single_portboolfalseAll IKEv2 on port 4500 only (L4 LB compatible) Requires enabled=true.
hostnamestringVPN server hostname for profiles and emails Defaults to service.hostname if not set; useful when VPN is behind a separate load balancer Max: 255. Requires enabled=true.
max_goroutinesintnoneMax concurrent IKE/ESP processing goroutines Range: 100–100000. Requires enabled=true.
max_pending_authintnoneMax pending auth contexts before IKE_AUTH completes Range: 100–50000. Requires enabled=true.
dns_queries_per_minuteint500DNS rate limit per VPN client (rolling window) Prevents DNS amplification attacks while allowing normal browsing Requires enabled=true.
geo_enabledboolEnable VPN-specific geo restrictions Overrides [service] geo config when set Requires enabled=true.
geo_allow_countries[]stringAllowed country codes (ISO 3166-1 alpha-2) Requires geo_enabled=true.
geo_deny_countries[]stringDenied country codes (ISO 3166-1 alpha-2) Requires geo_enabled=true.
geo_allow_asn[]stringAllowed ASN numbers Requires geo_enabled=true.
geo_deny_asn[]stringDenied ASN numbers Requires geo_enabled=true.
geo_bypass_cidr[]stringCIDRs that bypass geo checks Requires geo_enabled=true.
time_enabledboolEnable VPN-specific time restrictions Overrides [service] time config when set Requires enabled=true.
time_timezonestringDefault timezone for time restrictions IANA timezone format Requires time_enabled=true.
time_allow_days[]stringAllowed days of week Requires time_enabled=true.
time_deny_days[]stringDenied days of week Requires time_enabled=true.
time_allow_hoursstringAllowed hours range Requires time_enabled=true.
time_deny_hoursstringDenied hours range Requires time_enabled=true.
time_bypass_cidr[]stringCIDRs that bypass time checks Requires time_enabled=true.
time_deny_messagestringCustom denial message for time-based restrictions Requires time_enabled=true.

VPN network configuration

TOML: [vpn.network] · Env: HEXON_VPN_NETWORK_<KEY>

KeyTypeDefaultDescription
subnetstringVPN client IP subnet IPv4 only; first usable IP is gateway. Changing requires revoking all VPN profiles Required.
gatewaystringVPN gateway IP address Must be an IPv4 address within the VPN subnet Required.
dns_domains[]stringDNS domains for split DNS Clients use VPN DNS for queries matching these domains RFC 8598.
dns_cache_sizeint10000DNS cache size in number of entries Omit to use system default Range: 1–1000000.
dns_cache_ttldurationnoneDNS cache TTL Range: 1s–24h.
dns_hijackboolIntercept all port 53 DNS traffic When false, only intercepts DNS to gateway IP
mtuint1400MTU for VPN tunnel 1400 accounts for IKEv2/ESP overhead on most networks Range: 576–9000.
internal_interfacestringhexon0Internal dummy interface name for route-based VPN
enable_nat_keepalivebooltrueEnable NAT-T keepalive packets RFC 3948.
nat_keepalive_intervalduration20sInterval between NAT keepalive packets RFC 3948.
ipv6_enabledbool (optional)trueEnable IPv6 dual-stack support Derived from IPv4 using fd7a:ec0a::/48 ULA prefix. Disable if clients don’t support dual-stack
wildcard_max_hosts_per_domainint100Max hostnames tracked per wildcard domain Prevents unbounded memory growth from wildcard DNS rules
wildcard_max_hosts_totalint1000Max total hostnames across all wildcard domains

VPN authentication configuration

TOML: [vpn.auth] · Env: HEXON_VPN_AUTH_<KEY>

KeyTypeDefaultDescription
ldap_bind_timeoutdurationnoneLDAP bind timeout Range: 100ms–1m.
max_auth_attemptsintnoneMaximum authentication attempts before lockout Range: 1–10.
auth_timeoutdurationnoneIKE_AUTH phase timeout Range: 1s–5m. RFC 7296.
groupstringnoneRequired LDAP group for VPN access Group from [identity] directory. Empty means no group restriction
lease_validdurationnoneProfile/lease validity duration Use hours; e.g. 1080h for 45 days Range: 24h–8760h.
dpd_timeoutduration90sDead Peer Detection timeout Range: 30s–10m. RFC 7296.
dpd_intervalduration30sDPD liveness probe interval Range: 10s–5m. RFC 7296.
dpd_retriesint3Consecutive DPD probe failures before declaring peer dead Range: 1–10. RFC 7296.
authorization_requiredboolRequire post-authentication authorization via signin service Users must complete authorization before gaining full network access
authorization_timeoutduration10mTime limit for completing authorization Range: 1m–1h. Requires authorization_required=true.
captive_portalbool (optional)Enable captive portal detection for unauthorized sessions Defaults to authorization_required value. Captive portal redirect uses device code flow Requires authorization_required=true.
captive_portal_domains[]stringDomains used for captive portal detection Defaults to major OS/browser detection domains if not set Requires authorization_required=true.
psk_reminder_enabledbool (optional)trueEnable PSK expiration reminder emails
psk_reminder_intervalduration24hHow often to check for expiring PSKs Requires psk_reminder_enabled.
psk_reminder_daysint15Days before expiry to start sending reminders Requires psk_reminder_enabled.
psk_reminder_timeoutduration5mTimeout for each reminder check run Requires psk_reminder_enabled.
psk_reminder_retriesint3Number of retries on transient failures Requires psk_reminder_enabled.
psk_reminder_retry_delayduration30sDelay between retries Requires psk_reminder_enabled.
group_refresh_intervalduration15mGroup membership change monitoring interval Backup for event-driven callbacks Range: 1m–1h.

Device code authorization flow settings

TOML: [vpn.auth.device_code] · Env: HEXON_VPN_AUTH_DEVICE_CODE_<KEY>

KeyTypeDefaultDescription
enabledboolEnable device code flow for VPN authorization When enabled, VPN clients display QR code/user code for authorization via secondary device RFC 8628.
email_notificationbool (optional)trueSend email with authorization code and link RFC 8628. Requires enabled=true.
ttlduration5mTime-to-live for device authorization codes Range: 1m–30m. RFC 8628. Requires enabled=true.
polling_intervalduration5sInterval between authorization status checks Range: 1s–60s. RFC 8628. Requires enabled=true.

IKEv2 cryptographic proposals

TOML: [vpn.crypto] · Env: HEXON_VPN_CRYPTO_<KEY>

KeyTypeDefaultDescription
ike_proposals[]stringIKE Phase 1 cryptographic proposals RFC 7296. Required.
esp_proposals[]stringESP Phase 2 cryptographic proposals RFC 7296. Required.
dh_groups[]intDiffie-Hellman key exchange groups Groups 14+ (2048-bit+) recommended; groups 1, 2, 5 are weak (Logjam attack) Values: 1, 2, 5, 14, 15, 16, 17, 18, 19, 20, 21, 28, 29, 30, 31. RFC 7296. Required.
rekey_intervalduration24hChild SA rekey interval for ESP key rotation Set to 0 to disable rekeying Range: 1m–24h. RFC 7296.
ike_sa_lifetimeduration168hIKE SA lifetime (max session duration) Sessions auto-reconnect after this duration Range: 24h–720h. RFC 7296.
sha1_policystringwarnSHA-1 security policy for IKEv2 algorithms Rejecting SHA-1 may break legacy IKEv2 clients Values: allow, warn, deprecate, reject.

gVisor netstack configuration

TOML: [vpn.netstack] · Env: HEXON_VPN_NETSTACK_<KEY>

KeyTypeDefaultDescription
tcp_buffer_sizestring4MBTCP buffer size Range: 1MB-100MB
udp_buffer_sizestring1MBUDP buffer size Range: 64KB-10MB
max_connectionsintnoneMaximum concurrent netstack connections Range: 1–100000.
tcp_keepalivedurationnoneTCP keepalive interval Range: 10s–1h.
tcp_timeoutdurationnoneTCP connection timeout Range: 1m–24h.

VPN routing configuration

TOML: [vpn.routing] · Env: HEXON_VPN_ROUTING_<KEY>

KeyTypeDefaultDescription
cidrs[]string0.0.0.0/0CIDRs to route via VPN tunnel VPN subnet is always included automatically; NAT/MASQUERADE is always enabled Required.

Inter-node VPN transit via WireGuard mesh

TOML: [vpn.internode] · Env: HEXON_VPN_INTERNODE_<KEY>

KeyTypeDefaultDescription
enabledboolEnable inter-node VPN transit via WireGuard mesh Linux only — excluded from non-Linux builds. Requires cluster_mode=true and WireGuard kernel module
interfacestringwg-hx-transitWireGuard mesh interface name Linux limit: 15 characters max Max: 15. Requires enabled=true.
portint51820WireGuard mesh port (UDP) Range: 1–65535. Requires enabled=true.
mtuint1380MTU for WireGuard mesh interface Accounts for double encapsulation: VPN client > ESP > WireGuard mesh Range: 1280–1500. Requires enabled=true.
sync_intervalduration5sPeer list refresh interval Range: 1s–1m. Requires enabled=true.
stale_timeoutduration180sRemove peers not seen for this duration Must be greater than sync_interval Requires enabled=true.
keepaliveduration25sWireGuard persistent keepalive interval Range: 10s–5m. Requires enabled=true.
debugboolEnable debug logging for internode operations Requires enabled=true.

Per-country/CIDR time windows

TOML: [vpn.time_windows] · Env: HEXON_VPN_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

Firewall

TOML: [firewall] · Env: HEXON_FIREWALL_<KEY>

KeyTypeDefaultDescription
enabledbooltrueEnable firewall ACL system for VPN access control
blocked_networks[]stringNetworks to block globally for all VPN users Networks blocked for [vpn] users. Defaults to RFC1918, link-local, loopback, multicast if empty Requires enabled=true.
dns_refresh_enabledbooltrueEnable automatic DNS refresh for ACL hostnames Requires enabled=true.
dns_refresh_min_intervalduration1mMinimum DNS refresh interval Requires dns_refresh_enabled=true.
dns_refresh_max_intervalduration1hMaximum DNS refresh interval Must be >= dns_refresh_min_interval Requires dns_refresh_enabled=true.
dns_refresh_jitterint10DNS refresh jitter percentage Range: 0–100. Requires dns_refresh_enabled=true.
dns_refresh_init_timeoutduration10sDNS resolution timeout at startup Requires dns_refresh_enabled=true.
nft_pool_sizeint5nftables connection pool size Range: 1–100. Requires enabled=true.
max_rules_per_chainint1000Maximum nftables rules per peer chain Set to 0 for unlimited Requires enabled=true.

Reusable host and port alias definitions for ACL rules

TOML: [firewall.aliases] · Env: HEXON_FIREWALL_ALIASES_<KEY>

Named sets of destination hosts for ACL rules

TOML: [firewall.aliases.hosts] · Env: HEXON_FIREWALL_ALIASES_HOSTS_<KEY>

KeyTypeDefaultDescription
namestringUnique alias name Required.
hosts[]stringDestination IPs, CIDRs, or hostnames Supports IPs, CIDRs, hostnames, and wildcard domains (*.example.com) Required.
sitestringnoneConnector site ID for remote access When set, destinations resolve on the remote site via connector tunnel

Named sets of protocol/port combinations for ACL rules

TOML: [firewall.aliases.ports] · Env: HEXON_FIREWALL_ALIASES_PORTS_<KEY>

KeyTypeDefaultDescription
namestringUnique alias name Required.

Protocol and port combinations

TOML: [firewall.aliases.ports.entries] · Env: HEXON_FIREWALL_ALIASES_PORTS_ENTRIES_<KEY>

KeyTypeDefaultDescription
protostringNetwork protocol Values: tcp, udp, icmp, esp, any. Required.
ports[]intPort numbers; leave empty for icmp/esp/any Range: 1–65535.

Group-based firewall access control rules

TOML: [firewall.rules] · Env: HEXON_FIREWALL_RULES_<KEY>

KeyTypeDefaultDescription
rulestringUnique rule identifier Required.
src[]stringSource LDAP groups; users in any group match (OR logic) LDAP groups from [identity] directory Required.
dst[]stringDestination host alias names from aliases.hosts Required.
ports[]stringPort alias names from aliases.ports; use ‘any’ for all Required.

Protection

TOML: [protection] · Env: HEXON_PROTECTION_<KEY>

KeyTypeDefaultDescription
powboolEnable Proof-of-Work challenge for bot protection
pow_difficultyint4PoW hash difficulty level Range: 1–32. Requires pow=true.
pow_difficulty_timeduration5mTTL for PoW tokens Requires pow=true.
pow_session_ttlduration30mHow long a PoW session remains valid after successful challenge Requires pow=true.
pow_cookie_namestringhexon_powCookie name for PoW sessions Must differ from session cookie name Requires pow=true.
pow_random_fieldsbooltrueUse random form field names to deter bots Requires pow=true.
pow_decoy_fieldsint5Number of honeypot decoy fields in PoW form Range: 0–100. Requires pow=true.
pow_min_render_timeduration200msMinimum time before form submission is accepted Requires pow=true.
pow_body_ttlduration5mTTL for stored POST bodies during PoW challenge Requires pow=true.
pow_body_max_sizestring1MBMaximum POST body size to preserve during PoW Requires pow=true.
rate_limitrate_limitnoneRequest rate limit Empty disables global rate limiting; format: count/duration (e.g., 100/1m)
rate_limit_typestringfingerprintClient identification method for rate limiting fingerprint uses TLS+HTTP/2+TCP composite Values: fingerprint, ip.
rate_limit_bantimedurationDuration to ban client after rate limit exceeded Empty disables banning; client is rate-limited momentarily but not blocked long-term
rate_limit_max_clientsint100000Maximum number of clients to track for rate limiting Prevents memory exhaustion Range: 0–10000000.
max_bytesstringnoneDefault maximum request body size Empty disables body size limiting; applies to all request bodies
password_min_lengthint12Minimum password length Range: 0–128.
password_min_scoreint3Minimum zxcvbn password strength score Range: 0–4.
password_min_entropyfloat40.0Minimum password entropy in bits Range: 0–256.
password_require_upperboolfalseRequire at least one uppercase letter
password_require_lowerboolfalseRequire at least one lowercase letter
password_require_digitboolfalseRequire at least one digit
password_require_specialboolfalseRequire at least one special character

Per-host/path exceptions for request body size limits

TOML: [protection.max_bytes_exceptions] · Env: HEXON_PROTECTION_MAX_BYTES_EXCEPTIONS_<KEY>

KeyTypeDefaultDescription
hoststringHostname to match; empty matches all hosts
pathstringPath pattern (exact, wildcard, or regex) Exact: /upload/large. Wildcard: /upload/* (shell glob). Regex: /upload/[0-9]+ (set regex=true)
bytesstringSize limit for matching requests Required.
regexboolfalseTreat path as regular expression

IKEv2 Intrusion Detection System configuration

TOML: [protection.ikev2ids] · Env: HEXON_PROTECTION_IKEV2IDS_<KEY>

KeyTypeDefaultDescription
enabledboolEnable IKEv2 Intrusion Detection System Automatically enabled when vpn.enabled=true unless explicitly set to false
block_maliciousbooltrueBlock detected threats instead of log-only mode Requires enabled=true.
log_levelstringinfoIDS logging verbosity level Values: trace, debug, info, warn, error. Requires enabled=true.
dos_thresholdint100Maximum connections per minute per IP before DoS detection Range: 0–100000. Requires enabled=true.
anomaly_sensitivityfloat0.95Statistical anomaly detection threshold Higher values = less sensitive Range: 0.0–1.0. Requires enabled=true.
trusted_networks[]stringCIDRs to skip IP-based checks; signatures still apply Requires enabled=true.

WAF

TOML: [waf] · Env: HEXON_WAF_<KEY>

KeyTypeDefaultDescription
enabledboolEnable WAF protection
paranoiaint1OWASP CRS paranoia level 1=low (few false positives), 2=medium, 3=high, 4=paranoid (many false positives) Values: 1, 2, 3, 4. Range: 1–4. Requires enabled=true.
detection_onlyboolfalseLog-only mode without blocking requests Useful for rule calibration; monitor logs for false positives before enforcing Requires enabled=true.
self_containedboolfalseUse self-contained blocking instead of anomaly scoring Self-contained: each rule blocks immediately. Anomaly scoring (default): accumulates scores and blocks if threshold exceeded Requires enabled=true.
max_body_sizestringnoneMaximum request body size to inspect Accepts units: B, KB, MB, GB, TB Requires enabled=true.
inspect_bodyboolfalseInspect request bodies for attacks Enables request body inspection for injection attacks; requires max_body_size Requires enabled=true.
inspect_responseboolInspect response bodies for data leakage Enabling this has a performance impact on every proxied response Requires enabled=true.
disabled_rules[]intOWASP CRS rule IDs to disable Use to suppress specific false positives by rule ID Requires enabled=true.
disabled_tags[]stringOWASP CRS rule tags to disable Disables all rules with the given tag (e.g., attack-sqli, attack-xss) Requires enabled=true.

Operator-defined custom WAF rules loaded alongside OWASP CRS

TOML: [waf.custom_rule] · Env: HEXON_WAF_CUSTOM_RULE_<KEY>

KeyTypeDefaultDescription
idintUnique rule ID Use 10000+ to avoid conflicts with OWASP CRS rule IDs Min: 10000. Required.
namestringDescriptive rule name Required.
severitystringRule severity level Determines alert level in WAF logs; empty inherits from OWASP CRS defaults Values: CRITICAL, ERROR, WARNING, NOTICE.
phaseintRequest processing phase 1=request headers, 2=request body, 3=response headers, 4=response body Values: 1, 2, 3, 4. Range: 1–4. Required.
variablestringTarget variable to inspect Valid: ARGS, ARGS_NAMES, REQUEST_URI, REQUEST_HEADERS, REQUEST_BODY, REQUEST_COOKIES, RESPONSE_HEADERS, RESPONSE_BODY, REMOTE_ADDR, REQUEST_METHOD, REQUEST_FILENAME, FILES, FILES_NAMES Required.
operatorstringMatch operator type Valid: rx (regex), eq (equals), contains, beginsWith, endsWith, within, pm (phrase match), ge/gt/le/lt (numeric), streq (string equals), validateByteRange, validateUrlEncoding, validateUtf8Encoding Required.
patternstringPattern to match against the variable For rx operator, uses regex syntax; validated for ReDoS safety
transform[]stringTransformations to apply before matching Valid: lowercase, uppercase, removeWhitespace, compressWhitespace, removeNulls, urlDecode, urlDecodeUni, htmlEntityDecode, jsDecode, cssDecode, base64Decode, hexDecode, length, normalizePath, trim, none
actionstringpassAction to take when rule matches deny=block with status code, pass=log only, drop=silent close, allow=skip remaining rules Values: deny, allow, pass, drop, redirect.
statusint403HTTP status code for deny action Range: 100–599. Requires action=deny.
messagestringnoneLog message recorded when rule matches Recorded in WAF logs when rule matches; useful for identifying custom rules
tags[]stringnoneTags for rule categorization and filtering Used for bulk rule management via disabled_tags

SPIFFE

TOML: [spiffe] · Env: HEXON_SPIFFE_<KEY>

KeyTypeDefaultDescription
enabledboolEnable SPIFFE workload identity service Serves a separate ACME directory for workload certificate issuance
default_ttlduration24hDefault certificate TTL for workloads Short-lived certificates are preferred for zero-trust Min: 1m. Requires enabled=true.
max_ttlduration168hMaximum certificate TTL Overrides per-workload TTL if exceeded; must be >= default_ttl Min: 1m. Requires enabled=true.
order_timeoutduration1hACME order expiration timeout Orders not finalized within this duration are automatically expired Min: 1s. Requires enabled=true.
path_prefixstring/acme/spiffeACME path prefix for SPIFFE directory Directory served at https://<hostname><path_prefix>/directory Requires enabled=true.
allowed_cidrs[]stringGlobal allowed CIDRs for SPIFFE ACME endpoints Per-workload allowed_cidrs further restricts via intersection Requires enabled=true.
rate_limit_per_workloadint100Rate limit per workload in certificates per hour Prevents a compromised workload from exhausting CA resources Range: 0–10000. Requires enabled=true.
allowed_key_algorithms[]stringEC-P256,EC-P384,RSA-2048,RSA-3072,RSA-4096Allowed key algorithms for account and CSR keys Values: EC-P256, EC-P384, RSA-2048, RSA-3072, RSA-4096. Requires enabled=true.

Workload identity definitions

TOML: [spiffe.workloads] · Env: HEXON_SPIFFE_WORKLOADS_<KEY>

KeyTypeDefaultDescription
identitystringWorkload identity name Becomes SPIFFE path /workload/<identity>; lowercase alphanumeric with hyphens, 2-63 chars Required.
account_public_keystringAccount public key in PEM format PEM-encoded public key; workload holds private key in K8s Secret (never in Git) Required.
sans[]stringAllowed DNS SANs for this workload’s certificates Empty means client-authentication-only certificate
allowed_peers[]stringAllowed peer workload identities for mTLS Embedded in AllowedPeers OID extension; empty list means no peer mTLS allowed
ttldurationCertificate TTL override for this workload Falls back to spiffe.default_ttl if not set; cannot exceed spiffe.max_ttl Min: 1m.
allowed_cidrs[]stringPer-workload CIDR restriction Intersected with global allowed_cidrs; both must allow

MCP

TOML: [mcp] · Env: HEXON_MCP_<KEY>

KeyTypeDefaultDescription
enabledboolEnable the MCP server endpoint Exposes admin CLI commands as tools for AI assistants. For OAuth-based MCP clients, also enable DCR in [authentication.oidc]
pathstring/_hexon/mcpURL path where the MCP endpoint is mounted Requires enabled=true.
read_onlybooltrueRead-only mode blocks mutation subcommands When false, write operations still require two-phase confirmation code. When true, revoke/disconnect/reset/uneject are blocked Requires enabled=true.
allowed_groups[]stringGroups allowed to use the MCP server MCP will not start if this is empty Requires enabled=true. Required.
allowed_cidrs[]stringAllowed CIDR ranges for MCP access If empty, no IP restrictions apply Requires enabled=true.
statelessbool (optional)trueDisable in-memory session tracking for stateless operation When false, enables SSE-based stateful sessions. When true (default), uses stateless HTTP polling Requires enabled=true.

Named workflow playbooks exposed as MCP prompts

TOML: [mcp.playbooks] · Env: HEXON_MCP_PLAYBOOKS_<KEY>

KeyTypeDefaultDescription
namestringUnique playbook name (lowercase alphanumeric + hyphens) Required.
titlestringDisplay title for this playbook
descriptionstringShort description of the playbook’s purpose
categorystringCategory for organizing playbooks Values: troubleshooting, deployment, maintenance, audit, security.
stepsstringMarkdown workflow steps the AI follows Plain markdown; reference arguments by name and the AI will substitute values Required.

Named input arguments for this playbook

TOML: [mcp.playbooks.arguments] · Env: HEXON_MCP_PLAYBOOKS_ARGUMENTS_<KEY>

KeyTypeDefaultDescription
namestringArgument name Required.
descriptionstringDescription shown to the user
requiredboolfalseWhether this argument must be provided

LLM Assistant

TOML: [llm] · Env: HEXON_LLM_<KEY>

KeyTypeDefaultDescription
enabledboolEnable the LLM module for AI-powered admin interaction
api_urlstringLLM provider API endpoint URL Requires enabled=true. Required.
modelstringModel identifier to use for completions Check provider docs for current model IDs. Anthropic: claude-opus-4-6, claude-sonnet-4-5-20250929 Requires enabled=true. Required.
providerstringautoAPI provider type; auto-detected from api_url when set to auto Values: auto, openai, anthropic, azure, ollama, gemini. Requires enabled=true.
temperaturefloat0.3Sampling temperature for response generation Range: 0–2. Requires enabled=true.
max_tokensint4096Maximum tokens in LLM response Range: 256–32768. Requires enabled=true.
timeoutduration60sMaximum time to wait for an LLM API response Requires enabled=true.
rate_limitrate_limit10/1mPer-user query rate limit Requires enabled=true.
auto_execute_readonlybool (optional)trueExecute read-only commands without operator confirmation Requires enabled=true.
allowed_commands[]stringnoneCommands the LLM can execute; empty allows all MCP-visible commands Empty allows all MCP-visible commands Requires enabled=true.
approval_required[]stringnoneCommands that always require operator confirmation before execution Empty means only write operations require approval Requires enabled=true.
approval_timeoutduration60sMax time to wait for operator approval of write operations Requires enabled=true.
max_write_ops_per_queryint3Max write operations requiring approval per AI query Range: 1–20. Requires enabled=true.
max_tool_roundsint15Max tool-calling rounds per AI query Range: 1–50. Requires enabled=true.
required_groups[]stringGroups allowed to use LLM features LLM will not start if this is empty Requires enabled=true. Required.
redact_sensitivebool (optional)trueRedact secrets and sensitive data from LLM context Requires enabled=true.
max_historyint25Maximum conversation exchanges to retain per session for context continuity Range: 0–100. Requires enabled=true.
custom_instructionsstringCustom persona and behavioral instructions for the AI assistant Empty uses built-in SRE persona. Supports multi-line TOML strings. Requires enabled=true.
max_context_entriesint10Maximum session context entries per operator Range: 1–50. Requires enabled=true.
max_context_lengthint500Maximum character length per session context entry Range: 50–2000. Requires enabled=true.
max_memory_entriesint50Maximum number of memory entries (insights + rules combined) Range: 0–500. Requires enabled=true.
max_memory_lengthint500Maximum character length per memory entry Range: 50–2000. Requires enabled=true.
memory_ttlduration8760hTime-to-live for memory entries in cluster storage Default 1 year (8760h). Set to 0 for no expiry Requires enabled=true.
prompt_caching_ttldurationAnthropic prompt caching TTL; empty=disabled, 5m=default, 1h=extended (2x write cost) Only applies to Anthropic provider. 5m is recommended. Requires enabled=true.
token_tracking_weeksint18Weeks of per-user token consumption history to retain; 0 disables tracking Range: 0–104. Requires enabled=true.
ai_disclaimerstringDisclaimer shown once per session when entering AI mode Empty uses default. Set to a single space to disable. Requires enabled=true.
max_sleep_durationduration5mMax duration per sleep call in monitoring loops Requires enabled=true.
max_sleeps_per_queryint60Max sleep iterations per AI query for monitoring loops Range: 1–500. Requires enabled=true.

Log Intelligence

TOML: [log_intelligence] · Env: HEXON_LOGINTELLIGENCE_<KEY>

KeyTypeDefaultDescription
enabledboolEnable log pattern analysis and anomaly detection
windowduration60sAnalysis window size Sliding window for pattern frequency analysis Range: 10s–1h. Requires enabled=true.
max_patternsint1000Maximum unique patterns to track Memory-bound; higher values detect more unique log patterns Range: 100–10000. Requires enabled=true.
anomaly_buffer_sizeint100Maximum anomalies to retain Circular buffer; oldest anomalies evicted when full Range: 10–1000. Requires enabled=true.
co_occurrence_windowduration5sCo-occurrence proximity window Patterns occurring within this window are tracked as correlated Range: 1s–60s. Requires enabled=true.
trace_max_ageduration5mMaximum trace tracking age Traces older than this are evicted from tracking Range: 30s–1h. Requires enabled=true.
trace_max_entriesint5000Maximum concurrent traces to track Memory-bound; limits concurrent trace correlation tracking Range: 100–50000. Requires enabled=true.

RADIUS

TOML: [radius] · Env: HEXON_RADIUS_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable RADIUS authentication service
radsec_onlybool (optional)trueRADSEC-only mode (TCP+TLS). When false, also accepts plain UDP RADIUS Requires enabled=true.
network_interfacestringNetwork interface to bind RADIUS listeners to Defaults to service.network_interface if not set Requires enabled=true.
radsec_portint2083RADSEC TCP+TLS listener port (RFC 6614) Range: 1–65535. Requires enabled=true.
plain_portint1812Plain UDP RADIUS listener port (RFC 2865, only when radsec_only=false) Ignored when radsec_only=true Range: 1–65535. Requires enabled=true.
accounting_portint2083Accounting port (reserved for future) Range: 1–65535. Requires enabled=true.
auth_methods[]stringAuthentication methods evaluated in order x509 validates RADSEC peer certificate via authentication.x509 module. password uses LDAP bind. Values: x509, password. Requires enabled=true.
ca_pemstringExternal CA certificates for x509 client validation Requires enabled=true.
idle_timeoutduration30sRADSEC connection idle timeout Requires enabled=true.
session_ttlduration1hHow long RADIUS auth events are visible in session list Range: 1m-24h. Stateless protocol — sessions represent authorization events. Requires enabled=true.
tls_min_versionstring1.2Minimum TLS version for RADSEC connections 1.2 recommended, 1.1 only for legacy NAS devices Values: 1.1, 1.2, 1.3. Requires enabled=true.
tls_certstringServer TLS certificate (file path or inline PEM) Requires enabled=true.
auto_tlsboolfalseIssue TLS cert from internal ACME CA Requires enabled=true.
geo_enabledboolEnable geo-IP restrictions for RADIUS Overrides [service] geo settings when set Requires enabled=true.
geo_allow_countries[]stringISO 3166-1 alpha-2 country codes to allow Requires geo_enabled=true.
geo_deny_countries[]stringCountry codes to deny (takes precedence over allow) Requires geo_enabled=true.
geo_allow_asn[]stringASN numbers to allow Requires geo_enabled=true.
geo_deny_asn[]stringASN numbers to deny Requires geo_enabled=true.
geo_bypass_cidr[]stringCIDRs that bypass geo-IP checks Requires geo_enabled=true.
time_enabledboolEnable time-based access restrictions for RADIUS Overrides [service] time settings when set Requires enabled=true.
time_timezonestringDefault timezone for time-based restrictions IANA timezone format Requires time_enabled=true.
time_allow_days[]stringAllowed days of the week Requires time_enabled=true.
time_deny_days[]stringDenied days of the week (takes precedence over allow) Requires time_enabled=true.
time_allow_hoursstringAllowed hours range in 24h format Requires time_enabled=true.
time_deny_hoursstringDenied hours range (takes precedence over allow) Requires time_enabled=true.
time_bypass_cidr[]stringCIDRs that bypass time-based restrictions Requires time_enabled=true.
time_deny_messagestringCustom deny message for time restrictions Requires time_enabled=true.

Per-country or per-CIDR time access windows

TOML: [radius.time_windows] · Env: HEXON_RADIUS_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

Multi-factor authentication (Access-Challenge or append mode)

TOML: [radius.mfa] · Env: HEXON_RADIUS_MFA_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable MFA for RADIUS password authentication
modestringchallengeMFA mode ‘challenge’ uses Access-Challenge (RFC 2865). ‘append’ concatenates password+code. Values: challenge, append. Requires enabled=true.
methods[]stringtotpMFA methods in priority order ‘totp’ checks enrollment first. ‘otp’ sends email OTP (requires challenge mode). Values: totp, otp. Requires enabled=true.
separatorstring:Separator between password and code in append mode Split at last occurrence to handle passwords containing the separator. Requires enabled=true.
challenge_timeoutduration60sTime allowed for user to respond to Access-Challenge Range: 10s-300s Requires enabled=true.
required_groups[]stringOnly require MFA for users in these groups (empty = all users) Requires enabled=true.
skip_if_unavailableboolfalseAllow auth without MFA if no method available When false, users without TOTP enrollment are rejected. Requires enabled=true.
otp_ttlduration5mEmail OTP validity period Range: 1m-10m Requires enabled=true.
otp_code_lengthint6Email OTP code length Range: 4–8. Requires enabled=true.

Rate limiting and DoS protection

TOML: [radius.rate_limit] · Env: HEXON_RADIUS_RATE_LIMIT_<KEY>

KeyTypeDefaultDescription
max_requests_per_second_per_nasint100Per-NAS request rate limit Range: 1–100000.
max_auth_attempts_per_userint5Failed attempts before lockout Range: 1–100.
auth_lockout_durationduration5mLockout period after max failures
max_concurrent_authenticationsint1000Global concurrent auth limit Range: 1–100000.

NAS (Network Access Server) client definitions

TOML: [radius.client] · Env: HEXON_RADIUS_CLIENT_<KEY>

KeyTypeDefaultDescription
namestringUnique client identifier Required.
descriptionstringOptional description for audit logs
cidrstringIP range of the NAS (defaults to 0.0.0.0/0 if empty)
mfa_overridestringOverride MFA mode for this client Empty inherits global [radius.mfa]. ‘off’ disables MFA for this client. Values: “, off, challenge, append.
geo_enabledbool (optional)Override geo-IP restriction for this client nil=inherit, false=disable, true=use client settings
geo_allow_countries[]stringOverride allowed countries for this client
geo_deny_countries[]stringOverride denied countries for this client
geo_allow_asn[]stringOverride allowed ASNs for this client
geo_deny_asn[]stringOverride denied ASNs for this client
geo_bypass_cidr[]stringOverride bypass CIDRs for this client
time_enabledbool (optional)Override time restriction for this client nil=inherit, false=disable, true=use client settings
time_timezonestringOverride timezone for this client
time_allow_days[]stringOverride allowed days for this client
time_deny_days[]stringOverride denied days for this client
time_allow_hoursstringOverride allowed hours for this client
time_deny_hoursstringOverride denied hours for this client
time_bypass_cidr[]stringOverride bypass CIDRs for this client
time_deny_messagestringOverride deny message for this client
tls_certstringServer cert override for this NAS (file path or inline PEM)
client_ca_pemstringCA to verify this NAS device’s client certificate (mTLS)

Override time windows for this client

TOML: [radius.client.time_windows] · Env: HEXON_RADIUS_CLIENT_TIME_WINDOWS_<KEY>

KeyTypeDefaultDescription
countries[]stringISO 3166-1 alpha-2 country codes for this time window
cidr[]stringIP ranges for this time window Takes precedence over country matching
timezonestringIANA timezone for this time window
allow_days[]stringAllowed days of the week Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
deny_days[]stringDenied days of the week Deny takes precedence over allow Values: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
allow_hoursstringAllowed hours range in 24h format Format: HH:MM-HH:MM
deny_hoursstringDenied hours range in 24h format Deny takes precedence over allow; format: HH:MM-HH:MM

Group-based authorization mappings

TOML: [radius.mapping] · Env: HEXON_RADIUS_MAPPING_<KEY>

KeyTypeDefaultDescription
namestringDisplay name for logging/metrics Required.
groups[]stringRequired groups (ANY match, empty = catch-all)
priorityint0Evaluation order (higher = first)

Client Access

TOML: [client_access] · Env: HEXON_CLIENTACCESS_<KEY>

KeyTypeDefaultDescription
enabledboolfalseEnable QUIC client access listener for transparent L3 network access
hostnamestringHostname for client access listener Use when running behind a CDN; defaults to service hostname Requires enabled=true.
portintDedicated QUIC port for client access connections Must differ from service.port, forward_proxy.port, and connector.port Range: 1–65535. Requires enabled=true. Required.
network_interfacestringNetwork interface to bind client access listener Defaults to service.network_interface if not set Requires enabled=true.
certstringTLS certificate for client access hostname File path or inline PEM; falls back to service certificate if not set Requires enabled=true.
subnetstring100.64.208.0/22Virtual IP pool subnet for client access CGN space; separate from IKEv2 VPN subnet to avoid conflicts Requires enabled=true.
gateway_ipstring100.64.208.1Gateway virtual IP within the subnet Requires enabled=true.
dns_upstream[]stringInternal DNS servers for split DNS resolution Requires enabled=true.
dns_domains[]stringSplit DNS domains pushed to clients Requires enabled=true.
cidrs[]stringAdditional CIDR routes pushed to all clients Merged with per-user routes from firewall rules; use when firewall aliases only have hostname wildcards Requires enabled=true.
heartbeat_intervalduration30sHeartbeat interval Requires enabled=true.
token_refresh_intervalduration45mToken refresh interval Requires enabled=true.
max_idle_timeoutduration5mDisconnect after idle period with no streams Requires enabled=true.
max_clientsint1000Maximum concurrent client connections 0 means unlimited Min: 0. Requires enabled=true.
max_streams_per_clientint100Maximum concurrent streams per client Min: 1. Requires enabled=true.
required_groups[]stringGroups required for client access; empty allows any authenticated user Groups from [identity] directory. User must have ANY of the listed groups Requires enabled=true.
dns_rate_limitint100Maximum DNS queries per second per client Min: 1. Requires enabled=true.
vip_reservation_ttlduration5mHow long to reserve VIP after disconnect for reconnecting clients Set to 0 to disable; reconnecting clients get the same VIP within this window Requires enabled=true.

Admin

TOML: [admin] · Env: HEXON_ADMIN_<KEY>

KeyTypeDefaultDescription
audit_trailbool (optional)trueEnable command audit trail Records all admin CLI commands cluster-wide for operational visibility
audit_ttlduration24hAudit entry retention duration
audit_max_entriesint10000Maximum audit entries to retain (0 = TTL-only) Min: 0.