Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

boatramp.cfg schema

boatramp.cfg is the server config, read by boatramp serve. It is RON. Every value can also be set as a flag or an environment variable, which take precedence. The whole file is optional — serve runs with defaults without it.

boatramp serve --config boatramp.cfg

Precedence for any value: flag / environment variable > boatramp.cfg > built-in default.

Top-level sections, all optional:

SectionPurpose
serveBind address, data dir, auth keys, upload limits.
securityOperator security posture (profile + per-knob overrides).
secretsEnvelope encryption for cert private keys at rest.
handlersWasm handler runtime (needs the handlers feature).
clusterSelf-hosted Raft cluster (needs the cluster feature).
computeContainer / microVM execution backends.

serve

FieldTypeDefaultDescription
addrsocket address127.0.0.1:8080Bind address. Env BOATRAMP_ADDR.
data_dirpath./dataRoot for the filesystem blob + KV backends. Env BOATRAMP_DATA_DIR.
auth_root_private_key"<alg>:<hex>"Root signing key: this node verifies and mints tokens. Env BOATRAMP_AUTH_ROOT_PRIVATE_KEY.
auth_root_public_key"<alg>:<hex>"Root verify key: this node verifies only, cannot mint. Env BOATRAMP_AUTH_ROOT_PUBLIC_KEY.
bootstrap_secretstringSingle-use secret enabling token bootstrap. Prefer the env var / flag so it is not written to disk. Env BOATRAMP_BOOTSTRAP_SECRET.
signersigner enumExternal signer (KMS/HSM/Vault) in place of an in-process key. See below.
max_upload_bytesintegerunlimitedReject blob uploads larger than this.
default_sitestringSite served for a Host matching no domain, instead of 404.
protect_previewsboolfalseRequire a control-plane token to view /_deploy previews.

Warning: with no auth_root_* key configured, control-plane auth is disabled. Under the default multi-tenant posture, serve refuses to start that way on a non-loopback addr. Configure a key, bind 127.0.0.1, or select a looser security posture.

serve.signer

Selects an external signer so the root key never sits in process memory. Written as a RON enum. Credentials (tokens, PINs) come from the named environment variables, never this file.

VariantFields
Localprivate_key: "<alg>:<hex>"
Vaultaddress, key, token_env, alg (Es256 | Ed25519)
AwsKmskey_id, region (optional)
GcpKmskey_version, access_token_env
AzureKvvault_url, key, key_version, access_token_env
Pkcs11module, token_label, key_label, pin_env, alg
serve: ( signer: Vault(
    address: "https://vault:8200",
    key: "boatramp-root",
    token_env: "VAULT_TOKEN",
    alg: Es256,
) )

See Hold the signing key in a KMS/HSM/Vault.

security

The operator security posture: a profile preset plus per-knob overrides. Absent means the strict multi-tenant default. This section is operator-only — it is never part of site config, so a site writer cannot relax it. Inspect the resolved posture with boatramp security explain.

FieldTypeDefaultDescription
profilestringmulti-tenantmulti-tenant (strict), single-tenant (one trusted operator), dev (loopback-loose), or a name from profiles.
overridesknob tableIndividual knobs; a knob is the source of truth, a profile is sugar.
profilesmapCustom named profiles, each a set of overrides over the strict baseline.

Override knobs (byte caps: 0 = unlimited):

KnobDescription
allow_unauthenticated_public_bindPermit a non-loopback bind with auth off.
max_upload_bytesBlob upload cap.
allow_site_unix_upstreamsLet a site’s gateway target unix: sockets.
allow_site_private_upstreamsLet a site’s gateway target private IPs.
max_handler_blob_bytesPer-handler blobstore write cap.
max_component_bytesWasm component size cap.
oidc_require_audienceRequire an aud claim on OIDC exchange.
domain_verify_allow_privateAllow domain-verification probes to private hosts.
allow_shared_kernel_computePermit container (shared-kernel) compute; off ⇒ microVM only.
ratelimit_fail_openServe rather than reject if the rate-limit store is unavailable.
allow_implicit_routingResolve an unmatched host to a site without a registered domain (first-label <site>.host / sole site). Off under multi-tenant; a loopback bind enables it regardless. See addressing.

See Choose & inspect a security posture and The security posture model.

secrets

Envelope-encrypt cluster-managed certificate private keys so they are never cleartext in the replicated control plane. Absent means keys are stored cleartext.

FieldTypeDescription
envelopestringlocal (machine-local AES-256-GCM KEK) or vault (Vault Transit).
kek_filepathLocal KEK file (auto-generated 0600). In a cluster the same file must be on every node.
vaulttableFor envelope: "vault": addr, key (a Transit key), token_env.

See Encrypt secrets at rest.

handlers

Wasm handler runtime. Parsed always, consumed only with the handlers feature.

FieldTypeDefaultDescription
poolingboolfalseUse the wasmtime pooling allocator (faster instantiation, large virtual-memory reservation).
bindings.sqltableThe sql host binding. Omit for single-node (a per-site embedded libsql file); set url for a shared sqld.

bindings.sql fields: dir, url, admin_url, replica_url, token_env, admin_token_env, preview_mode (empty | branch | shared), preview_init. See Use handler bindings.

cluster

Self-hosted Raft cluster. Parsed always, consumed only with the cluster feature. The peer mesh runs over RFC 7250 raw-public-key mutual TLS.

FieldTypeDefaultDescription
node_idintegerThis node’s stable id, unique in the cluster.
listensocket addressBind for the Raft peer mesh (distinct from serve.addr).
peersmapid → (url, pubkey) for every node. The pubkey (logged at startup) seeds the mesh trust set.
voterslist of idsall peersThe voting quorum; peers not listed join as learners.
store_dirpath<data-dir>/raftThis node’s durable Raft store. Never shared between nodes.
bootstrapboolfalseSet on exactly one node at first bring-up.
meshtableMesh identity + TLS: key_file, key_rotation, join_token_ttl, gate_client_writes.

Warning: a non-loopback listen refuses to start until every node’s pubkey is in peers. Never point two nodes at one store_dir.

See Deploy a self-hosted cluster.

compute

Container / microVM execution backends. Present ⇒ this node advertises compute capacity to the scheduler; backends are capability-detected (container on Linux, microVM where /dev/kvm exists).

FieldTypeDefaultDescription
bridgestringbr-boatrampBridge the guest veths / VM taps attach to.
subnetstring10.0.0.0/24Guest IP subnet.
vcpusintegerdetectvCPUs this node advertises as schedulable (0 = detect).
mem_mibinteger1024Memory (MiB) advertised as schedulable (0 = 1 GiB).

See Run a container or microVM.