pub enum Provider {
Show 13 variants
Cloudflare,
Hetzner,
Vultr,
Static,
MiniflareNative,
LocalContainer,
LocalProcess,
Device,
MiniflareContainer,
MinioContainer,
LocalPgDev,
LocalMailcrab,
LocalS3Fs,
}Expand description
Tag for the infrastructure provider kind. Drives which fields are valid in
a ProviderConfig body or a MirrorProviderSlot::Inline block.
Two flavors:
- Account/runtime providers (
cloudflare,hetzner,local-container) live as files under.yah/infra/providers/<id>.tomland are referenced from a mirror viause = "<id>". - Inline-only providers (
miniflare-native,miniflare-container,minio-container) declare an operator-local stand-in directly inside a mirror viakind = "...". They carry no credentials and have no provider file. The container-backed kinds ride on top of whicheverlocal-containerruntime is declared in infra (orbstack/colima/docker); the reconciler resolves the runtime at up-time.
Variants§
Cloudflare
Cloudflare account: R2 buckets, DNS, Workers, Tunnels.
Hetzner
Hetzner Cloud + Object Storage account.
Vultr
Vultr cloud VPS — auto-provisioned via the cloud.vps.* Envoy
(VultrEnvoy), the burst/scaling counterpart to Hetzner. Driver-backed.
Static
BYO bare/static node (OVH, on-prem, anything we did NOT provision via a
cloud API). Brought up over SSH (stand-up-yubaba.sh / yah cloud machine bootstrap); reach is declared in the machine’s [connect]
block. No create/destroy driver — placement-only.
MiniflareNative
Dev-tier static surface: miniflare (workerd) running natively — no
container — in front of whatever the mirror binds to the s3
capability (W265, R584-F4).
The door at every tier is the same compiled Worker bundle
(worker/router.bundle.js); only the object store underneath differs,
and that difference is now declared rather than branched on:
[providers.static]
kind = "miniflare-native"
port = 4321
[drivers.s3]
kind = "local-s3-fs"This replaces local-static, which served a workload’s dist/ off
disk and so gave the dev tier a storage interface no other tier had —
the fork W265 exists to delete. Inline-only; it carries no credentials
(the store is loopback, the Worker runs on this machine).
LocalContainer
Local container runtime (orbstack/colima/docker). Configured by a
provider file under .yah/infra/providers/ so the discovery hints +
runtime override sit in one place.
LocalProcess
Dev-tier compute: the component runs as a kamaji-supervised host
process against the operator’s real workspace, no container and no
build step per edit. Inline-only — it carries no credentials, and
“the machine you are sitting at” is not an account to point at.
See reconciler::local_process.
Device
Dev-tier compute on an attached iOS device or simulator, or Android
device or emulator (R941). The slot’s target names which
(ios-simulator | ios-device | android-emulator | android-device) and
optional device pins one by id or name; the component’s
workload.toml [device] section names the app. Launched and
supervised through the host’s own simctl / devicectl / adb.
Inline-only, like local-process. See reconciler::device.
MiniflareContainer
Containerized miniflare (workerd subprocess) fronting MinIO — the pond-tier stand-in for a CF Worker + R2 static surface. Inline-only; the reconciler spawns miniflare via the JS runtime and starts a MinIO container on the local-container runtime.
MinioContainer
Containerized MinIO providing an S3-compatible API — the pond-tier stand-in for Cloudflare R2. Inline-only; the reconciler spins up the container on the local-container runtime and auto-creates the declared bucket on first up.
LocalPgDev
Dev-tier PostgreSQL — a real server speaking real pgwire on loopback,
supervised by kamaji as the yah-pg-dev workload (W265, R584-F1). No
docker daemon: the driver fetches a per-arch PostgreSQL tarball on first
run and initdbs a cluster under .yah/infra/state/dev/pg/.
Inline-only — it carries no credentials worth a provider file (the
cluster is loopback-bound with a fixed dev password). Declared under
MirrorConfig::drivers, not providers:
[drivers.pg]
kind = "local-pg-dev"LocalMailcrab
Dev/pond-tier SMTP — mailcrab supervised by kamaji as the
yah-smtp-dev workload (W265, R584-F2). A real SMTP listener that
accepts every message and delivers none of them, plus a web inbox to
read what was sent. No docker daemon: the driver fetches the per-arch
mailcrab release binary on first run and caches it under
.yah/cache/mailcrab/.
Inline-only — it carries no credentials at all (the listener is
loopback-bound and unauthenticated, which is the point: a catcher that
refused unauthenticated mail would not catch the mail your app sends).
Declared under MirrorConfig::drivers, not providers:
[drivers.smtp]
kind = "local-mailcrab"LocalS3Fs
Dev-tier S3 — a filesystem-backed, path-style S3 surface supervised by
kamaji as the yah-s3-fs workload (W265, R584-F3). No docker daemon
and no download: the driver is the server, and objects live under
.yah/infra/state/dev/s3/data/<bucket>/.
Inline-only — the credentials are fixed dev strings on a loopback
listener, which is not an account to point a provider file at.
Declared under MirrorConfig::drivers, not providers:
[drivers.s3]
kind = "local-s3-fs"Unlike its two siblings the binding is optional: the camp brings
this driver up for any camp with a dev mirror whether or not a stanza
says so, because every static-asset component needs object storage and
crate::capability::Capability::for_component_kind already says as
much. Declaring it is documentation, not activation — see
crate::reconciler::s3_driver::camp_needs_s3_driver.
Trait Implementations§
impl Copy for Provider
Source§impl<'de> Deserialize<'de> for Provider
impl<'de> Deserialize<'de> for Provider
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>,
impl Eq for Provider
impl StructuralPartialEq for Provider
Auto Trait Implementations§
impl Freeze for Provider
impl RefUnwindSafe for Provider
impl Send for Provider
impl Sync for Provider
impl Unpin for Provider
impl UnsafeUnpin for Provider
impl UnwindSafe for Provider
Blanket Implementations§
impl<T> Allocation for T
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>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<K, Q> Equivalent<Q> for K
impl<K, Q> Equivalent<Q> for K
Source§fn equivalent(&self, key: &Q) -> bool
fn equivalent(&self, key: &Q) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> Fruit for T
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