Production operations
InferCrane is designed to run as multiple stateless gateway replicas backed by PostgreSQL. Each replica has a stableINFERCRANE_INSTANCE_ID and supervises its own loopback vLLM Router
processes. Router generations are scoped by instance, so one replica never publishes another
replica’s loopback endpoint.
Required configuration:
INFERCRANE_ENV=production: enables production security validation.INFERCRANE_DATABASE_URL: PostgreSQL URL with TLS enabled outside a trusted private network.INFERCRANE_API_KEY: at least 32 characters, supplied by the workload secret manager; no production default exists.INFERCRANE_URL: absolute HTTP(S) control-plane base URL used by lifecycle CLI commands.INFERCRANE_TLS_CERT_FILEandINFERCRANE_TLS_KEY_FILE: optional native server identity. Both are required together. AddINFERCRANE_TLS_CLIENT_CA_FILEto require and verify client certificates.INFERCRANE_PASSPORT_SIGNING_KEY_FILE: optional mounted Ed25519 private-key file for issuing Inference Passports. It must be readable only by its owner (0600); the private key is never persisted in PostgreSQL. Back it up and rotate it through the workload secret manager. For a single-host first installation, copy.env.production.exampleto a private path, replace every example secret and URL, then render and start the maintained production stack:
compose.yaml, this stack contains no fake workers or development router. Unlike
compose.runpod-acceptance.yaml, it contains no fault proxy or acceptance credential. PostgreSQL
is private to the Compose network; only the InferCrane API port is published. The bundled database
uses sslmode=disable only across that private bridge. Use managed PostgreSQL with TLS, external
secret management, and multiple control-plane instances for a production service that must survive
a host failure.
The base production stack is provider-neutral: it does not require a RunPod credential and does
not start SkyPilot. Provider adapters remain dormant until a DeploymentSpec selects them. The
image contains pinned AWS CLI v2, Google Cloud CLI, and kubectl clients because those are the
explicit process boundaries used by the AWS, GCP, and Kubernetes adapters; credentials and
kubeconfig are always supplied by the operator at runtime.
For RunPod, add the explicit production overlay and the variables from .env.runpod.example:
INFERCRANE_SKYPILOT_API=disabled is available for
diagnostics, but disables RunPod elastic provisioning from that control-plane instance.
AWS and Kubernetes follow the same explicit composition pattern:
git, OpenSSH, and rsync executables required by
SkyPilot’s task packaging and remote synchronization paths. When the RunPod overlay is enabled,
the entrypoint supervises SkyPilot’s foreground API server and exits if that required subprocess
stops. Without that overlay, InferCrane is executed directly and has no SkyPilot subprocess.
INFERCRANE_INSTANCE_ID: stable and unique per control-plane replica.INFERCRANE_DATABASE_MAX_OPENandINFERCRANE_DATABASE_MAX_IDLE: size these with the total replica count below PostgreSQL’s connection budget or place PgBouncer in transaction mode.INFERCRANE_REQUEST_RETENTION_HOURS: bounds high-volume request-accounting storage; the default is 24 hours and cleanup runs in small batches.
/livez: process liveness; it does not depend on downstream services./readyz: PostgreSQL connectivity with a bounded timeout./metrics: Prometheus-format gateway request, failure, active request, byte, duration histogram, and operation claim, completion, failure, retry, and cancellation counters.
deploy/prometheus-rules.yaml from the private-preview repository, then tune thresholds
from real model latency and traffic. Follow the compatibility policy and perform
the backup/restore drill for every release containing migrations.
Use a disruption budget, topology spread constraints, anti-affinity across failure domains, and
at least two replicas. Termination grace must exceed INFERCRANE_SHUTDOWN_TIMEOUT_SECONDS so
streaming requests and buffered request accounting can drain. Do not configure an HTTP server
write timeout: it would terminate legitimate long-running streaming inference responses.
Each replica publishes its live binary and protocol interval. Use
infercrane system instances --output json before and during a rolling upgrade. Membership does not
elect a leader: durable operation claims are independently fenced in PostgreSQL. Configure CLI mTLS
with INFERCRANE_CLIENT_TLS_CA_FILE, INFERCRANE_CLIENT_TLS_CERT_FILE, and
INFERCRANE_CLIENT_TLS_KEY_FILE; Python SDK callers can pass ca_file, cert_file, and key_file.
Put private DNS, firewalls, and workload identity at the deployment boundary; TLS does not replace
network policy.
The production image includes InferCrane, the pinned upstream vLLM Router, the pinned SkyPilot
RunPod client, AWS CLI v2, and kubectl. Including provider clients does not select or configure a
provider. Development
workers and the simple development router exist only in the development image target and are
not performance or reliability substitutes for vLLM and vLLM Router.
Before rollout, qualify the exact PostgreSQL, vLLM, vLLM Router, model, GPU, and provider versions
with sustained load, streaming cancellation, worker loss, database failover, pod termination,
and soak tests. Capacity limits must be based on those measurements rather than defaults.
Release maintainers can validate packaging metadata without publishing with make release-check.
With syft installed, make release-artifacts RELEASE_TAG=v2.0.0 creates and
verifies four exact-version archives, checksums, archive SBOMs, and a generated Homebrew formula
under dist/. It pushes no tag, image, package, or release. See Release packaging.
The control-plane API accepts the bootstrap bearer secret or hashed tenant-scoped credentials:
GET /api/v1/operations/{id}POST /api/v1/operations/{id}/cancelPOST /api/v1/deployments/applyPOST /api/v1/deploymentsDELETE /api/v1/deployments/{name}GET /api/v1/deploymentsGET|POST /api/v1/targetsGET /api/v1/orphansGET /api/v1/audit-eventsPUT /api/v1/tenant/quota- principal creation, rotation, and revocation endpoints