| |
| ai-librechat-deutsch [2026/10/20 08:26] – created misa | ai-librechat-deutsch [2026/10/20 11:23] (current) – misa |
|---|
| ====== Root³ Solutions LibreChat Deployment Guide ====== | ====== Root³ Solutions LibreChat Deployment Guide ====== |
| |
| **Stack**: LibreChat + LM Studio (Qwen3 27B) + ComfyUI MCP | **Stack**: LibreChat + LM Studio (Qwen3 27B) + ComfyUI MCP + Admin-Panel |
| **Host**: 192.168.1.203 — Nobara Linux, Podman (kein Docker) | **Host**: 192.168.1.203 — Nobara Linux, Podman (kein Docker) |
| **Installiert**: 2026-10-19 | **Installiert**: 2026-10-19 / finalisiert 2026-10-20 |
| **URL**: http://192.168.1.203:3080 | **URLs**: App http://192.168.1.203:3080 — Admin-Panel http://192.168.1.203:3090 |
| | **Konto**: info@root3.de (ADMIN — erster registrierter Nutzer) |
| |
| |
| ===== 1. Verzeichnisstruktur ===== | ===== 1. Verzeichnisstruktur ===== |
| |
| Alle Dateien liegen in einem Ordner unter dem Home-Verzeichnis von rootai. Keine systemd-Units, keine separate .env-Datei — alles ist entweder inline in compose.yaml oder in der .env-Datei, die in den Container eingebunden wird. | Ein Ordner, alles drin. Alle Secrets liegen NUR in .env — compose.yaml referenziert sie als ${VARS}, nie hartkodiert [1]. |
| |
| <code bash> | <code bash> |
| ~/librechat/ | ~/librechat/ |
| ├── compose.yaml # Podman Compose — 2 Services (api + mongodb) | ├── compose.yaml # Podman Compose — 3 Services (api + mongodb + admin-panel) |
| ├── librechat.yaml # LibreChat-Konfig — Endpoints, MCP, Interface | ├── librechat.yaml # LibreChat-Konfig — Endpoints, MCP, Interface |
| ├── boot-librechat.sh # Login-Autostart-Skript (LLM zuerst) | ├── boot-librechat.sh # Login-Autostart-Skript (LLM zuerst) |
| ├── .env # Secrets + Umgebungsvariablen (nach /app/.env eingebunden) | ├── .env # ALLE Secrets + Umgebungsvariablen (in api und Panel eingebunden) |
| ├── root_solutions_logo.svg # Dein Logo — ersetzt die eingebaute logo.svg | ├── root_solutions_logo.svg # Dein Logo — ersetzt die eingebaute logo.svg |
| ├── index.html # Gepatchtes LibreChat-Index (linkt custom.css) | ├── index.html # Gepatchtes LibreChat-Index (linkt custom.css) |
| └── custom.css # Logo-Größe + Zentrierung Override | └── custom.css # Logo-Größe + Zentrierung Override |
| </code> | </code> |
| |
| ===== 2. compose.yaml (Komplett) ===== | ===== 2. compose.yaml (Komplett) ===== |
| |
| Nur zwei Services: die LibreChat-API und MongoDB. Code-Interpreter wurde entfernt (das ghcr-Image liefert 403 — es wurde aus dem Registry entfernt [1]). | Drei Services: LibreChat-API, MongoDB und das separate Admin-Panel [1]. Keine Secrets in dieser Datei — nur eine ${VARIABLE}-Referenz für das Panel-Session-Secret, die podman-compose bei der Container-Erstellung aus .env auflöst (verifiziert funcionando). |
| |
| <code yaml> | <code yaml> |
| - librechat-uploads:/app/api/data/uploads | - librechat-uploads:/app/api/data/uploads |
| - librechat-logs:/app/api/logs | - librechat-logs:/app/api/logs |
| # Umgebungsdatei mit allen Secrets | # Alle Secrets/Env — einzige Wahrheit ist ./.env |
| - ./.env:/app/.env:ro | - ./.env:/app/.env:ro |
| environment: | environment: |
| volumes: | volumes: |
| - librechat-db-data:/data/db | - librechat-db-data:/data/db |
| | restart: "no" |
| | |
| | admin-panel: |
| | image: registry.librechat.ai/librechat-ai/librechat-admin-panel:latest |
| | container_name: librechat-admin |
| | ports: |
| | - "3090:3000" |
| | depends_on: |
| | - api |
| | extra_hosts: |
| | - "host.containers.internal:host-gateway" |
| | volumes: |
| | - ./.env:/app/.env:ro |
| | environment: |
| | - PORT=3000 |
| | - SESSION_SECRET=${ADMIN_PANEL_SESSION_SECRET} |
| | - API_SERVER_URL=http://librechat-app:3080 |
| | - VITE_API_BASE_URL=http://192.168.1.203:3080 |
| restart: "no" | restart: "no" |
| |
| |
| **Wichtige Design-Entscheidungen:** | **Wichtige Design-Entscheidungen:** |
| * //restart: "no"// auf allen Services — du steuerst den Start über das Boot-Skript, kein Auto-Neustart bei Crash oder Reboot (passt zu deinem open-webui-Pattern) | * //restart: "no"// überall — Start wird vom Boot-Skript gesteuert; keine unerwarteten Auto-Neustarts (passt zu deinem open-webui-Pattern) |
| * //host.containers.internal:host-gateway// — erlaubt dem Container, LM Studio und ComfyUI auf dem Host per Namen statt harter LAN-IP zu erreichen [2] | * //host.containers.internal:host-gateway// — Container erreichen LM Studio (:1234) und ComfyUI (:8188) auf dem Host per Namen, ohne harte LAN-IP |
| * Named Volumes für alle dauerhaften Daten — man kann Container bedenkenlos löschen/erneuern ohne Chat-Verlauf, Uploads oder Datenbank zu verlieren [3] | * Named Volumes für alle dauerhaften Daten — Löschen/Erneuern von Container berührt nie Chat-Verlauf, Uploads oder Datenbank [2] |
| * //docker.io/library/mongo:latest// vollqualifiziert — verhindert den interaktiven "Image auswählen"-Prompt, der unbeaufsichtigte Skripte aufhängt | * Vollqualifizierte Image-Namen (docker.io/library/mongo:latest) — verhindert den interaktiven "Image auswählen"-Prompt in unbeaufsichtigten Skripten |
| | * Das Admin-Panel hat eine **eigene URL** (:3090), ist kein Tab in der App — das ist LibreChars offizielle Architektur [1]; Nutzer-Verwaltung existiert nur dort (oder via Registrierung bzw. den offiziellen create-user/delete-user-CLI-Skripts) |
| |
| ===== 3. .env-Datei ===== | |
| |
| Alle Secrets und Auth-Einstellungen stehen hier. Wird nach ///app.env// im Container eingebunden. So liest LibreChat in diesem Build seine Konfiguration (das //@librechat/data-schemas//-Paket erwartet sie dort, nicht nur in Process Env) [4]. | ===== 3. .env-Datei (Komplett — ALLE Secrets hier) ===== |
| |
| <code bash> | <code bash> |
| JWT_SECRET=super_secret_token_string_generation_12345 | JWT_SECRET=super_secret_token_string_generation_12345 |
| REFRESH_TOKEN_SECRET=super_secret_refresh_token_string_54321 | REFRESH_TOKEN_SECRET=super_secret_refresh_token_string_54321 |
| # DAS IST DIE EIGENTLICH WIRKSAME VARIABLE FÜR SIGN-IN IN DIESEM IMAGE-BUILD: | # ⚠️ DIE Variable, die dieser Image-Build für Sign-in tatsächlich liest (siehe 8a): |
| JWT_REFRESH_SECRET=super_secret_refresh_token_string_54321 | JWT_REFRESH_SECRET=super_secret_refresh_token_string_54321 |
| | ADMIN_PANEL_SESSION_SECRET=08513016b4e0f9fc9d3466f4d10e740efdf490c6d2fae7bc86536b2bb7fc5ea3 |
| | ADMIN_PANEL_PORT=3090 |
| | ADMIN_PANEL_URL=http://192.168.1.203:3090 |
| </code> | </code> |
| |
| **⚠️ Kritischer Hinweis zu JWT_REFRESH_SECRET:** | **Hinweise:** |
| Das //@librechat/data-schemas//-Paket in diesem Image (Zeile 5989 von //dist/index.mjs//) ruft //jwt.sign()// mit //process.env.JWT_REFRESH_SECRET// auf, **nicht** mit //REFRESH_TOKEN_SECRET//. Ohne diese Zeile funktioniert die Registrierung, aber der Login liefert einen 500-Fehler "secretOrPrivateKey must have a value". Beide Zeilen bleiben zur Klarheit erhalten; nur //JWT_REFRESH_SECRET// wird vom Signing-Code tatsächlich gelesen. | * Wird in BEIDE Container (api und admin-panel) eingebunden (.env:/app/.env:ro) — der Auth-Code der api liest Secrets aus dieser Datei [3] |
| | * ALLOW_REGISTRATION=true schaltet den Sign-up-Link frei; nach Konto-Anlage auf false stellen, um die Tür zu verschließen (Nutzer können weiterhin über Panel/CLI angelegt werden) |
| | * ADMIN_PANEL_PORT / ADMIN_PANEL_URL werden aktuell von keinem Service gelesen — als Absichtsdokumentation behalten |
| |
| |
| apiKey: "lm-studio" | apiKey: "lm-studio" |
| models: | models: |
| fetch: true # lädt die Live-Modellliste aus LM Studio | fetch: true # Live-Modellliste aus LM Studio |
| default: ["qwen/qwen3.8-27b"] # deine tatsächliche Modell-ID | default: ["qwen/qwen3.8-27b"] # deine tatsächliche Modell-ID |
| titleConvo: true | titleConvo: true |
| |
| **Hinweise:** | **Hinweise:** |
| * //baseURL// ist der korrekte Feldname (nicht "url") [5] | * //baseURL// ist der korrekte Feldname (nicht "url") [4] |
| * //fetch: true// bedeutet: die Modell-Auswahl füllt sich automatisch aus dem, was in LM Studio geladen ist — kein hartkodieren jeder Modell-ID nötig [6] | * //fetch: true// füllt die Modell-Auswahl automatisch aus dem, was in LM Studio geladen ist |
| * Das ursprünglich geplante "mcp-server-comfyui"-Paket existiert nicht auf npm; //comfyui-mcp// ist das echte, unterstützt Remote-ComfyUI via --comfyui-url [7] | * "mcp-server-comfyui" existiert NICHT auf npm — //comfyui-mcp// ist das echte Paket, unterstützt Remote-ComfyUI via --comfyui-url [5] |
| * Der erste MCP-Aufruf braucht Internet im Container für den npx-Download — folgende Aufrufe sind gecacht | * Der erste MCP-Aufruf braucht Internet im Container (npx-Download); spätere Aufrufe sind gecacht |
| |
| |
| ===== 5. Logo-Größe (custom.css) ===== | ===== 5. Logo-Größe (custom.css) ===== |
| |
| LibreChat rendert logo.svg in seiner eingebauten CSS auf eine feste kleine Größe, und es gibt keinen Config-Schalter dazu. Lösung: index.html so patchen, dass ein zusätzliches Stylesheet gelinkt wird, dann die img-Regel überschreiben [8]. | LibreChat rendert logo.svg in fester kleiner Größe, ohne Config-Schalter. Lösung: gepatchtes index.html lädt ein zusätzliches Stylesheet, das die img-Regel überschreibt [6]. |
| |
| ==== 5a. So wurde es eingerichtet ==== | ==== 5a. So wurde es eingerichtet ==== |
| # 1) Die echte index.html aus dem Container holen (während er läuft) | # 1) Die echte index.html aus dem Container holen (während er läuft) |
| podman exec librechat-app cat /app/client/dist/index.html > ~/librechat/index.html | podman exec librechat-app cat /app/client/dist/index.html > ~/librechat/index.html |
| |
| # 2) Einen Link-Tag in <head> einfügen | # 2) Einen Link-Tag in <head> einfügen |
| sed -i 's|</head>|<link rel="stylesheet" href="/custom.css"></head>|' ~/librechat/index.html | sed -i 's|</head>|<link rel="stylesheet" href="/custom.css"></head>|' ~/librechat/index.html |
| | # 3) Das Override selbst (Datei: ~/librechat/custom.css) |
| # 3) Das Override erstellen | |
| cat > ~/librechat/custom.css <<'EOF' | cat > ~/librechat/custom.css <<'EOF' |
| img[src*="logo.svg"] { | img[src*="logo.svg"] { |
| </code> | </code> |
| |
| ==== 5b. Größe nachstellen ==== | ==== 5b. Nachjustierung ==== |
| |
| //~/librechat/custom.css// auf der Platte editieren, den px-Wert ändern, Browser hart neu laden (Strg+Shift+R). Kein Container-Neuaufbau nötig — es ist ein Bind-Mount, liest live. | px-Wert in //~/librechat/custom.css// ändern → Browser hart neu laden (Strg+Shift+R). Bind-Mount liest live — kein Container-Neuaufbau nötig. |
| |
| | ⚠️ **Nach jedem LibreChat-Image-Update** index.html aus dem frischen Container neu extrahieren und die sed-Zeile erneut anwenden, dann einmal down/up (sonst geht das Logo-Patch mit dem neuen Image verloren). |
| |
| ===== 6. boot-librechat.sh (Autostart-Skript) ===== | |
| |
| Läuft über Nobara Login Scripts (System-Einstellungen → Autostart → Login-Skripte). Reihenfolge wie dein bestehendes //start-ai-new.sh//: LLM zuerst, dann Container, dann Health-Check. Idempotent — sicher bei mehrfacher Auslösung beim Login. | ===== 6. boot-librechat.sh (Finale Version) ===== |
| | |
| | Läuft über Nobara Login Scripts (System-Einstellungen → Autostart → Login-Skripte). Reihenfolge wie dein bestehendes start-ai-new.sh: LLM zuerst, dann alle drei Container, dann Health-Check. Idempotent — mehrfaches Auslösen beim Login ist sicher. |
| |
| <code bash> | <code bash> |
| sleep 5 | sleep 5 |
| |
| # --- 3. LibreChat-Container starten ----------------------------------- | # --- 3. Alle LibreChat-Container starten ------------------------------- |
| if podman ps -a --filter "name=librechat-app" --format '{{.Names}}' | grep -q librechat-app; then | if podman ps -a --filter "name=librechat-app" --format '{{.Names}}' | grep -q librechat-app; then |
| echo "📦 LibreChat-Container werden gestartet..." | echo "📦 LibreChat-Container werden gestartet..." |
| podman start librechat-app librechat-db | podman start librechat-app librechat-db librechat-admin 2>&1 |
| else | else |
| echo "⚠️ Container nicht gefunden — erst via Compose anlegen..." | echo "⚠️ Container nicht gefunden — erst via Compose anlegen..." |
| # --- 4. Health-Check --------------------------------------------------- | # --- 4. Health-Check --------------------------------------------------- |
| for i in $(seq 1 10); do | for i in $(seq 1 10); do |
| if curl -s --connect-timeout 2 http://localhost:3080/api/version > /dev/null \ | if curl -s --connect-timeout 2 http://localhost:3080/ > /dev/null; then |
| || curl -s --connect-timeout 2 http://localhost:3080/ > /dev/null; then | |
| echo "✅ LibreChat-API ist erreichbar." | echo "✅ LibreChat-API ist erreichbar." |
| break | break |
| </code> | </code> |
| |
| **Autostart-Einrichtung (einmalig):** | **Autostart-Einrichtung (einmalig, erledigt):** |
| * Nobara System-Einstellungen → Autostart → **+ Neu hinzufügen** → Login-Skript | * Nobara System-Einstellungen → Autostart → + Neu hinzufügen → Login-Skript → //~/librechat/boot-librechat.sh// → Ja sagen für Ausführbarkeit |
| * //~/librechat/boot-librechat.sh// auswählen | |
| * **Ja** sagen, wenn nach Ausführbarkeit gefragt wird | |
| * Zum Deaktivieren: Eintrag löschen, oder //rm ~/librechat/boot-librechat.sh// | * Zum Deaktivieren: Eintrag löschen, oder //rm ~/librechat/boot-librechat.sh// |
| |
| **Log-Datei:** ///var/log/librechat-boot.log// — mit //tail -f /var/log/librechat-boot.log// ansehen | **Log-Datei:** ///var/log/librechat-boot.log// — //tail -f /var/log/librechat-boot.log// |
| |
| |
| |
| ^ Aktion ^ Befehl ^ | ^ Aktion ^ Befehl ^ |
| ^ Stack starten (manuell) ^ cd ~/librechat && podman start librechat-app librechat-db ^ | | --- | --- | |
| ^ Stack stoppen ^ podman stop librechat-app librechat-db ^ | ^ Stack starten (manuell) ^ podman start librechat-app librechat-db librechat-admin ^ |
| ^ Logs (App) ansehen ^ podman logs --tail 100 librechat-app ^ | ^ Stack stoppen ^ podman stop librechat-app librechat-db librechat-admin ^ |
| ^ Logs (Mongo) ansehen ^ podman logs --tail 50 librechat-db ^ | | up/down der Container nach yaml-/env-Änderung | cd ~/librechat && podman-compose --in-pod true down && podman-compose --in-pod true up -d ^ |
| | ^ LibreChat-Image aktualisieren (behalten alle Daten) ^ cd ~/librechat && podman-compose --in-pod true down && podman pull ghcr.io/danny-avila/librechat:latest && podman-compose --in-pod true up -d ^ |
| | | --- | --- | |
| | ^ App-Logs ansehen ^ podman logs --tail 100 librechat-app ^ |
| | ^ Mongo-Logs ansehen ^ podman logs --tail 50 librechat-db ^ |
| | ^ Panel-Logs ansehen ^ podman logs --tail 50 librechat-admin ^ |
| ^ Boot-Log ansehen ^ tail -f /var/log/librechat-boot.log ^ | ^ Boot-Log ansehen ^ tail -f /var/log/librechat-boot.log ^ |
| ^ Pod-Status prüfen ^ podman pod ps ^ | ^ Pod-Status prüfen ^ podman pod ps ^ |
| ^ LibreChat-Image aktualisieren (behalten alle Daten) ^ cd ~/librechat && podman-compose down && podman pull ghcr.io/danny-avila/librechat:latest && podman-compose --in-pod true up -d ^ | ^ Stack entfernen, DATEN behalten ^ cd ~/librechat && podman-compose --in-pod true down ^ |
| ^ Stack entfernen, Daten behalten ^ cd ~/librechat && podman-compose down ^ | |
| ^ Komplett löschen inkl. Daten ^ oben + podman volume rm librechat-db-data librechat-images librechat-uploads librechat-logs ^ | ^ Komplett löschen inkl. Daten ^ oben + podman volume rm librechat-db-data librechat-images librechat-uploads librechat-logs ^ |
| ^ Nutzer in DB abfragen ^ podman exec librechat-db mongosh --quiet --eval 'db.getSiblingDB("LibreChat").users.findOne({}, {email:1, roles:1})' ^ | | --- | --- | |
| | ^ Alle Nutzer + Rollen auflisten ^ podman exec librechat-db mongosh --quiet --eval 'db.getSiblingDB("LibreChat").users.find({}, {email:1, roles:1}).toArray()' ^ |
| ^ Live-Modelle von LM Studio prüfen ^ curl -s http://localhost:1234/v1/models ^ | ^ Live-Modelle von LM Studio prüfen ^ curl -s http://localhost:1234/v1/models ^ |
| | |
| | **Hinweise:** |
| | * "up/down nach yaml/env-Änderung" = wendet deine Config-Änderungen an (das ist deine Zeile — Achte auf das korrekte Bindestrich in -in-pod) |
| | * "Image aktualisieren" holt zusätzlich die neue Version; danach index.html fürs Logo neu extrahieren (Abschnitt 5b) |
| | * Alle down/rm-Befehle berühren Named Volumes nie — Daten sind sicher |
| |
| |
| ==== 8a. Login liefert 500 "secretOrPrivateKey must have a value" ==== | ==== 8a. Login liefert 500 "secretOrPrivateKey must have a value" ==== |
| |
| **Ursache:** Dieser LibreChat-Image-Build liest //process.env.JWT_REFRESH_SECRET//, nicht //REFRESH_TOKEN_SECRET//. Der Variablenname ist spezifisch für die in diesem Image enthaltene Version des //@librechat/data-schemas//-Pakets (bestätigt in //dist/index.mjs:5989//). | **Ursache:** Dieser Image-Build signiert Refresh-Tokens mit //process.env.JWT_REFRESH_SECRET//, nicht REFRESH_TOKEN_SECRET (bestätigt in node_modules/@librechat/data-schemas/dist/index.mjs:5989). Registrierung funktionierte, weil dort kein Token ausgestellt wird. |
| **Lösung:** //JWT_REFRESH_SECRET=<Wert>// zu //~/librechat/.env// hinzufügen, dann neu aufbauen. | **Lösung:** JWT_REFRESH_SECRET=<Wert> in .env + Neuaufbau. ✅ Angewendet. |
| |
| ==== 8b. "Image auswählen"-Prompt hängt das Boot-Skript ==== | ==== 8b. "Image auswählen"-Prompt hängt Skripte auf ==== |
| |
| **Ursache:** Ein nackter Image-Name (z. B. mongo:latest) löst Podmans interaktiven Registry-Auswahlmenü aus, wenn kein lokaler Treffer da ist. Ohne TTY beim Login blockt das ewig. | **Ursache:** Nackte Image-Namen lösen Podmans interaktiven Registry-Auswahlmenü aus; ohne TTY blockt es ewig. |
| **Lösung:** In compose.yaml immer vollqualifizierte Namen verwenden — //docker.io/library/mongo:latest//, //ghcr.io/danny-avila/librechat:latest//. | **Lösung:** Vollqualifizierte Namen in compose.yaml (docker.io/library/mongo:latest, ghcr.io/danny-avila/librechat:latest). ✅ Angewendet. |
| |
| ==== 8c. Code-Interpreter-Image liefert 403 Forbidden ==== | ==== 8c. Code-Interpreter-Image 403 Forbidden ==== |
| |
| **Ursache:** //ghcr.io/danny-avila/code-interpreter:latest// wurde aus dem Registry entfernt (403 = Repo nicht mehr öffentlich/existent). Die aktuelle offizielle LibreChat-Compose-Datei enthält keinen code-interpreter-Service [9]. | **Ursache:** ghcr.io/danny-avila/code-interpreter:latest existiert nicht mehr im Registry; die offizielle Compose-Datei liefert es auch nicht mehr [1]. |
| **Lösung:** Service komplett entfernen — für Chat + ComfyUI-MCP nicht nötig. | **Lösung:** Service entfernt — für Chat + ComfyUI-MCP nicht nötig. ✅ Angewendet. |
| |
| ==== 8d. Logo auf der Login-Seite zu klein ==== | ==== 8d. Logo auf der Login-Seite zu klein ==== |
| |
| **Ursache:** LibreChars eingebaute CSS skaliert logo.svg auf eine feste kompakte Dimension. Es gibt keinen Config-Schalter dafür im interface-Objekt [10]. | **Ursache:** Eingebaute CSS skaliert logo.svg fix; kein Config-Schalter im interface-Objekt vorhanden. |
| **Lösung:** Eine gepatchte index.html mounten, die custom.css verlinkt, und dann mit //img[src*="logo.svg"] { height: 140px !important; }// überschreiben. | **Lösung:** Gepatchtes index.html → custom.css → img[src*="logo.svg"]-Override, 140px + zentriert. ✅ Im Browser verifiziert. |
| |
| ==== 8e. podman-compose --pod Flag wird nicht erkannt ==== | ==== 8e. podman-compose --pod wird nicht erkannt ==== |
| |
| **Ursache:** Podman Desktop liefert kein podman-compose mit; das dnf-Paket ist v1.x (containers/podman-compose) [11], das einen anderen Flag-Namen als die pipx-Version verwendet. | **Ursache:** Das dnf-Paket (v1.6.0) ist containers/podman-compose v1.x — anderer Flag-Name als die pipx-Version. |
| **Lösung:** //podman-compose --in-pod true up -d// statt //--pod// verwenden. | **Lösung:** //--in-pod true// vor dem Subkommando verwenden: podman-compose --in-pod true up -d. ✅ Angewendet. |
| |
| ==== 8f. "agent_id is required in request body" beim ersten Chat ==== | ==== 8f. "agent_id is required in request body" ==== |
| |
| **Ursache:** Die Unterhaltung wurde erstellt, bevor der LM-Studio-Endpoint im Modell-Picker ausgewählt war — die Anfrage lief an den Agents-Endpunkt. | **Ursache:** Nachricht wurde gesendet, bevor im Modell-Picker der LM-Studio-Endpoint ausgewählt war — Anfrage lief an den Agents-Endpunkt. |
| **Lösung:** Neue Unterhaltung starten und im Picker explizit LM Studio + Modell wählen, vor dem Senden. | **Lösung:** Neue Unterhaltung, Modell zuerst explizit wählen. ✅ Behoben. |
| |
| | ==== 8g. Admin-Panel-Image 403 auf ghcr ==== |
| |
| ===== 9. Was funktioniert / Verifiziert ===== | **Ursache:** ghcr.io/danny-avila/librechat-admin-panel:latest existiert dort nicht; korrektes Registry laut offizieller Compose ist registry.librechat.ai/librechat-ai/librechat-admin-panel:latest [1]. |
| | **Lösung:** Image-Referenz korrigiert. ✅ Container läuft, Panel erreichbar unter :3090. |
| | |
| | ==== 8h. Logs zeigen "OpenID check failed: 500 .../openid/check" ==== |
| | |
| | **Ursache:** Bekannter Upstream-Bug — LibreChat-Issue #14504, gefixt in PR #14507. Der Maintainer bestätigt: Log-Rauschen, NICHT der Login-Blocker (das Panel behandelt jede nicht-ok-Antwort als "SSO unavailable" und fällt auf E-Mail/Passwort zurück). |
| | **Aktion:** Keine — ignorieren, bis ein Image-Update den Fix enthält. |
| | |
| | ==== 8i. Admin-Panel-Login: Formular wird abgeschickt, passiert nichts ==== |
| | |
| | ⚠️ **OFFENER PUNKT.** API-Logs zeigen wiederholt //[Login] [Login successful] [info@root3.de]// — Zugangsdaten akzeptiert, Auth funktioniert; das Panel stellt aber keine Browser-Session auf. Verdacht Nr. 1: Session-Cookies mit Secure-Flag über plain HTTP (Kandidaten: SESSION_COOKIE_SECURE=false / ADMIN_PANEL_SESSION_COOKIE_SECURE=false in .env) oder Panel-internes Session-Wiring. Zweite offene Prüfung: users.find({}, {email:1, roles:1}) — sicherstellen, dass genau ein Nutzer die ADMIN-Rolle trägt (laut #14504-Thread bekommt nur der erste registrierte Nutzer sie). |
| | **Status:** ungelöst — nächster Schritt: Network-Tab auf :3090/login (fehlgeschlagene Anfrage + Statuscode) plus Logs von librechat-admin während eines Login-Versuchs. |
| | |
| | |
| | ===== 9. Statusübersicht ===== |
| |
| ^ Komponente ^ Status ^ Hinweis ^ | ^ Komponente ^ Status ^ Hinweis ^ |
| ^ Logo (groß + zentriert) ^ ✅ Im Browser verifiziert ^ custom.css-Mount, 140px ^ | | --- | --- | --- | |
| ^ Auth (Registrierung + Login) ^ ✅ Funktioniert ^ JWT_REFRESH_SECRET-Fix angewendet ^ | ^ Logo (groß + zentriert) ^ ✅ im Browser verifiziert ^ custom.css, 140px ^ |
| ^ LM-Studio-Chat ^ ✅ "Hello!"-Antwort bestätigt ^ Qwen3 27B geladen ^ | ^ Auth: Registrierung + Login ^ ✅ funktioniert ^ JWT_REFRESH_SECRET-Fix ^ |
| | ^ LM-Studio-Chat ^ ✅ "Hello!"-Antwort bestätigt ^ Qwen3 27B via fetch:true ^ |
| | | --- | --- | --- | |
| ^ ComfyUI MCP-Server ^ ✅ "running on stdio" in Logs ^ comfyui-mcp-Paket ^ | ^ ComfyUI MCP-Server ^ ✅ "running on stdio" in Logs ^ comfyui-mcp-Paket ^ |
| ^ Admin-Zugang ^ ✅ Erster registrierter Nutzer ist Admin [1] ^ Rollen-Dropdown = Sichtfilter, keine Kontorolle ^ | ^ Admin-Konto ^ ✅ info@root3.de (erster Nutzer = ADMIN) ^ Panel hat eigene URL :3090 ^ |
| ^ Autostart (LLM zuerst) ^ ✅ Nobara Login-Skript eingerichtet ^ /var/log/librechat-boot.log ^ | ^ Admin-Panel-Service ^ ✅ läuft, erreichbar unter :3090 ^ Login noch offen (8i) ^ |
| ^ Datenbeständigkeit ^ ✅ Named Volumes ^ Überleben Container-Neuanlage ^ | | --- | --- | --- | |
| ^ Podman-Desktop-Gruppierung ^ ✅ pod_librechat, 2 Container ^ --in-pod true ^ | ^ Autostart (LLM zuerst) ^ ✅ Nobara Login-Skript ^ /var/log/librechat-boot.log ^ |
| | ^ Datenbeständigkeit ^ ✅ Named Volumes ^ Überleben Neuanlage/Updates ^ |
| **Noch nicht getestet:** ComfyUI-Bildgenerierung End-to-End aus LibreChat heraus (den Chat bitten, ein Bild zu generieren). | ^ Podman-Desktop-Gruppierung ^ ✅ pod_librechat, 3 Container ^ --in-pod true ^ |
| | | --- | --- | --- | |
| | ^ ComfyUI-Bildgenerierung End-to-End ^ ⏳ noch nicht getestet ^ letzter offener Funktionstest ^ |
| |
| ====== | ====== |