# Unified Tabby-Tavern Stack Report Verified after consolidation on the WSL Docker host. ## Result All active services now use one Compose project and one Docker network: ```text Compose project: tabby-tavern Compose file: /home/jpanasuk/tabby-tavern/docker-compose.yml Network: tabby-tavern_ai-network ``` The old Taproot and qwen38-agent containers were stopped. The stale stopped containers named `tabby-tavern-tabbyapi-1` and `tabby-tavern-ollama-1` were removed after the new unified compose was validated. No volumes were removed. The merge includes: - Taproot/Qwen llama.cpp runtime - Tabby-Tavern chat services - Coding starter pack services - dockroot MCP Docker-observability image, available behind the optional `diagnostics` profile - Existing named data volumes preserved where available ## Live node graph ```mermaid flowchart TB User[Browser / client] Net[(tabby-tavern_ai-network)] Qwen[qwen\nllama.cpp CUDA\nQwen3.5-9B GGUF\n8080 internal] Web[open-webui\n8080 internal] Tavern[sillytavern\n8000] Search[searxng\n8080] MCPO[mcpo\n8000] Code[code-server\n8080] Lobe[lobe-chat\n3210] Anything[anythingllm\n3001] Libre[librechat\n3080] Mongo[mongo\n27017] Qdrant[qdrant\n6333/6334] Chroma[chroma\n8000] N8N[n8n\n5678] Meili[meilisearch\n7700] PG[postgres + pgvector\n5432] Dock[dockroot MCP\noptional diagnostics profile] User -->|3000| Web User -->|8000| Tavern User -->|8001| MCPO User -->|8443| Code User -->|3080| Libre User -->|3210| Lobe User -->|3002| Anything User -->|5678| N8N User -->|6333| Qdrant User -->|8005| Chroma User -->|7700| Meili User -->|1234| Qwen Web -->|http://qwen:8080/v1| Qwen Lobe -->|http://qwen:8080/v1| Qwen Libre -->|http://qwen:8080/v1| Qwen Code -->|http://qwen:8080/v1| Qwen Web -->|http://searxng:8080/search?q=...| Search Libre --> Mongo Dock -.->|read-only Docker socket| Net Net --- Qwen Net --- Web Net --- Tavern Net --- Search Net --- MCPO Net --- Code Net --- Lobe Net --- Anything Net --- Libre Net --- Mongo Net --- Qdrant Net --- Chroma Net --- N8N Net --- Meili Net --- PG ``` ## Host URLs ```text Primary chat UI http://localhost:3000 Qwen OpenAI API http://localhost:1234/v1 Qwen health http://localhost:1234/health SillyTavern http://localhost:8000 MCPO docs http://localhost:8001/docs SearXNG http://localhost:8080 Code-server http://localhost:8443 LibreChat http://localhost:3080 Lobe Chat http://localhost:3210 AnythingLLM http://localhost:3002 n8n http://localhost:5678 Qdrant REST http://localhost:6333 Qdrant gRPC localhost:6334 Chroma http://localhost:8005 Meilisearch http://localhost:7700 Postgres localhost:5432 ``` `localhost` means the WSL host. From another container on the shared Docker network, use the service name and internal port, not localhost. ## Internal Docker URLs ```text open-webui -> http://qwen:8080/v1 lobe-chat -> http://qwen:8080/v1 librechat -> http://qwen:8080/v1 code-server -> http://qwen:8080/v1 open-webui -> http://searxng:8080/search?q= librechat -> mongodb://mongo:27017/LibreChat ``` The universal OpenAI-compatible form is: ```text http://qwen:8080/v1 ``` The served model alias is: ```text Qwen3.5-9B ``` ## Node inventory | Node | Container | Image | Host port | Function | State at verification | |---|---|---|---:|---|---| | qwen | tabby-tavern-qwen | ghcr.io/ggml-org/llama.cpp:server-cuda | 1234 | Qwen3.5-9B GGUF inference | healthy | | open-webui | tabby-tavern-open-webui | ghcr.io/open-webui/open-webui:main | 3000 | canonical chat UI | starting/HTTP still initializing during first check | | sillytavern | tabby-tavern-sillytavern | ghcr.io/sillytavern/sillytavern:latest | 8000 | character chat frontend | running; root returned 401, expected auth behavior | | searxng | tabby-tavern-searxng | docker.io/searxng/searxng:latest | 8080 | private search | running; search returned HTTP 200 | | mcpo | tabby-tavern-mcpo | ghcr.io/open-webui/mcpo:main | 8001 | MCP-to-HTTP gateway | running; `/docs` HTTP 200 | | code-server | tabby-tavern-code-server | codercom/code-server:latest | 8443 | browser VS Code IDE | running; HTTP 200 | | qdrant | tabby-tavern-qdrant | qdrant/qdrant:latest | 6333, 6334 | vector database / RAG | running; `/healthz` HTTP 200 | | chroma | tabby-tavern-chroma | chromadb/chroma:latest | 8005 | lightweight vector database | running; old heartbeat path returned 410, not a process failure | | n8n | tabby-tavern-n8n | n8nio/n8n:latest | 5678 | workflow automation | running; root endpoint reset during startup/auth handling | | lobe-chat | tabby-tavern-lobe-chat | lobehub/lobe-chat:latest | 3210 | chat frontend | running | | anythingllm | tabby-tavern-anythingllm | mintplexlabs/anythingllm:latest | 3002 | RAG workspace | running; health was still starting at first check | | librechat | tabby-tavern-librechat | ghcr.io/danny-avila/librechat:latest | 3080 | multi-model chat frontend | running | | mongo | tabby-tavern-mongo | mongo:7 | 27017 | LibreChat database | running | | meilisearch | tabby-tavern-meilisearch | getmeili/meilisearch:latest | 7700 | full-text search | running; `/health` HTTP 200 | | postgres | tabby-tavern-postgres | pgvector/pgvector:pg16 | 5432 | Postgres + pgvector, intended Hermes memory backend | healthy | | dockroot | tabby-tavern-dockroot | local/dockroot-mcp:unified | none | read-only Docker/MCP observability | optional; `diagnostics` profile | ## Inference profiles The default stack runs Qwen only. This is intentional because the RTX 4070 has limited VRAM and multiple GPU engines can block or exhaust memory. Start alternate engines only when Qwen is stopped or when you deliberately want to test contention: ```bash cd /home/jpanasuk/tabby-tavern docker compose --profile alternate-inference up -d tabbyapi ollama ``` Alternate internal APIs: ```text tabbyapi -> http://tabbyapi:5000/v1 ollama -> http://ollama:11434/v1 ``` Host APIs: ```text TabbyAPI -> http://localhost:5000/v1 Ollama -> http://localhost:11435/v1 ``` The alternate profile is not started by default. It prevents the known multi-engine GPU contention problem. ## dockroot integration Dockroot source remains at: ```text /home/jpanasuk/dockroot ``` It was incorporated into the unified compose as a buildable optional service: ```yaml dockroot: profiles: [diagnostics] build: context: ../dockroot image: local/dockroot-mcp:unified container_name: tabby-tavern-dockroot volumes: - /var/run/docker.sock:/var/run/docker.sock:ro ``` Start it with: ```bash cd /home/jpanasuk/tabby-tavern docker compose --profile diagnostics up -d --build dockroot ``` It exposes read-only MCP/Docker inspection functionality and is not bound to a host port. The Docker socket is powerful, so keep this service internal. ## Data preservation The unified compose references the existing named volumes: ```text tabby-tavern_open-webui basecamp_code-server-data basecamp_qdrant-data basecamp_chroma-data basecamp_n8n-data basecamp_lobe-chat-data basecamp_anythingllm-data basecamp_librechat-data basecamp_mongo-data basecamp_meilisearch-data basecamp_postgres_data ``` The existing source/config backup is under: ```text /home/jpanasuk/tabby-tavern/backups/20260825-023038 ``` The original Taproot and qwen38-agent compose files were not deleted. They remain at: ```text /home/jpanasuk/taproot/docker-compose.yml /home/jpanasuk/qwen38-agent/docker-compose.yml ``` ## Canonical files ```text /home/jpanasuk/tabby-tavern/docker-compose.yml /home/jpanasuk/tabby-tavern/ide-config/continue-config.json /home/jpanasuk/tabby-tavern/mcpo/config.json /home/jpanasuk/tabby-tavern/chat-templates/chat_template.jinja /home/jpanasuk/tabby-tavern/tabby_config/config.yml /home/jpanasuk/tabby-tavern/tabby_config/api_tokens.yml /home/jpanasuk/tabby-tavern/searxng_config/settings.yml ``` ## Verification commands and results ```bash docker compose -f /home/jpanasuk/tabby-tavern/docker-compose.yml config --quiet # passed docker compose -f /home/jpanasuk/tabby-tavern/docker-compose.yml ps # 15 default services created/running; qwen and postgres healthy docker network inspect tabby-tavern_ai-network # all 15 default services attached to one network curl http://localhost:1234/health # HTTP 200 curl http://localhost:1234/v1/models # HTTP 200 curl http://localhost:8080/search?q=test\&format=json # HTTP 200 curl http://localhost:8001/docs # HTTP 200 curl http://localhost:8443 # HTTP 200 curl http://localhost:6333/healthz # HTTP 200 curl http://localhost:7700/health # HTTP 200 ``` Open WebUI and AnythingLLM were still reporting startup/health initialization during the immediate post-recreate probe. Their containers were running; allow their normal startup time before treating them as failed. ## Bottom line The requested consolidation is now represented by one canonical stack: ```text /home/jpanasuk/tabby-tavern/docker-compose.yml ``` Project name: `tabby-tavern` Shared network: `tabby-tavern_ai-network` Primary model endpoint: `http://qwen:8080/v1` from containers, `http://localhost:1234/v1` from the host. The old Taproot and qwen38-agent runtime containers are no longer running, and the service definitions have been folded into Tabby-Tavern rather than merely attached as separate projects. Generated: 2026-08-25