Docker stack: LiteLLM proxy + config-updater sidecar + Redis, fed by llm-fallbacks config generation.
Local dev only. Binds to
127.0.0.1:4000. For production, add TLS, firewall rules, and proper secret storage.
- Docker and Docker Compose v2
- Copy
deploy/.env.example→deploy/.envand setLITELLM_MASTER_KEY
From the repo root:
cp deploy/.env.example deploy/.env
# Set LITELLM_MASTER_KEY and OPENROUTER_API_KEY in deploy/.env
docker compose -f deploy/docker-compose.yml --env-file deploy/.env up --buildWait for config-init to finish, then:
curl -s http://127.0.0.1:4000/health/livelinesscurl -s http://127.0.0.1:4000/v1/chat/completions \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "free",
"messages": [{"role": "user", "content": "Say hello in one word."}],
"max_tokens": 16
}'Use model: openrouter/free for OpenRouter's meta-router instead of our ranked free alias chain.
| Service | Role |
|---|---|
config-init |
One-shot: generate_configs --deploy into shared volume |
config-updater |
Regenerates configs every 6h (configurable), restarts litellm |
litellm |
OpenAI-compatible proxy on port 4000 |
redis |
Cache backend in generated YAML |
Generated config lives on the config-data volume at /config/litellm_config_free.yaml.
| Variable | Required | Description |
|---|---|---|
LITELLM_MASTER_KEY |
Yes | Proxy admin/API key for Authorization: Bearer |
OPENROUTER_API_KEY |
Recommended | Live model discovery; dummy for offline/test |
OPENAI_API_KEY |
No | If alias chain includes OpenAI-routed models |
GROQ_API_KEY |
No | If alias chain includes Groq-routed models |
LITELLM_LOCAL_MODEL_COST_MAP |
No | true = skip GitHub model-price fetch |
UPDATE_INTERVAL_SECONDS |
No | Sidecar refresh interval (default 21600) |
DATABASE_URL |
No | LiteLLM spend DB; omit for minimal local deploy |
docker compose -f deploy/docker-compose.yml --env-file deploy/.env \
run --rm config-init
docker compose -f deploy/docker-compose.yml restart litellmOr run the updater script once:
OPENROUTER_API_KEY=dummy CONFIG_DIR=/tmp/llm-fallbacks-config \
bash deploy/scripts/update-config.sh --onceFor the public chat demo's backup backend:
- Create a Render web service from
deploy/render.yamlor rundeploy/scripts/render-setup-secondary.sh. - Set
LITELLM_MASTER_KEYas an operator-only secret — never ship to Pages. The browser uses the guest token on the Worker; Render accepts the master key for operator curl smoke tests until a LiteLLM virtual key exists (seedocs/CAVEATS.md). - Set
OPENROUTER_API_KEYand optional provider keys. OmitDATABASE_URLentirely for minimal deploy — do not set an empty string. - Sync GitHub secrets via
deploy/scripts/sync-github-secrets.sh:LITELLM_URL— Render URL (appended tochat_proxy.json)RENDER_API_KEY+RENDER_SERVICE_ID— API redeploy when deploy hook is unsetRENDER_DEPLOY_HOOK— optional hook trigger
CI appends the secondary URL to configs/chat_proxy.json and preserves existing secondaries on Worker-only redeploys.
Dockerfile.gateway generates deploy-safe YAML on boot, then runs LiteLLM on port 4000.
Free-tier note: Render/Koyeb spin down when idle. Expect 30–60s cold starts. Best-effort HA, not paid SLA uptime.
free— Our alias: failure-driven chain ranked byllm-fallbacksquality scoring.openrouter/free— OpenRouter's passthrough meta-router.
- Proxy won't start: Check
config-initexited OK (docker compose logs config-init). - 401 locally: Pass
Authorization: Bearerwith yourLITELLM_MASTER_KEY. - 401 on Render from guest token: Expected until a LiteLLM virtual key is configured. Public demo uses Worker primary with guest token.
- Provider errors: Some free models need provider API keys — check logs and
.env. - Sidecar can't restart proxy: Needs
/var/run/docker.sock(local dev only).
llm-fallbacks is a Python library in src/. This deploy/ directory is optional runtime packaging — not installed via pip install llm-fallbacks.