File size: 9,547 Bytes
bcc50e3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 | # 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=<query>
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
|