Every way of running QueryAPIGate uses the same server; the shapes differ only in which parts you add around it. Start with one container and a file on disk. Add PostgreSQL and Redis when you need more than one instance, and add the Rust data plane and a ClickHouse run store when traffic calls for it. You don't rewrite anything or move your queries, and your API keys and URLs stay the same.
pip install "queryapigate[server]", then gunicorn with one worker. Add drivers as extras: postgres, mysql, clickhouse, h2, redis, or all.ghcr.io/anantharajuc/queryapigate:0.47.0 includes every driver, JWT, the Redis cache and queryapigate mcp. The -h2 tag adds Java, for H2 and generic JDBC.oci://ghcr.io/anantharajuc/charts/queryapigate --version 0.47.0. The chart version always matches the server version.One server, and the parts you add around it as you need them. The experimental parts are outside the compatibility promise.
Serves your saved queries as REST endpoints, plus the Console, the admin API and /docs.
Holds connections, queries, keys, roles, history and the audit log in one file.
The same data in a database you already back up.
Shares rate limits and the response cache across instances, and keeps the cache through restarts.
queryapigate eventsStableStreams live events to many apps and phones at once.
queryapigate mcpStableGives AI agents your saved queries as tools, under the same keys, roles and audit log.
Serves saved-query reads at 3–9× the calls per second per core.
Keeps run history and the event log, to billions of rows a day.
or load balancerYour choiceTLS, and spreading requests across instances. A Caddy example is included.
The three above, and the parts you can add to any of them. Moving between shapes is a configuration change: what each step adds is below.
Running it on your laptop in a minute.
pip install "queryapigate[server]" or docker compose up for the demoSmall teams and internal tools.
Keeping state in a database your team already runs and backs up.
QUERYAPIGATE_DATABASE_URLHigh availability and more capacity on plain Docker.
deploy/scale-out/, one Compose fileA small cluster deployment.
helm install … oci://ghcr.io/anantharajuc/charts/queryapigateProduction clusters: rolling upgrades, autoscaling, a PodDisruptionBudget.
replicas: 3Governed data access for agents: Claude, IDEs, custom agents.
mcp.enabled: true in HelmHot read endpoints at tens of thousands of calls a second.
Every call still recorded, at billions of runs a day.
QUERYAPIGATE_RUN_STORE_URL| Try it | Single server | Scaled out | Kubernetes HA | High volume | |
|---|---|---|---|---|---|
| API server | 1 | 1 | 2+ | 2+ pods | 2+ |
| SQLite store | — | — | — | ||
| PostgreSQL store | — | ||||
| Redis | — | ||||
| Events server | — | ||||
| MCP server | |||||
| Rust data plane | — | ||||
| ClickHouse run store | — | — | |||
| Reverse proxy | — | load balancer | Ingress |
QUERYAPIGATE_API_KEY=…
QUERYAPIGATE_SECRET_KEY=…
One process or container, with the store as SQLite on a volume. The key is required in a container; the secret key encrypts connection passwords at rest.
QUERYAPIGATE_DATABASE_URL=postgres://…
QUERYAPIGATE_REDIS_URL=redis://…
A shared PostgreSQL store and Redis, so any instance answers any request and limits are counted once. Run queryapigate events behind the proxy for live events. Guide 42 →
store.type: postgres · replicas: 3
existingSecret: queryapigate
The same two URLs and the key live in one Secret; the chart refuses several pods on SQLite, several without Redis, PostgreSQL without a database URL, and secrets put in config. Guide 54 →
5000REST API, /q/<name>, the Console at /console, /metricsQUERYAPIGATE_PORT5001The MCP server for AI agents (queryapigate mcp)QUERYAPIGATE_MCP_PORT5002Live events for many clients (queryapigate events)QUERYAPIGATE_EVENTS_PORTEach shape and add-on, with the number it was measured to serve. Every figure is dated and linked to its report on the next page.
Prometheus metrics and a Grafana dashboard, plus OpenTelemetry tracing Exp.
Secrets from Vault or AWS Secrets Manager Exp, and short-lived database credentials.
Signed-in users through JWT and SSO, as well as API keys.
Configuration as code: connections, queries, roles and keys in one file in git Stable.
Hardened by default: runs as non-root, on a read-only root filesystem, with every capability dropped.
The Helm chart refuses to install a shape that would quietly misbehave, and says why in its own words:
replicas: 3 · store.type: sqlitestore.type sqlite keeps the store in one file on one volume - it runs one pod.replicas: 3 · no RedisMore than one pod needs Redis, or rate limits, max_concurrent and quotas are counted per pod.store.type: postgres · no database URLstore.type postgres needs QUERYAPIGATE_DATABASE_URL in secret.values (or in your existingSecret).config: · QUERYAPIGATE_API_KEYQUERYAPIGATE_API_KEY is a secret: put it in your existingSecret or secret.values, not config - config is plain text in the Deployment.helm install, before anything changes in your cluster.The steps between a running server and one you would put in front of a partner. Tick them off as you go; this browser remembers.