pub struct OverlayServeConfig {
pub identity: Option<String>,
pub trust_root: Option<String>,
pub encryption_required: Option<bool>,
pub max_dial_ttl_secs: Option<u64>,
pub relay_listen: Option<SocketAddr>,
pub client_auth: Option<String>,
pub allowed_clients: Vec<String>,
pub routes: Vec<OverlayRoute>,
pub egress_listen: Option<SocketAddr>,
pub services: Vec<OverlayService>,
}Expand description
[overlay] — the forward-flow serve roles this node runs (the server side of
boatramp forward). A node may be a relay/ingress (accepts external client dials and
forwards them, blind, into the cluster), an egress/terminator (fronts local backend
services), or both. A relay’s routes double as the self-serve discovery directory: the
control plane resolves boatramp forward svc/<name> against them and mints the dial capability,
so the CLI needs no hand-typed topology (the explicit flags / overlay grant --ticket remain for
control-plane-less forwards).
Fields§
§identity: Option<String>This node’s overlay identity — an ed25519:<hex> seed inline, or a path to a file holding
one. Auto-generated at <data-dir>/overlay/identity.key when unset. This is the identity a
relay’s clients and an egress’s relay pin.
trust_root: Option<String>The dial-capability trust root (ed25519:/es256: tagged hex) every dial is verified
against. Defaults to serve.auth_root_public_key (the cluster’s control-plane root).
encryption_required: Option<bool>Whether dials must be end-to-end encrypted (fail-closed). Default true.
max_dial_ttl_secs: Option<u64>Server cap on a minted dial capability’s lifetime (seconds). A POST /api/overlay/dial
request’s ttl_secs is clamped to this (overlay-dial caps are offline-verified — no
revocation — so an unbounded TTL is a standing risk). Unset ⇒ 24h.
relay_listen: Option<SocketAddr>Bind a relay/ingress here (UDP/QUIC). Unset ⇒ this node runs no relay.
client_auth: Option<String>The relay’s transport-layer client-auth posture (Security Blocker #1):
"capability-only" accepts any client key at TLS and rests authorization on the capability
gate + the egress’s E2EE-proven re-authz (self-serve, no pre-enrollment); "mutual-pin" keeps
the allowed_clients RPK pin as a strictly-more-restrictive pre-filter. REQUIRED for a relay
unless allowed_clients is non-empty (which defaults to mutual-pin); a relay with neither is a
hard error — an empty allowlist is never silently treated as accept-any.
allowed_clients: Vec<String>The client overlay identities (ed25519:/es256: tagged hex) the relay mutual-authenticates
— the enrolled operators/clients allowed to dial under client_auth = "mutual-pin". (A
capability is still required and is the authority; this is the relay’s transport-layer
pre-filter. Ignored under "capability-only".)
routes: Vec<OverlayRoute>Relay routing: a requested service → its egress. Used when relay_listen is set.
egress_listen: Option<SocketAddr>Bind an egress/terminator here (UDP/QUIC). Unset ⇒ this node runs no egress.
services: Vec<OverlayService>Egress service map: a service name → the local backend it fronts. Used when egress_listen
is set; a service not listed here is refused (the egress authorizes only what it fronts).
Trait Implementations§
Source§impl Clone for OverlayServeConfig
impl Clone for OverlayServeConfig
Source§impl Debug for OverlayServeConfig
impl Debug for OverlayServeConfig
Source§impl Default for OverlayServeConfig
impl Default for OverlayServeConfig
Source§impl<'de> Deserialize<'de> for OverlayServeConfigwhere
OverlayServeConfig: Default,
impl<'de> Deserialize<'de> for OverlayServeConfigwhere
OverlayServeConfig: Default,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for OverlayServeConfig
impl RefUnwindSafe for OverlayServeConfig
impl Send for OverlayServeConfig
impl Sync for OverlayServeConfig
impl Unpin for OverlayServeConfig
impl UnsafeUnpin for OverlayServeConfig
impl UnwindSafe for OverlayServeConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more