pub struct BlobBackendConfig {
pub blobs: Option<BlobBackend>,
pub s3_bucket: Option<String>,
pub s3_endpoint: Option<String>,
pub s3_region: Option<String>,
pub s3_path_style: bool,
pub s3_credential: Option<S3CredentialConfig>,
}Expand description
[serve.blob_backends.<project>] — a per-project blob object-store backend
(PLAN-per-project-blob-backend). Same backend-descriptor shape as the [serve] primary’s S3 fields
plus its OWN sealed base S3 credential (#505 path), so project ACME can point its wasi:blobstore
at its own bucket/endpoint/account. Key-prefix confinement (container_access) still runs on top —
a separate bucket adds PHYSICAL isolation, it does not replace the confinement (invariant 2).
Operator-configured; the backend is bound to the serve’s host-resolved project at serve wiring,
never to guest input (invariant 1). The sealed credential is resolved under THIS project’s sealed
[secrets] store at wiring; a declared backend whose credential/bucket cannot be built REFUSES the
serve (fail-closed — never a silent fallback to the global or another project’s backend, invariant
4). First cut is S3 (and fs, which is degenerate — it shares the node blob dir, so only a cloud
bucket gives physical isolation); a per-project gcs/azure needs its own descriptor fields and is
a follow-up (declaring one fails closed at build — the required bucket/account is absent).
Fields§
§blobs: Option<BlobBackend>The backend kind (fs/s3/gcs/azure). Required (mirrors the SQL binding’s required
kind): a per-project backend with no explicit kind is a startup error, so a forgotten
blobs = "s3" can’t silently build an fs backend at the shared node dir that would NOT
isolate the project’s blobs. Resolved at serve wiring (fail-closed when absent).
s3_bucket: Option<String>S3 bucket (blobs = s3) — the project’s OWN bucket.
s3_endpoint: Option<String>S3 endpoint URL (a MinIO/R2/Tigris endpoint) for this project’s backend.
s3_region: Option<String>S3 region for this project’s backend.
s3_path_style: boolUse S3 path-style addressing (MinIO) for this project’s backend.
s3_credential: Option<S3CredentialConfig>This project’s OWN sealed base S3 credential (#505) — resolved through the SAME
resolve_s3_credential path as the node primary, but keyed under THIS project’s sealed store
(boatramp:<name> resolves against project’s secrets, not the node default). The
access_key_id is a public identifier; secret_access_key is a boatramp:/env: reference
(never the raw secret in config, invariant 3). Absent ⇒ the ambient AWS env chain.
Trait Implementations§
Source§impl Clone for BlobBackendConfig
impl Clone for BlobBackendConfig
Source§impl Debug for BlobBackendConfig
impl Debug for BlobBackendConfig
Source§impl Default for BlobBackendConfig
impl Default for BlobBackendConfig
Source§impl<'de> Deserialize<'de> for BlobBackendConfig
impl<'de> Deserialize<'de> for BlobBackendConfig
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 BlobBackendConfig
impl RefUnwindSafe for BlobBackendConfig
impl Send for BlobBackendConfig
impl Sync for BlobBackendConfig
impl Unpin for BlobBackendConfig
impl UnsafeUnpin for BlobBackendConfig
impl UnwindSafe for BlobBackendConfig
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