Skip to content

Configuration

Every setting is an environment variable, read once at boot. The only required one is the secret key; everything else has a default that is safe on localhost.

Required

PRODPEEK_SECRET_KEY Encrypts stored credentials, signs the session cookie. prodpeek gen-key. The process refuses to start without it.

Paths

Default
PRODPEEK_DATA_DIR data Instance state, audit log, proofs, caches
PRODPEEK_DB $DATA/prodpeek.db
PRODPEEK_AUDIT_LOG $DATA/audit.jsonl
PRODPEEK_PROFILES_DIR unset An overlay on the bundled catalog. Loads as local, may only narrow
PRODPEEK_CATALOG_DIR unset Replaces the bundled catalog. Development and testing only

The policies ship inside the image; there is nothing to mount.

Network

Default
PRODPEEK_HOST 127.0.0.1 0.0.0.0 in the container
PRODPEEK_PORT 8787

Before it leaves localhost

Default
PRODPEEK_SESSION_HTTPS_ONLY false Marks the session cookie Secure. Turn on once TLS is in front
PRODPEEK_LOGIN_MAX_ATTEMPTS 10 Failed sign-ins per window per address. 0 disables
PRODPEEK_LOGIN_WINDOW 300 Seconds

Warning

PRODPEEK_SESSION_HTTPS_ONLY=true with no TLS actually in front means nobody can sign in. That is the correct failure.

Proving and monitoring

Default
PRODPEEK_PROVE_INTERVAL 3600 Seconds between proof runs. 0 disables the schedule
PRODPEEK_MONITOR_TICK 5 Scheduler tick. 0 disables monitoring

The feed and the kill switch

All optional. With none of it set, Prodpeek makes no outbound connection and enforces exactly what it always did — deny-by-default is local.

Default
PRODPEEK_CONTROL_URL unset The control plane. Unset means no egress, ever
PRODPEEK_CHECKIN_INTERVAL 300
PRODPEEK_FEED_KEYS unset key_id:base64 pairs whose feeds this instance believes
PRODPEEK_FEED_FILE unset A signed feed on disk, for air-gapped instances
PRODPEEK_ON_REVOKED block Revocation is the only state that blocks by default
PRODPEEK_ON_STALE warn
PRODPEEK_ON_DRIFT warn block makes a drifted service unavailable
PRODPEEK_ON_MODIFIED warn

Licence

Default
PRODPEEK_LICENSE_ENFORCE false With it on, an instance past its trial refuses /mcp
PRODPEEK_LICENSE_KEY unset

The gate is scoped to /mcp. Console, API, monitoring, incidents and prove keep working regardless.

Adapters

Default
PRODPEEK_SSH_KNOWN_HOSTS $DATA/known_hosts Where host keys are pinned
PRODPEEK_SSH_POOL_TTL 300 How long an authenticated connection is reused
PRODPEEK_GIT_CACHE_DIR $DATA/git Bare mirrors
PRODPEEK_GIT_FETCH_TTL 300 How long a mirror is reused before refetching

The built-in adapters run in-process by default. Setting PRODPEEK_{SSH,PG,GIT,PROM}_ADAPTER_URL puts one back behind HTTP — same adapter, same menu, reached over a network instead.

AI

Not an environment variable. The provider key is set in the console, under Settings → AI, and PUT /api/v1/settings refuses it with secret_not_accepted.

That is deliberate: an agent holding an admin key should not be a courier for your provider key either. Provider, model and base URL are ordinary settings; the key is encrypted at rest and never shown again.

With none configured, Prodpeek makes zero outbound AI calls and loses no functionality.

Settings, showing the AI section and the derived outbound-connections table

Extra request headers

Not an environment variable — they are per service, set on the add-service form or through the API, and encrypted at rest like the credential.

For upstreams that need more than a token: Grafana Cloud's hosted MCP wants X-Grafana-URL to say which stack a call is for.

Refused, always: Authorization and Proxy-Authorization (the credential owns those), Host (it redirects a stored credential at a different server), and the hop-by-hop headers Connection, Transfer-Encoding, Upgrade, Content-Length, TE and Trailer. A value containing a newline is refused as header injection.

Logging

Default
PRODPEEK_LOG_LEVEL info warning shows only refusals and errors
PRODPEEK_ACCESS_LOG false uvicorn's raw request lines. The decision log is the useful signal

One readable line per decision:

2026-09-24 09:14:22  prodpeek  DENY  principal=anders tool=ejd-coolify__deploy_application reason=tool_explicitly_denied profile=coolify/read-only