4.7 KiB
mediaeng/llmproxy
Ein schlanker Reverse-Proxy für Ollama, der API-Keys mit konfigurierbaren Token- und Request-Quoten verwaltet. Eingehende Anfragen im OpenAI-kompatiblen oder Anthropic-kompatiblen Format werden authentifiziert, auf Quota geprüft und an den konfigurierten Ollama-Server weitergeleitet.
Funktionen
- OpenAI-kompatibler Endpunkt (
/v1/chat/completions,/v1/models) - Anthropic Messages API (
/v1/messages) — kompatibel mit Claude Code CLI und Anthropic-SDK-Clients - API-Key-Verwaltung mit tages- und monatlichen Token-/Request-Limits
- Web-basierte Admin-Oberfläche (Port 8001)
- Modell-Lock: erzwingt ein bestimmtes Modell für alle Requests (nützlich für Praktika/Kurse)
- Streaming-Support (Server-Sent Events)
- Tool-Use / Function Calling wird durchgereicht
- Rotierende Nutzungs-Logs
- SQLite (Standard) oder PostgreSQL
Ports
| Port | Dienst |
|---|---|
8000 |
Proxy-Endpunkt (OpenAI- und Anthropic-API) |
8001 |
Admin-API + Web-Oberfläche |
Alle API-Endpunkte erfordern das ADMIN_PASSWORD — ein Zugriff ohne gültiges Token liefert nur die öffentlichen Frontend-Dateien (HTML/JS/CSS der Login-Seite). Das Passwort ist damit die primäre Schutzmaßnahme.
Umgebungsvariablen
| Variable | Standard | Beschreibung |
|---|---|---|
ADMIN_PASSWORD |
– | Pflicht. Passwort für die Admin-Oberfläche |
OLLAMA_URL |
http://localhost:11434 |
URL des Ollama-Servers (ohne /v1-Suffix) |
DATABASE_URL |
sqlite:///./test.db |
Datenbank-Verbindungsstring (SQLite oder PostgreSQL) |
PROXY_HOST |
0.0.0.0 |
Bind-Adresse des Proxy |
PROXY_PORT |
8000 |
Port des Proxy |
ADMIN_HOST |
0.0.0.0 |
Bind-Adresse der Admin-API (127.0.0.1 für lokalen Zugriff) |
ADMIN_PORT |
8001 |
Port der Admin-API |
APP_TZ |
Europe/Berlin |
Zeitzone für Tages-/Monats-Reset der Quoten |
LOG_FILE |
logs/usage.log |
Pfad der rotierenden Nutzungs-Logdatei |
ANTHROPIC_DEFAULT_MODEL |
– | Standard-Modell für /v1/messages (Ollama-Modellname, z. B. llama3) |
Docker Compose – Ollama auf dem Host (Linux, empfohlen)
network_mode: host gibt dem Container direkten Zugriff auf das Host-Netzwerk. Ollama läuft auf dem Host und ist über localhost:11434 erreichbar — nach außen nicht sichtbar. Proxy und Admin-Oberfläche sind direkt auf den Host-Ports 8000 und 8001 verfügbar.
services:
llmproxy:
image: mediaeng/llmproxy:latest
container_name: llmproxy
restart: unless-stopped
network_mode: host
env_file: .env
volumes:
- llmproxy-data:/app/backend
volumes:
llmproxy-data:
.env:
ADMIN_PASSWORD=changeme
OLLAMA_URL=http://localhost:11434
APP_TZ=Europe/Berlin
ANTHROPIC_DEFAULT_MODEL=llama3
Docker Compose – Ollama als Container, SQLite
Ollama und llmproxy laufen gemeinsam in Docker. Ollama ist nicht nach außen exposed.
services:
llmproxy:
image: mediaeng/llmproxy:latest
restart: unless-stopped
ports:
- "8000:8000"
- "8001:8001"
environment:
ADMIN_PASSWORD: changeme
OLLAMA_URL: http://ollama:11434
APP_TZ: Europe/Berlin
ANTHROPIC_DEFAULT_MODEL: llama3
volumes:
- llmproxy-data:/app/backend
depends_on:
- ollama
ollama:
image: ollama/ollama:latest
restart: unless-stopped
volumes:
- ollama-data:/root/.ollama
volumes:
llmproxy-data:
ollama-data:
Docker Compose – Ollama als Container, PostgreSQL
Für Produktionsumgebungen mit externer Datenbank.
services:
llmproxy:
image: mediaeng/llmproxy:latest
restart: unless-stopped
ports:
- "8000:8000"
- "8001:8001"
environment:
ADMIN_PASSWORD: changeme
OLLAMA_URL: http://ollama:11434
APP_TZ: Europe/Berlin
DATABASE_URL: postgresql://llmproxy:secret@db:5432/llmproxy
ANTHROPIC_DEFAULT_MODEL: llama3
depends_on:
db:
condition: service_healthy
ollama:
condition: service_started
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: llmproxy
POSTGRES_USER: llmproxy
POSTGRES_PASSWORD: secret
volumes:
- pg-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U llmproxy"]
interval: 5s
timeout: 5s
retries: 5
ollama:
image: ollama/ollama:latest
restart: unless-stopped
volumes:
- ollama-data:/root/.ollama
volumes:
pg-data:
ollama-data:
Client-Konfiguration
OpenAI-kompatibler Client:
Base URL: http://<host>:8000/v1
API Key: <angelegter API-Key aus der Admin-Oberfläche>
Claude Code CLI:
ANTHROPIC_BASE_URL=http://<host>:8000 \
ANTHROPIC_AUTH_TOKEN=<API-Key> \
claude