Zum Inhalt

Open WebUI

Chat-Oberfläche über die Modell-Rollen des AI-Servers. GitHub

URL http://10.10.10.7:3000 — nur LAN
Backend http://llama-swap:8080/v1 (Netz ai, containerinterner Port)
Daten /opt/ai/volumes/openwebui (SQLite webui.db)

Kein Traefik, keine externe Erreichbarkeit — das kommt erst nach der Headscale-Umstellung.

Umgebungsvariablen

Variable Wert Warum
OPENAI_API_BASE_URL http://llama-swap:8080/v1 Container-zu-Container. Nicht Port 9292 — das ist die veröffentlichte Host-Seite
OPENAI_API_KEY none llama-swap hat keine Authentifizierung, Open WebUI verlangt aber einen nicht-leeren Wert
ENABLE_OLLAMA_API false Sonst pollt Open WebUI eine Ollama-Instanz, die es hier nicht gibt, und die Modellliste füllt sich mit Fehlern
WEBUI_AUTH true Anmeldung erforderlich, auch im LAN
ENABLE_SIGNUP aus .env Zweistufig, siehe unten
TZ Europe/Berlin Zeitstempel im Chatverlauf

Die Compose-Datei nutzt ${OPENWEBUI_ENABLE_SIGNUP:?…} — ohne gesetzten Wert startet der Stack gar nicht erst. Das ist Absicht: Ein versehentlich offenes Registrierungsformular soll nicht durch einen Default entstehen.

Ablauf: mit true starten, im Browser das eigene Konto anlegen (der erste angelegte Benutzer wird automatisch Administrator), dann auf false stellen und docker compose up -d erneut ausführen.

WEBUI_SECRET_KEY wird bewusst nicht gesetzt — Open WebUI erzeugt beim ersten Start .webui_secret_key im Datenverzeichnis. Geht das Volume verloren, sind alle Sitzungen ungültig; die Anmeldedaten selbst liegen in webui.db.

btrfs-Falle

webui.db ist SQLite, und /opt ist btrfs mit Copy-on-Write. Ohne chattr +C fragmentiert die Datei über Monate spürbar.

Das Flag wirkt nur auf leere Verzeichnisse

Es muss gesetzt sein, bevor der Container das erste Mal schreibt. Nachträglich bleibt es für bereits geschriebene Dateien wirkungslos.

sudo mkdir -p /opt/ai/volumes/openwebui
sudo chattr +C /opt/ai/volumes/openwebui
lsattr -d /opt/ai/volumes/openwebui        # erwartet ---------------C------

Hat das Verzeichnis schon Daten: leeren, Flag setzen, neu befüllen.

Das Verzeichnis gehört root, weil das Image als root läuft (User 0:0, HOME=/root). Eine erzwungene UID 1000 bricht die internen Cache-Pfade — daher hier die Abweichung von der sonstigen 1000:1000-Konvention.

Modell-Kuratierung

Acht Rollen gehören in die Oberfläche, zwei nicht. Die Texte sind so formuliert, dass sie direkt in die Felder unter Admin → Einstellungen → Modelle passen.

Modell-ID Anzeigename Beschreibung Tags
brain-llamacpp Standard Stärkstes Modell im Haus (qwen3.6:35b). Erste Wahl, wenn nichts dagegen spricht: 89 Tokens/s, hält auch 110 000 Tokens Kontext zuverlässig. standard, langkontext
coder-llamacpp Code Programmieren, Refactoring, Werkzeugaufrufe (qwen3-coder:30b). 93 Tokens/s, im Test fehlerfreie Tool-Calls. code, werkzeuge
translator-llamacpp Übersetzer Übersetzungen (gemma4:26b). Sieger des Übersetzungsturniers, 79–86 Tokens/s. Taugt auch als zweiter Generalist. übersetzung
vision-llamacpp Bild Bilder beschreiben und auswerten (qwen3-vl:4b), 1,5–3 Sekunden pro Bild. Bild immer VOR den Text in die Nachricht setzen. bild
ocr-llamacpp Scan zu Text Deutsche Scans und Formulare in Text (german-ocr-3.1). Auf A4-Vorlagen ausgelegt, Recall 90 Prozent. bild, dokumente
allround-llamacpp Sparsam Token-sparsamer Allrounder (nemotron3), 61 Tokens/s. Nur Text — Bilder kann dieses Modell nicht. allzweck, sparsam
cleanup-llamacpp Aufräumen Transkripte säubern und präzise Textarbeit (laguna-xs-2.1). Antwortet ohne Denkprotokoll, 63 Tokens/s. text
json-llamacpp Struktur Strukturierte Ausgaben und Metadaten-Extraktion (granite4.1:8b), rund 2 Sekunden pro Dokument. struktur, dokumente

Ausgeblendet (Sichtbarkeit auf privat):

Modell-ID Warum
voice-llamacpp Gehört Home Assistant. Die Antworten sind auf kurze Sprachkommandos getrimmt und im Chat wertlos
embed-llamacpp Kein Chat-Modell — ein Chatversuch liefert einen Vektor, keine Antwort

Nicht llama-swaps unlisted verwenden

Die Option wäre der kürzere Weg, versteckt das Modell aber vor allen Clients. Home Assistant soll voice-llamacpp weiterhin in der Modellliste finden.

Betrieb

docker compose -f /opt/aiserver/openwebui/docker-compose.yaml up -d
curl -s localhost:3000/health
docker logs open-webui --tail 50

Die erste Antwort eines kalten Modells dauert 1,5–24 Sekunden — das ist der llama-swap-Wechsel, kein Fehler. Die Residenten sind davon nicht betroffen.

Zweite Instanz auf dem NUC

Auf dem NUC läuft eine weitere Open WebUI vor Ollama, mit RAG (Qdrant) und Dokument-Extraktion (Docling) — siehe Ollama-Stack. Fachlich ist sie durch diese Instanz abgelöst; das Abschalten dort ist ein eigener Schritt und noch offen. Die RAG-Funktion ist hier noch nicht nachgebaut.