User Tools

Site Tools


ai-librechat-english

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
ai-librechat-english [2026/10/20 09:56] – [7. Command Quick Reference] misaai-librechat-english [2026/10/20 11:21] (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 (no Docker)   **Host**: 192.168.1.203 — Nobara Linux, Podman (no Docker)  
-**Deployed**: 2026-10-19   +**Deployed**: 2026-10-19 / finalized 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   
 +**Account**: info@root3.de (ADMIN — first registered user)
  
  
 ===== 1. Folder Structure ===== ===== 1. Folder Structure =====
  
-All files live in one folder under the rootai home directory. No systemd units, no .env file required separately — everything is inline in compose.yaml or in the .env file mounted into the container.+One folder, everything inside it. All secrets live ONLY in .env — compose.yaml references them as ${VARS}, never hardcoded [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 config — endpoints, MCP, interface +├── librechat.yaml          # LibreChat config — endpoints, MCP, interface 
-├── boot-librechat.sh      # Login autostart script (LLM-first ordering) +├── boot-librechat.sh       # Login autostart script (LLM-first ordering) 
-├── .env                   # Secrets + env vars (mounted to /app/.env) +├── .env                    # ALL secrets + env vars (mounted into both api and panel) 
-├── root_solutions_logo.svg  # Your logo — overwrites built-in logo.svg +├── root_solutions_logo.svg # Your logo — overwrites the built-in logo.svg 
-├── index.html             # Patched LibreChat index (links custom.css) +├── index.html              # Patched LibreChat index (links custom.css) 
-└── custom.css             # Logo size + centering override+└── custom.css              # Logo size + centering override
 </code> </code>
  
  
-===== 2. compose.yaml (Full) =====+===== 2. compose.yaml (Complete) =====
  
-Two services only: the LibreChat API and MongoDB. Code-interpreter was dropped (ghcr image returns 403 — it has been removed from the registry [1]).+Three services: LibreChat API, MongoDB, and the separate Admin Panel [1]. No secrets in this file — only one ${VAR} reference for the panel session secret, which podman-compose expands from .env at create time (verified working).
  
 <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
-      # Environment file with all secrets+      # All secrets/env — single source of truth is ./.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:
  
 **Key design decisions:** **Key design decisions:**
-  * //restart: "no"// on all services — you control startup via the boot script, no auto-restart on crash or reboot (matches your open-webui pattern) +  * //restart: "no"// everywhere — startup is owned by the boot script; no surprise auto-restarts (matches your open-webui pattern) 
-  * //host.containers.internal:host-gateway// — lets the container reach LM Studio and ComfyUI on the host machine by name instead of hardcoding a LAN IP [2] +  * //host.containers.internal:host-gateway// — containers reach LM Studio (:1234) and ComfyUI (:8188) on the host by name, no hardcoded LAN IP 
-  * Named volumes for all durable data — safe to delete/recreate containers without losing chats, uploads, or the database [3] +  * Named volumes for all durable data — deleting/recreating containers never touches chats, uploads, or the database [2] 
-  * //docker.io/library/mongo:latest// fully qualified — prevents the interactive "select an image" prompt that hangs unattended scripts +  * Fully-qualified image names (docker.io/library/mongo:latest) — prevents the interactive "select an image" prompt from hanging unattended scripts 
 +  * Admin panel is a **separate URL** (:3090), not a tab inside the app — that is LibreChat's official architecture [1]; user creation/management only exists there (or via registration, or the official create-user/delete-user CLI scripts)
  
-===== 3. .env File ===== 
  
-All secrets and auth settings go here. Mounted to //​/app/.env// inside the container. This is how LibreChat reads its config in this build (the //​@librechat/data-schemas// package expects it there, not only in process env) [4].+===== 3. .env File (Complete — ALL Secrets Here) =====
  
 <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
-# THIS IS THE ONE THAT ACTUALLY WORKS FOR SIGN-IN ON THIS IMAGE BUILD:+# ⚠️ THE one this image build actually reads for sign-in (see troubleshooting 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>
  
-**⚠️ Critical note on JWT_REFRESH_SECRET:**   +**Notes:** 
-This image build's //​@librechat/data-schemas// package (line 5989 of //​dist/index.mjs//) calls //​jwt.sign()// with //​process.env.JWT_REFRESH_SECRET//, **not** //​REFRESH_TOKEN_SECRET//. Without this line, registration works but sign-in returns a 500 "secretOrPrivateKey must have a value" error. Both lines are kept for clarity; only //​JWT_REFRESH_SECRET// is actually read by the signing code.+  * Mounted into BOTH the api and admin-panel containers (./.env:/app/.env:ro) — the api's auth code reads secrets from this file [3] 
 +  * ALLOW_REGISTRATION=true is what makes the Sign-up link appear; flip to false once your account exists to lock the door (users can still be created via the panel/CLI) 
 +  * ADMIN_PANEL_PORT / ADMIN_PANEL_URL are currently unused by any service — kept as documentation of intent
  
  
-===== 4. librechat.yaml (Full) =====+===== 4. librechat.yaml (Complete) =====
  
 <code yaml> <code yaml>
Line 122: Line 145:
       apiKey: "lm-studio"       apiKey: "lm-studio"
       models:       models:
-        fetch: true          # pulls live model list from LM Studio+        fetch: true          # live model list from LM Studio
         default: ["qwen/qwen3.8-27b"]   # your actual model ID         default: ["qwen/qwen3.8-27b"]   # your actual model ID
       titleConvo: true       titleConvo: true
Line 133: Line 156:
     args:     args:
       - "-y"       - "-y"
-      - "comfyui-mcp"        # real package on npm (verified Oct 2026)+      - "comfyui-mcp"        # real npm package (verified Oct 2026)
       - "--comfyui-url"       - "--comfyui-url"
       - "http://host.containers.internal:8188"       - "http://host.containers.internal:8188"
Line 139: Line 162:
  
 **Notes:** **Notes:**
-  * //​baseURL// is the correct field name (not "url") [5] +  * //baseURL// is the correct field name (not "url") [4] 
-  * //​fetch: true// means the model picker auto-populates from whatever is loaded in LM Studio — no need to hardcode every model ID [6] +  * //fetch: true// auto-populates the model picker from whatever LM Studio has loaded 
-  * The original "mcp-server-comfyui" package does not exist on npm; //​comfyui-mcp// is the real one, supports remote ComfyUI via --comfyui-url [7] +  * "mcp-server-comfyui" does NOT exist on npm — //comfyui-mcp// is the real package, supports remote ComfyUI via --comfyui-url [5] 
-  * First MCP call needs internet inside the container for npx to download the package — subsequent calls are cached+  * First MCP call needs internet inside the container (npx download); later calls are cached
  
  
 ===== 5. Logo Sizing (custom.css) ===== ===== 5. Logo Sizing (custom.css) =====
  
-LibreChat renders logo.svg at a fixed small size in its built-in CSS and there is no config key to change it. The fix: patch index.html to load an extra stylesheet, then override the img rule [8].+LibreChat renders logo.svg at a fixed small size with no config key to change it. Fix: patched index.html loads an extra stylesheet, which overrides the img rule [6].
  
 ==== 5a. How it was set up ==== ==== 5a. How it was set up ====
  
 <code bash> <code bash>
-# 1) Copy the real index.html out of the container (while it's running)+# 1) Copy the real index.html out of the container (while running)
 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) Inject a link tag into <head> # 2) Inject a link tag into <head>
 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) The override itself (file: ~/librechat/custom.css)
-# 3) Create the override+
 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. Tuning the size ====+==== 5b. Tuning ====
  
-Edit //​~/librechat/custom.css// on disk, change the px value, hard-refresh the browser (Ctrl+Shift+R). No container recreate needed — it's a bind mount, reads live.+Edit the px value in //​~/librechat/custom.css// → hard refresh browser (Ctrl+Shift+R). Bind mount reads live — no container recreate needed.
  
 +⚠️ **After every LibreChat image update**, re-extract index.html from the fresh container and re-apply the sed line, then down/up once (logo patch would otherwise revert on new images).
  
-===== 6. boot-librechat.sh (Autostart Script) ===== 
  
-Runs from Nobara Login Scripts (System Settings → Autostart → Login Scripts). Order matches your existing //​start-ai-new.sh// pattern: LLM first, then containers, then health-check. Idempotent — safe to fire multiple times at login.+===== 6. boot-librechat.sh (Final Version) ===== 
 + 
 +Runs via Nobara Login Scripts (System Settings → Autostart → Login Scripts). Ordering matches your existing start-ai-new.sh pattern: LLM first, then all three containers, then health check. Idempotent — safe to fire multiple times at login.
  
 <code bash> <code bash>
Line 189: Line 212:
 MODEL="qwen/qwen3.8-27b" MODEL="qwen/qwen3.8-27b"
  
-# --- 1. LM Studio server up? -----------------------------------------+# --- 1. LM Studio server up? ------------------------------------------
 if ! curl -s --connect-timeout 2 http://localhost:1234/v1/models > /dev/null; then if ! curl -s --connect-timeout 2 http://localhost:1234/v1/models > /dev/null; then
     echo "⏳ LM Studio not responding — starting server..."     echo "⏳ LM Studio not responding — starting server..."
Line 199: Line 222:
 fi fi
  
-# --- 2. Model loaded? (no-op if already in RAM) ----------------------+# --- 2. Model loaded? (no-op if already in RAM) ------------------------
 echo "⏳ Loading model into LM Studio..." echo "⏳ Loading model into LM Studio..."
 lms load "$MODEL" || echo "⚠️  lms load failed." lms load "$MODEL" || echo "⚠️  lms load failed."
 sleep 5 sleep 5
  
-# --- 3. Start LibreChat containers -----------------------------------+# --- 3. Start all LibreChat containers ---------------------------------
 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 "📦 Starting LibreChat containers..."     echo "📦 Starting LibreChat containers..."
-    podman start librechat-app librechat-db+    podman start librechat-app librechat-db librechat-admin 2>&1
 else else
     echo "⚠️  Containers not found — creating via compose first..."     echo "⚠️  Containers not found — creating via compose first..."
Line 214: Line 237:
 fi fi
  
-# --- 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 is up."         echo "✅ LibreChat API is up."
         break         break
Line 228: Line 250:
 </code> </code>
  
-**Autostart setup (one-time):** +**Autostart setup (one-time, already done):** 
-  * Nobara System Settings → Autostart → **+ Add New** → Login Script +  * Nobara System Settings → Autostart → + Add New → Login Script → //​~/librechat/boot-librechat.sh// → say Yes to make executable
-  * Select //​~/librechat/boot-librechat.sh// +
-  * Say **Yes** when asked to make it executable+
   * To disable: trash the entry, or //​rm ~/librechat/boot-librechat.sh//   * To disable: trash the entry, or //​rm ~/librechat/boot-librechat.sh//
  
-**Log file:** //​/var/log/librechat-boot.log// — check with //​tail -f /var/log/librechat-boot.log//+**Log file:** //​/var/log/librechat-boot.log// — //​tail -f /var/log/librechat-boot.log//
  
  
Line 240: Line 260:
  
 ^ Action ^ Command ^ ^ Action ^ Command ^
-^ Start stack (manual) ^ cd ~/librechat && podman start librechat-app librechat-db ^ +^ Start stack (manual) ^ podman start librechat-app librechat-db librechat-admin ^ 
-^ Stop stack ^ podman stop librechat-app librechat-db ^ +^ Stop stack ^ podman stop librechat-app librechat-db librechat-admin ^ 
-^ View logs (app) ^ podman logs --tail 100 librechat-app ^ +^ Restart containers after changing yaml/env ^ cd ~/librechat && podman-compose --in-pod true down && podman-compose --in-pod true up -d ^ 
-^ View logs (mongo) ^ podman logs --tail 50 librechat-db ^+^ Update LibreChat image (keeps all data) ^ cd ~/librechat && podman-compose --in-pod true down && podman pull ghcr.io/danny-avila/librechat:latest && podman-compose --in-pod true up -d ^ 
 +^ View app logs ^ podman logs --tail 100 librechat-app ^ 
 +^ View mongo logs ^ podman logs --tail 50 librechat-db ^ 
 +^ View panel logs ^ podman logs --tail 50 librechat-admin ^
 ^ View boot log ^ tail -f /var/log/librechat-boot.log ^ ^ View boot log ^ tail -f /var/log/librechat-boot.log ^
-^ Check pod status ^ podman pod ps ^ +^ Pod status ^ podman pod ps ^ 
-^ Update LibreChat image (keeps all data) ^ cd ~/librechat && podman-compose down && podman pull ghcr.io/danny-avila/librechat:latest && podman-compose --in-pod true up -d ^ +^ Remove stack, KEEP data ^ cd ~/librechat && podman-compose --in-pod true down ^
-^ Remove stack, keep data ^ cd ~/librechat && podman-compose down ^+
 ^ Nuke everything including data ^ above + podman volume rm librechat-db-data librechat-images librechat-uploads librechat-logs ^ ^ Nuke everything including data ^ above + podman volume rm librechat-db-data librechat-images librechat-uploads librechat-logs ^
-^ Query users in DB ^ podman exec librechat-db mongosh --quiet --eval 'db.getSiblingDB("LibreChat").users.findOne({}, {email:1, roles:1})' ^ +^ List all users + roles ^ podman exec librechat-db mongosh --quiet --eval 'db.getSiblingDB("LibreChat").users.find({}, {email:1, roles:1}).toArray()' ^ 
-^ Check LM Studio models live ^ curl -s http://localhost:1234/v1/models ^ +^ Check LM Studio live models ^ curl -s http://localhost:1234/v1/models ^
-^ up and down the container after updating ymal ^ podman-compose --in-pod true down && podman-compose --in-pod true up -d ^+
  
 +**Notes:**
 +  * "Restart after yaml/env change" = applies your config edits (this is the row you added — note correct hyphen in -in-pod)
 +  * "Update image" additionally pulls the new release; afterwards re-extract index.html for the logo patch (section 5b)
 +  * All down/rm operations never touch named volumes — data is safe
  
  
 ===== 8. Troubleshooting Log ===== ===== 8. Troubleshooting Log =====
  
-==== 8a. Sign-in returns 500 "secretOrPrivateKey must have a value" ====+==== 8a. Sign-in 500 "secretOrPrivateKey must have a value" ====
  
-**Cause:** This LibreChat image build reads //​process.env.JWT_REFRESH_SECRET//, not //​REFRESH_TOKEN_SECRET//. The variable name is specific to the //​@librechat/data-schemas// package version bundled in this image (confirmed at //​dist/index.mjs:5989//).   +**Cause:** this image build signs refresh tokens with //​process.env.JWT_REFRESH_SECRET//, not REFRESH_TOKEN_SECRET (confirmed at node_modules/@librechat/data-schemas/dist/index.mjs:5989). Registration worked because no token is issued at signup.   
-**Fix:** Add //​JWT_REFRESH_SECRET=<value>// to //​~/librechat/.env//, then recreate.+**Fix:** JWT_REFRESH_SECRET=<value> in .env + recreate. ✅ Applied.
  
-==== 8b. "Please select an image" prompt hangs the boot script ====+==== 8b. "Please select an image" prompt hangs scripts ====
  
-**Cause:** Bare image name (e.g. mongo:latest) triggers podman's interactive registry picker when no local match is found. With no TTY at login time this blocks forever.   +**Cause:** bare image names trigger podman's interactive registry picker; without a TTY it blocks forever.   
-**Fix:** Always use fully qualified names in compose.yaml — //​docker.io/library/mongo:latest//, //​ghcr.io/danny-avila/librechat:latest//.+**Fix:** fully-qualified names in compose.yaml (docker.io/library/mongo:latest, ghcr.io/danny-avila/librechat:latest). ✅ Applied.
  
-==== 8c. Code-interpreter image returns 403 Forbidden ====+==== 8c. code-interpreter image 403 Forbidden ====
  
-**Cause:** //​ghcr.io/danny-avila/code-interpreter:latest// has been removed from the registry (403 = repo no longer public/exists). The current official LibreChat compose file does not include a code-interpreter service [9].   +**Cause:** ghcr.io/danny-avila/code-interpreter:latest no longer exists in the registry; the official compose no longer ships it either [1].   
-**Fix:** Drop the service entirely — it's not needed for chat + ComfyUI MCP.+**Fix:** service dropped — not needed for chat + ComfyUI MCP. ✅ Applied.
  
 ==== 8d. Logo too small on login page ==== ==== 8d. Logo too small on login page ====
  
-**Cause:** LibreChat's built-in CSS sizes logo.svg to a fixed compact dimension. No config key exists in interface object structure [10].   +**Cause:** built-in CSS sizes logo.svg fixed; no interface config key exists for it.   
-**Fix:** Mount a patched index.html that links custom.css, then override with //​img[src*="logo.svg"] { height: 140px !important; }//.+**Fix:** patched index.html → custom.css → img[src*="logo.svg"] override, 140px + centered. ✅ Verified in browser.
  
-==== 8e. podman-compose --pod flag not recognised ====+==== 8e. podman-compose --pod not recognized ====
  
-**Cause:** Podman Desktop does not bundle podman-compose; the dnf package is v1.x (containers/podman-compose) [11], which uses a different flag name than the pipx version.   +**Cause:** the dnf package (v1.6.0) is containers/podman-compose v1.x — different flag than the pipx build.   
-**Fix:** Use //​podman-compose --in-pod true up -d// instead of //​--pod//.+**Fix:** use //​--in-pod true// before the subcommand: podman-compose --in-pod true up -d. ✅ Applied.
  
-==== 8f. "agent_id is required in request body" on first chat ====+==== 8f. "agent_id is required in request body" ====
  
-**Cause:** The conversation was created before the LM Studio endpoint was selected from the model picker, so the request routed to the agents endpoint.   +**Cause:** message sent before the LM Studio endpoint was selected in the model picker — request routed to the agents endpoint.   
-**Fix:** Start a new conversation and explicitly select LM Studio + model from the picker before sending.+**Fix:** new conversation, select model explicitly first. ✅ Resolved.
  
 +==== 8g. Admin panel image 403 on ghcr ====
  
-===== 9. What Works / What's Verified =====+**Cause:** ghcr.io/danny-avila/librechat-admin-panel:latest does not exist there; correct registry is registry.librechat.ai/librechat-ai/librechat-admin-panel:latest per the official compose [1].   
 +**Fix:** corrected image reference. ✅ Container runs, panel serves at :3090.
  
-^ Component ^ Status ^ Notes ^ +==== 8h. Logs show "OpenID check failed: 500 .../openid/check" ====
-^ Logo (big + centered) ^ ✅ Verified in browser ^ custom.css mount, 140px ^ +
-^ Auth (register + sign-in) ^ ✅ Working ^ JWT_REFRESH_SECRET fix applied ^ +
-^ LM Studio chat ^ ✅ "Hello!" response confirmed ^ Qwen3 27B loaded ^ +
-^ ComfyUI MCP server ^ ✅ "running on stdio" in logs ^ comfyui-mcp package ^ +
-^ Admin access ^ ✅ First registered user is admin [1] ^ Role dropdown = viewer scope, not account role ^ +
-^ Autostart (LLM first) ^ ✅ Nobara Login Script added ^ /var/log/librechat-boot.log ^ +
-^ Data persistence ^ ✅ Named volumes ^ Survives container recreation ^ +
-^ Podman Desktop grouping ^ ✅ pod_librechat, 2 containers ^ --in-pod true ^+
  
-**Not yet tested:** ComfyUI image generation end-to-end from inside LibreChat (ask chat to generate an image).+**Cause:** known upstream bug — LibreChat issue #14504, fixed in PR #14507. Maintainer confirms it is log noise, NOT the login blocker (panel treats any non-ok response as "SSO unavailable" and falls back to email/password).   
 +**Action:** none — ignore until an image update includes the fix.
  
-======+==== 8i. Admin panel login: form submits, nothing happens ====
  
-</parameter> +⚠️ **OPEN ITEM.** API logs show //​[Login] [Login successful] [info@root3.de]// repeated — credentials accepted, auth works; the panel never establishes a browser session. Prime suspect: session cookies flagged secure over plain HTTP (candidate fixes: SESSION_COOKIE_SECURE=false / ADMIN_PANEL_SESSION_COOKIE_SECURE=false in .env) or panel-side session wiring. Secondary check pending: users.find({}, {email:1, roles:1}) to confirm exactly one user holds the ADMIN role (per #14504 thread, only the first registered user gets it).   
-</function> +**Status:** unresolved — next debugging step is the Network tab on :3090/login (failed request + status code) plus librechat-admin logs during an attempt. 
-</tool_call>+ 
 + 
 +===== 9. Status Overview ===== 
 + 
 +^ Component ^ Status ^ Note ^ 
 +^ Logo (big + centered) ^ ✅ verified in browser ^ custom.css, 140px ^ 
 +^ Auth: register + sign-in ^ ✅ working ^ JWT_REFRESH_SECRET fix ^ 
 +^ LM Studio chat ^ ✅ "Hello!" response confirmed ^ Qwen3 27B via fetch:true ^ 
 +^ ComfyUI MCP server ^ ✅ "running on stdio" in logs ^ comfyui-mcp package ^ 
 +^ Admin account ^ ✅ info@root3.de (first user = ADMIN) ^ panel is separate URL :3090 ^ 
 +^ Admin panel service ^ ✅ running, serves :3090 ^ login still open (8i) ^ 
 +^ Autostart (LLM first) ^ ✅ Nobara Login Script ^ /var/log/librechat-boot.log ^ 
 +^ Data persistence ^ ✅ named volumes ^ survives recreation/updates ^ 
 +^ Podman Desktop grouping ^ ✅ pod_librechat, 3 containers ^ --in-pod true ^ 
 +| --- | --- | --- | 
 +^ ComfyUI image generation end-to-end ^ ⏳ not yet tested ^ last open functional test ^ 
 + 
 +======
ai-librechat-english.1792490207.txt.gz · Last modified: by misa