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).
156 lines
4.3 KiB
Markdown
156 lines
4.3 KiB
Markdown
# mediaeng/llmproxy
|
||
|
||
Ein schlanker Reverse-Proxy für [Ollama](https://ollama.com), 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.
|
||
|
||
```yaml
|
||
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`:
|
||
```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.
|
||
|
||
```yaml
|
||
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.
|
||
|
||
```yaml
|
||
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>
|
||
```
|