User Tools

Site Tools


ai-librechat-deutsch

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ai-librechat-deutsch [2026/10/20 08:26] – created misaai-librechat-deutsch [2026/10/20 11:23] (current) – misa
Line 1: Line 1:
 ====== 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>
  
Line 25: Line 26:
 ===== 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>
Line 48: Line 49:
       - 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:
Line 62: Line 63:
     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"
  
Line 76: Line 95:
  
 **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>
Line 94: Line 112:
 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
  
  
Line 122: Line 145:
       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
Line 139: Line 162:
  
 **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 ====
Line 154: Line 177:
 # 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"] {
Line 170: Line 191:
 </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>
Line 204: Line 227:
 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..."
Line 216: Line 239:
 # --- 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
Line 228: Line 250:
 </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//
  
  
Line 240: Line 260:
  
 ^ 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
  
  
Line 257: Line 287:
 ==== 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 ^
  
 ====== ======
ai-librechat-deutsch.1792484796.txt.gz · Last modified: by misa