Environment variables
The settings that matter most, all documented inline indeploy/docker-compose.yml:
Helm chart settings
The Helm chart ships the controls you would otherwise write by hand. Set them in your values file rather than adding your own manifests:
Pods run as non-root with a read-only root filesystem and every capability
dropped (
podSecurityContext, securityContext).
Licensing
Your license is an Ed25519-signed file verified locally against PromptGuard’s public verification key (embedded in the deployment package). There is no license server in the request path, and licensing sends no content:- Signature verification is local and offline — the engine checks the signature and expiry itself, on startup.
- Air-gapped mode makes no licence calls. With
DEPLOYMENT_MODE=airgap(the deployment package default) the license heartbeat is disabled entirely — the license is enforced by signature and expiry alone. - Connected mode’s only licence call is a daily, metadata-only heartbeat
(license id, node fingerprint, customer name — never prompts, verdicts, or
any request content). If the heartbeat can’t get out, the engine keeps
serving through a configurable grace window
(
PROMPTGUARD_LICENSE_GRACE_DAYS). If the window runs out, billable requests get a 503 until the next heartbeat that reaches us — the engine keeps trying hourly, and recovery needs no restart. - What you can verify yourself: the license and heartbeat code paths are in
the source you receive (
shared/licensing/,shared/billing/license.py) — auditable end-to-end, including exactly what the heartbeat payload contains.
Monitoring
Scraping /metrics
A self-hosted API serves Prometheus metrics at /metrics to a scraper that presents its METRICS_TOKEN. Monitoring a self-hosted instance says how to set the token and what the endpoint carries; on Cloud it is not open to customers. A Prometheus outside Kubernetes scrapes it like this:
Alerting Rules
The Helm chart installs the alert rules we run on Cloud, written against these series: setmonitoring.prometheusRule.enabled=true. For a Prometheus outside Kubernetes, copy the rules from deploy/helm/promptguard/templates/prometheusrule.yaml in the release you run. They are the maintained set. The examples below show the series they are built on:
Grafana Dashboards
promptguard_security_events_by_decision is read from the database, so every pod reports the same total: take max, not sum, across pods.