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.
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
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 main2026-09-10 21:45:01 -04:00
claude
deleted branch fix-deploy-compose2026-09-10 21:45:01 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements #5.
deploy/now documents the deployment that exists instead of one that never did.What was wrong
deploy/docker-compose.ymlhad not been touched since the scaffold commit — literal<product>/<registry>/<owner>placeholders, describing a standalone stack. crop-chem-docsactually runs as the
chem-mcpservice inside Drawbar's parent compose.It also set
MCP_ALLOWED_HOSTS, which no code in this repo reads. The real knob isMCP_DISABLE_DNS_REBINDING_PROTECTION. Anyone who trusted the old file and configured anallowlist would have gotten a 421 on every request with nothing in the logs to explain it.
And
deploy/drawbar-compose-snippet.mdwas a second, differently-wrong copy: service namecrop-chem-docs,ports: 8001:8000, and the claim "No environment block needed — the image'sdefaults handle it" — false on both the rebind and Ollama counts.
What changed
deploy/docker-compose.ymlchem-mcpblock, copied fromDrawbar/drawbar-backenddeploy/drawbar-compose-snippet.mddeploy/rerank-docker.mdRERANK_URLcorrected to the compose-service formREADME.mdThe new compose file carries the why for each setting: the
:latest-vs-corpus-Watchtowertrap (Drawbar/drawbar-backend#339), the rebind-protection rationale, and — the one that would
actually bite someone — that the
OLLAMA_URLoverride is load-bearing. Drawbar's ownollamaservice is commented out, so the image defaulthttp://ollama:11434does not resolvein that stack; without the override, every
search_docscall fails to embed its query.rerank-docker.mdsaidRERANK_URL=http://10.10.1.65:8082. In production the MCP reaches thesidecar by compose service name (
http://llama-rerank:8080, baked into the image). It now alsodocuments the network-attach gotcha that makes rerank fail silently, and keeps the host-IP form
for local dev.
Verification
image,environment,expose,extra_hosts,restart,labelsall compare equal after a YAML parse of both sides.This is the check that keeps the two from drifting.
diffed against every
os.environ.getindocs_mcp/andrag/). No dead knobs.<product>/<registry>/<owner>placeholders remain indeploy/orREADME.md.One note on the issue's own acceptance grep: it said
grep MCP_ALLOWED_HOSTS deploy/shouldreturn 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