Get started
Install & self-host
Run the Inferix control plane on your own infrastructure. Same binary and config whether you use Docker locally, Compose in staging, or Kubernetes in production.
Requirements
- Docker 24+ or a Kubernetes cluster (1.27+)
- Persistent volume for config and TraceForge span store (optional Postgres)
- Network reachability to owned model endpoints and any providers
- Outbound HTTPS if you call external providers
Docker (single node)
docker pull ghcr.io/akshantvats/inferix:latest docker run -d \ --name inferix \ --restart unless-stopped \ -p 4000:4000 \ -e INFERIX_MASTER_KEY=sk-replace-me \ -e INFERIX_CONFIG=/etc/inferix/inferix.yaml \ -v /opt/inferix/inferix.yaml:/etc/inferix/inferix.yaml:ro \ -v /opt/inferix/data:/var/lib/inferix \ ghcr.io/akshantvats/inferix:latest
Health check: GET http://<host>:4000/health. Ready when the process has loaded models and can accept completions.
Docker Compose
# docker-compose.yml
services:
inferix:
image: ghcr.io/akshantvats/inferix:latest
ports:
- "4000:4000"
environment:
INFERIX_MASTER_KEY: ${INFERIX_MASTER_KEY}
INFERIX_CONFIG: /etc/inferix/inferix.yaml
INFERIX_POSTGRES_URL: postgres://inferix:inferix@db:5432/inferix
volumes:
- ./inferix.yaml:/etc/inferix/inferix.yaml:ro
- inferix-data:/var/lib/inferix
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: inferix
POSTGRES_PASSWORD: inferix
POSTGRES_DB: inferix
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
inferix-data:
pgdata:export INFERIX_MASTER_KEY=sk-replace-me docker compose up -d docker compose logs -f inferix
Kubernetes sketch
apiVersion: apps/v1
kind: Deployment
metadata:
name: inferix
spec:
replicas: 2
selector:
matchLabels:
app: inferix
template:
metadata:
labels:
app: inferix
spec:
containers:
- name: inferix
image: ghcr.io/akshantvats/inferix:1.0.0
ports:
- containerPort: 4000
env:
- name: INFERIX_MASTER_KEY
valueFrom:
secretKeyRef:
name: inferix
key: master_key
- name: INFERIX_CONFIG
value: /etc/inferix/inferix.yaml
volumeMounts:
- name: config
mountPath: /etc/inferix
readOnly: true
readinessProbe:
httpGet:
path: /health
port: 4000
initialDelaySeconds: 5
periodSeconds: 10
volumes:
- name: config
configMap:
name: inferix-config
---
apiVersion: v1
kind: Service
metadata:
name: inferix
spec:
selector:
app: inferix
ports:
- port: 4000
targetPort: 4000Put the ConfigMap contents from your inferix.yaml. Use a Secret for the master key and any provider credentials.
Environment variables
| Variable | Required | Description |
|---|---|---|
INFERIX_MASTER_KEY | Yes | Bearer token for control-plane API and /v1 |
INFERIX_CONFIG | No | Path to inferix.yaml (default /etc/inferix/inferix.yaml) |
INFERIX_LISTEN | No | Override listen address (default :4000) |
INFERIX_POSTGRES_URL | No | Postgres for TraceForge + DriftWatch state |
INFERIX_LOG_LEVEL | No | debug | info | warn | error |
INFERIX_OTLP_ENDPOINT | No | Export TraceForge spans to an OTLP collector |
Volumes and data
/etc/inferix— config (read-only mount recommended)/var/lib/inferix— local span/metrics buffer if Postgres is unset- Postgres (optional) — durable TraceForge spans, DriftWatch windows, FineForge job history
Upgrades
Pin image tags in production. Rolling upgrade pattern:
# Compose docker compose pull docker compose up -d # Kubernetes kubectl set image deploy/inferix \ inferix=ghcr.io/akshantvats/inferix:1.1.0 kubectl rollout status deploy/inferix
Config compatibility
Minor versions keep inferix.yaml forward-compatible. Review release notes on the suite repo before major bumps. Drain in-flight completions before killing pods if you disable connection draining at the Service.
Glossary for control plane, policy, drift, and promote.
Core concepts →