Removes DEFAULT_MODEL in favour of a force_model setting configurable via the admin UI. When set, every proxy request's model field is overridden, preventing uncoordinated model switches during lab sessions. Updates schemas, admin API, all three proxy endpoints, frontend, init_db, and docs (README, DOCKERHUB, KURZANLEITUNG).
4.3 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 Format werden authentifiziert, auf Quota geprüft und an den konfigurierten Ollama-Server weitergeleitet.
Funktionen
- OpenAI-kompatibler Endpunkt (
/v1/chat/completions,/v1/models) - 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-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 |
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
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
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
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
Den Proxy als OpenAI-kompatibler Endpunkt konfigurieren:
Base URL: http://<host>:8000/v1
API Key: <angelegter API-Key aus der Admin-Oberfläche>