Configuration
Nothing in this repository may name a host, a domain, or a secret. Those are facts about a deployment,
so everything arrives through the environment and .env.example documents what. bin/check-boundary
enforces it, in CI as well as locally.
Application
Section titled “Application”THINGS_HOST_SUFFIX |
the suffix tenant subdomains hang off — things.test in development |
PORT |
4242 in development |
THINGS_PUBLIC_ORIGIN |
public origin for the MCP endpoint when tunnelling to a client that cannot reach .test. Must be stable — OAuth redirect URIs register against it. Blank when not tunnelling |
Datastores
Section titled “Datastores”POSTGRES_HOST / POSTGRES_PORT / POSTGRES_USER / POSTGRES_PASSWORD |
the primary database |
OPENSEARCH_URL |
the query path |
PG_BIN_PATH |
set when the linked pg_dump is older than the server in compose.yml |
Solid Queue runs in a second database, in development as well as production — a queue that only exists in one environment is a queue whose failures are only discovered there.
Storage
Section titled “Storage”S3_ENDPOINT / S3_REGION / S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY |
the development MinIO, and any s3 resource configured from the environment |
THINGS_FILESYSTEM_ROOTS |
colon-separated roots a filesystem resource may be rooted under |
THINGS_FILESYSTEM_ROOTS is unset by default, and that makes the filesystem type unusable. That
is the right default for a server holding more than one tenant’s catalog: an unrooted filesystem
resource is a path traversal with extra steps.
Encryption
Section titled “Encryption”ENCRYPTION_PRIMARY_KEY |
|
ENCRYPTION_DETERMINISTIC_KEY |
|
ENCRYPTION_KEY_DERIVATION_SALT |
The values in .env.example are development-only and named so you cannot mistake them for anything
else. Generate real ones anywhere credentials are actually stored:
bin/rails db:encryption:initMASKS_ISSUER_TEMPLATE |
the tenant’s issuer, as a template over its subdomain |
Tokens are rejected unless iss matches this and aud matches the tenant’s own /mcp URL. There is
no local minting path — this application verifies and never signs.
Operational switches
Section titled “Operational switches”THINGS_ITERATORS_DISABLED |
stops every iteration job everywhere |
This one is for the operator, not a tenant — it is the big red switch. Per-tenant and
per-resource switches are rows in gates, set from the application.
Two more limits are application configuration rather than environment: mcp_limit rate-limits the
caller per minute, and run_budget caps how many runs one token may start per hour. See
MCP tools.