docs(deploy): make deploy/ describe the deployment that actually exists #8

Merged
claude merged 1 commits from fix-deploy-compose into main 2026-09-10 21:45:01 -04:00
Contributor

Implements #5. deploy/ now documents the deployment that exists instead of one that never did.

What was wrong

deploy/docker-compose.yml had not been touched since the scaffold commit — literal
<product> / <registry> / <owner> placeholders, describing a standalone stack. crop-chem-docs
actually runs as the chem-mcp service inside Drawbar's parent compose.

It also set MCP_ALLOWED_HOSTS, which no code in this repo reads. The real knob is
MCP_DISABLE_DNS_REBINDING_PROTECTION. Anyone who trusted the old file and configured an
allowlist would have gotten a 421 on every request with nothing in the logs to explain it.

And deploy/drawbar-compose-snippet.md was a second, differently-wrong copy: service name
crop-chem-docs, ports: 8001:8000, and the claim "No environment block needed — the image's
defaults handle it"
— false on both the rebind and Ollama counts.

What changed

File
deploy/docker-compose.yml replaced with the real chem-mcp block, copied from Drawbar/drawbar-backend
deploy/drawbar-compose-snippet.md deleted — the second wrong copy
deploy/rerank-docker.md RERANK_URL corrected to the compose-service form
README.md file tree updated; Watchtower poll interval 5 min → 60s

The new compose file carries the why for each setting: the :latest-vs-corpus- Watchtower
trap (Drawbar/drawbar-backend#339), the rebind-protection rationale, and — the one that would
actually bite someone — that the OLLAMA_URL override is load-bearing. Drawbar's own
ollama service is commented out, so the image default http://ollama:11434 does not resolve
in that stack; without the override, every search_docs call fails to embed its query.

rerank-docker.md said RERANK_URL=http://10.10.1.65:8082. In production the MCP reaches the
sidecar by compose service name (http://llama-rerank:8080, baked into the image). It now also
documents the network-attach gotcha that makes rerank fail silently, and keeps the host-IP form
for local dev.

Verification

  • The block is structurally identical to the parent compose — image, environment,
    expose, extra_hosts, restart, labels all compare equal after a YAML parse of both sides.
    This is the check that keeps the two from drifting.
  • All six env vars set in the block are ones the server actually reads (parsed the YAML,
    diffed against every os.environ.get in docs_mcp/ and rag/). No dead knobs.
  • No <product> / <registry> / <owner> placeholders remain in deploy/ or README.md.

One note on the issue's own acceptance grep: it said grep MCP_ALLOWED_HOSTS deploy/ should
return nothing. It doesn't — the new file names the variable once, in a comment, to tell readers
it isn't a supported knob. That seemed more useful than silence, since anyone arriving from the
old file or the upstream template will search for exactly that string. The meaningful check —
nothing sets a variable the code ignores — is the one run above.

Closes #5

🤖 Generated with Claude Code

https://claude.ai/code/session_01FFBDnRWHispovmJVK9rXc9

Implements #5. `deploy/` now documents the deployment that exists instead of one that never did. ## What was wrong `deploy/docker-compose.yml` had not been touched since the scaffold commit — literal `<product>` / `<registry>` / `<owner>` placeholders, describing a standalone stack. crop-chem-docs actually runs as the `chem-mcp` service inside Drawbar's parent compose. It also set **`MCP_ALLOWED_HOSTS`, which no code in this repo reads.** The real knob is `MCP_DISABLE_DNS_REBINDING_PROTECTION`. Anyone who trusted the old file and configured an allowlist would have gotten a 421 on every request with nothing in the logs to explain it. And `deploy/drawbar-compose-snippet.md` was a second, *differently*-wrong copy: service name `crop-chem-docs`, `ports: 8001:8000`, and the claim *"No environment block needed — the image's defaults handle it"* — false on both the rebind and Ollama counts. ## What changed | File | | |---|---| | `deploy/docker-compose.yml` | replaced with the real `chem-mcp` block, copied from `Drawbar/drawbar-backend` | | `deploy/drawbar-compose-snippet.md` | **deleted** — the second wrong copy | | `deploy/rerank-docker.md` | `RERANK_URL` corrected to the compose-service form | | `README.md` | file tree updated; Watchtower poll interval 5 min → 60s | The new compose file carries the *why* for each setting: the `:latest`-vs-`corpus-` Watchtower trap (Drawbar/drawbar-backend#339), the rebind-protection rationale, and — the one that would actually bite someone — that **the `OLLAMA_URL` override is load-bearing**. Drawbar's own `ollama` service is commented out, so the image default `http://ollama:11434` does not resolve in that stack; without the override, every `search_docs` call fails to embed its query. `rerank-docker.md` said `RERANK_URL=http://10.10.1.65:8082`. In production the MCP reaches the sidecar by compose service name (`http://llama-rerank:8080`, baked into the image). It now also documents the network-attach gotcha that makes rerank fail *silently*, and keeps the host-IP form for local dev. ## Verification - **The block is structurally identical to the parent compose** — `image`, `environment`, `expose`, `extra_hosts`, `restart`, `labels` all compare equal after a YAML parse of both sides. This is the check that keeps the two from drifting. - **All six env vars set in the block are ones the server actually reads** (parsed the YAML, diffed against every `os.environ.get` in `docs_mcp/` and `rag/`). No dead knobs. - No `<product>` / `<registry>` / `<owner>` placeholders remain in `deploy/` or `README.md`. One note on the issue's own acceptance grep: it said `grep MCP_ALLOWED_HOSTS deploy/` should return nothing. It doesn't — the new file names the variable once, in a comment, to tell readers it isn't a supported knob. That seemed more useful than silence, since anyone arriving from the old file or the upstream template will search for exactly that string. The meaningful check — nothing *sets* a variable the code ignores — is the one run above. Closes #5 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01FFBDnRWHispovmJVK9rXc9
claude added 1 commit 2026-09-10 21:44:58 -04:00
deploy/docker-compose.yml was unedited docs-mcp-template boilerplate —
untouched since the scaffold commit, still carrying <product>,
<registry> and <owner> placeholders — describing a standalone stack
that has never existed. crop-chem-docs runs as the `chem-mcp` service
inside Drawbar's parent compose.

It also set MCP_ALLOWED_HOSTS, which no code in this repo reads. The
knob is MCP_DISABLE_DNS_REBINDING_PROTECTION. Anyone who trusted the
old file and set an allowlist would have gotten a 421 on every request
with nothing in the logs to explain it.

- deploy/docker-compose.yml: replaced with the real chem-mcp block, a
  copy of what runs in Drawbar/drawbar-backend. Verified structurally
  identical to the parent (image, environment, expose, extra_hosts,
  restart, labels all equal). Carries the why for each setting: the
  :latest-vs-corpus-tag Watchtower trap (#339), the rebind-protection
  rationale, and that the OLLAMA_URL override is load-bearing because
  Drawbar's own ollama service is commented out — the image default
  http://ollama:11434 does not resolve in that stack, so without the
  override every search_docs call fails to embed its query.
- deploy/drawbar-compose-snippet.md: deleted. It was a second,
  differently-wrong copy (service name `crop-chem-docs`, ports
  8001:8000, and "No environment block needed — the image's defaults
  handle it", which is false on both the rebind and Ollama counts).
  Its still-true content (verification commands) moved into the compose
  file; the tag scheme and deploy chain were already in the README.
- deploy/rerank-docker.md: RERANK_URL said http://10.10.1.65:8082. In
  production the MCP reaches the sidecar by compose service name
  (http://llama-rerank:8080, baked into the image). Documents the
  network-attach gotcha that makes rerank fail silently, and keeps the
  host-IP form for local dev.
- README.md: file tree updated for the deleted file; Watchtower poll
  interval corrected 5 min -> 60s (WATCHTOWER_POLL_INTERVAL=60, as
  configured on trashpanda).

Verified: no <product>/<registry>/<owner> placeholders remain in
deploy/ or README, and all six env vars set in the block are ones the
server actually reads.

Closes #5

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01FFBDnRWHispovmJVK9rXc9
claude merged commit 053884f9fb into main 2026-09-10 21:45:01 -04:00
claude deleted branch fix-deploy-compose 2026-09-10 21:45:01 -04:00
Sign in to join this conversation.