Search docs

Search the Beamd documentation

Configuration

Every beamd.yaml field, what it does, and the BEAMD_* environment-variable override convention.

The edge reads a single YAML file — /etc/beamd/beamd.yaml by default, or pass --config <path>. beamd init writes a starting one for you; this page is the full reference.

beamd.yaml fields

FieldRequiredNotes
base_domainyesThe hostname tunnels live under, e.g. beam.example.com.
edge_ipv4for provision-devThis server's public IPv4 (written into DNS).
edge_ipv6noOptional IPv6 target.
listen_httpsyesPublic ingress + ALPN-demuxed client control. :443 in prod, :8443 in dev.
acme_emailyesContact address registered with Let's Encrypt.
acme_canoACME directory URL. Blank = LE production; off = self-signed (dev only).
dns_provideryescloudflare or stub (in-memory, for tests). See DNS providers.
dns_provider_credsprovider-specificCloudflare: a Zone:DNS:Edit API token. Better set via env (below).
dns_zonenoRegistered zone to write records in. Blank = auto-detect from base_domain (recommended).
token_storeyesfile:<path> (a JSON {token: slug} map) or memory: for tests.
data_dirnoWhere Beamd persists state (cert cache, ACME account, bandwidth totals). Default /var/lib/beamd.
max_tunnels_per_tokennoConcurrent-tunnel cap per credential. Default 25.
max_request_body_bytesnoPer-request public body cap; oversized → HTTP 413. Default 32 MiB (33554432); -1 disables.
preview_embednoStrip X-Frame-Options + CSP frame-ancestors so previews embed cross-origin in an iframe. Default false. See Security.

A hosted deployment also configures device-code login discovery and a usage webhook; those blocks are omitted on a self-hosted edge (the CLI then requires --token, and you read /metrics instead of pushing usage).

Environment overrides

Every field can be overridden by a matching BEAMD_<UPPER_SNAKE_CASE> environment variable. This is the right place for secrets — keep them out of the YAML on disk:

BEAMD_DNS_PROVIDER_CREDS=<your-Cloudflare-API-token>
BEAMD_BASE_DOMAIN=beam.example.com      # overrides base_domain

BEAMD_DNS_PROVIDER_CREDS is the one you'll almost always set this way (the docker-compose.yml reads it from /etc/beamd/.env).

A minimal example

base_domain: beam.example.com
edge_ipv4: 203.0.113.10
listen_https: ":443"
acme_email: ops@example.com
dns_provider: cloudflare
dns_provider_creds: ""            # set via BEAMD_DNS_PROVIDER_CREDS instead
token_store: "file:/etc/beamd/tokens.json"
data_dir: /var/lib/beamd
max_tunnels_per_token: 25