Skip to content

Strip to a local LLM hub: Ollama, a UI, logs and metrics - #18

Merged
funsaized merged 2 commits into
mainfrom
teardown-local-llm-hub
Aug 14, 2026
Merged

Strip to a local LLM hub: Ollama, a UI, logs and metrics#18
funsaized merged 2 commits into
mainfrom
teardown-local-llm-hub

Conversation

@funsaized

Copy link
Copy Markdown
Owner

Tears down the research-corpus RAG stack and rebuilds the box around what it's actually for: running local models.

140 files changed, 764 insertions, 74,019 deletions.

What runs now

8 containers, all on 127.0.0.1:

hub-ollama model server, 1× NVIDIA GPU · :11435
hub-open-webui chat UI, Ollama only, auth off · :8080
hub-dozzle logs, read-only docker socket · :9999
hub-prometheus / hub-grafana metrics · :9090 / :3000
hub-gpu-exporter / hub-node-exporter / hub-blackbox-exporter GPU, host, liveness

Deleted, as instructed

679 crawled documents, 54 reports, 68,072 vectors, the 71k-row lexical index, SQLite backups, and the Redis/Crawl4AI/Uptime-Kuma/Postgres volumes. Only hub_ollama_data (~28 GB of models) was kept. Source is recoverable from git history; the data is not.

Measured, not assumed

Model Size Throughput VRAM
qwen3.5:9b 6.6 GB 103.2 tok/s ~8.5 GB, fits
qwen3.6:27b 17 GB 2.8 tok/s pegged at 12.07 GB, spills to CPU

A 37× gap on a 12 GB RTX 3080 Ti. Nothing warns you at request time — it just gets slow. The dashboard leads with VRAM used vs total for exactly this reason.

Three things that broke, now documented

  1. name: hub is load-bearing. Dropping it renamed every volume to hub-stack_*; the stack came up healthy with {"models":[]} while the real volume sat untouched. Caught by end-to-end inference, not by health checks.
  2. GPU exporter can't take /dev/nvidia* mappings under WSL2 — those devices don't exist. The nvidia driver reservation with capabilities: [gpu, utility] is what works.
  3. It also panics on --query-field-names=AUTO against driver 610.88, which exposes a field that isn't a valid Prometheus metric name. Fields are now pinned.

Tried and abandoned

cAdvisor. Under Docker Desktop it returns one root-cgroup series with --docker_only, and zero series without it (tested privileged, with /var/lib/docker and /dev/disk mounted). Removed rather than shipped emitting a meaningless number; blackbox probes cover liveness and docker stats covers the rest.

Verified

Compose validates · all 5 Prometheus targets up · both liveness probes returning 1 · 6 alert rules parsing ok · Grafana serving the dashboard · inference confirmed at 101–103 tok/s after the final config.

Left alone deliberately

TODO/ is untracked hand-written healthcare LLM evaluation research notes — not in git, so deleting it would be unrecoverable. Flagged rather than removed.

🤖 Generated with Claude Code

funsaized and others added 2 commits August 13, 2026 22:39
The research-corpus RAG stack is removed at the operator's instruction, along
with all of its data. What remains is the machine's actual purpose: run local
models on the GPU, talk to them, and see what the box is doing.

Removed from Compose: research-hub, research-worker, searxng, crawl4ai,
qdrant, redis, uptime-kuma. Removed from the repository: the research-hub
application, PRDs, the research documentation set, searxng config, scripts,
bootstrap. All recoverable from git history.

Deleted irrecoverably, as instructed: 679 crawled documents, 54 reports,
68,072 vectors, the lexical index and the SQLite backups. Only the model
store (hub_ollama_data, ~28 GB) was kept.

Open WebUI no longer carries the four OPENAI_API_* variables that served the
corpus as a pseudo-model, and talks to Ollama alone. Auth is off by operator
decision for a localhost single-user box.

Metrics are rebuilt around what this machine actually does: GPU utilization,
VRAM, temperature, power and clocks from nvidia-smi; WSL2 VM CPU, memory and
disk; HTTP liveness probes for Ollama and the UI; six alerts covering the
three ways this box fails (out of VRAM, out of disk, Ollama stops answering).
A Grafana dashboard leads with VRAM used against total, because that is the
number that decides whether a model is usable.

Three findings worth recording, all measured rather than assumed:

- `name: hub` in Compose is load-bearing. Dropping it renamed every volume to
  hub-stack_* and brought the stack up healthy against an empty model store.
- The GPU exporter cannot take explicit /dev/nvidia* mappings under WSL2, and
  panics on field auto-detection against driver 610.88. Both are now pinned.
- cAdvisor returns no per-container metrics at all under Docker Desktop,
  tested with and without --docker_only. Dropped rather than shipped emitting
  one meaningless series.

Measured on the rebuilt stack: qwen3.5:9b at 103 tok/s fitting in 12 GB of
VRAM, qwen3.6:27b at 2.8 tok/s spilling to CPU. That 37x gap is the operating
constraint of the machine and is documented as such.

CI now validates the Compose file, the Prometheus config and the dashboard
JSON, since there is no application source left to lint.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…files

prometheus.yml refers to its rule file by absolute container path, so
promtool only resolves it when the mount layout matches the container's.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@funsaized
funsaized merged commit 0e67071 into main Aug 14, 2026
2 checks passed
@funsaized
funsaized deleted the teardown-local-llm-hub branch August 14, 2026 16:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant