build(compose): put the vector stores behind a profile and add healthchecks - #595
Merged
williedoran-neo4j merged 3 commits intoAug 12, 2026
Conversation
This was referenced Aug 11, 2026
williedoran-neo4j
marked this pull request as ready for review
August 11, 2026 10:55
williedoran-neo4j
force-pushed
the
willie/examples-compose-profiles
branch
from
August 12, 2026 07:05
eb730c2 to
014433e
Compare
…checks The e2e stack starts Neo4j, Weaviate, its vectorizer and Qdrant unconditionally, so anyone who only wants Neo4j - which is most of the examples and much of local development - pays for four containers and a model download. Move the vector stores behind a `vectordb` profile, so the default is Neo4j with APOC and `--profile vectordb` adds the rest. Add healthchecks so `up --wait` blocks until the services actually answer, rather than merely start; CI currently polls readiness by hand for want of them. Also adds Pinecone Local, an in-memory emulator that ignores API keys, so the Pinecone examples no longer need a hosted account. It ships no shell and no binary a healthcheck could run, which the file header notes. Callers that need the stores now pass --profile vectordb: the README, the docs and the Qdrant and Weaviate example READMEs are updated to match. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`docker compose down` only removes services in the active profiles, so running it without one after starting `--profile vectordb` leaves four containers up and fails to remove the network with "Resource is still in use". `--profile '*'` matches every profile, so it tears down whatever you started. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
williedoran-neo4j
force-pushed
the
willie/examples-compose-profiles
branch
from
August 12, 2026 07:21
014433e to
99c791f
Compare
AmirLayegh
approved these changes
Aug 12, 2026
AmirLayegh
left a comment
Contributor
There was a problem hiding this comment.
Nice work!
Left a couple of nits below but nothing blocking.
AmirLayegh
reviewed
Aug 12, 2026
AmirLayegh
reviewed
Aug 12, 2026
Address review feedback on neo4j#595. The neo4j healthcheck was probing the HTTP console (7474), but the e2e suite talks to Neo4j over bolt (7687). Switch to cypher-shell, which ships in the image and defaults to bolt, so the check validates what actually matters. Verified live: passes with the real credentials (returns a row), fails with a wrong password. The qdrant healthcheck was a bare TCP-connect probe. Checked the real qdrant/qdrant image directly rather than assuming: it has no wget, curl, nc or python3 (qdrant/qdrant#3491 tracks this upstream), so a literal wget-based check - the obvious fix - would fail every time. It also turns out CMD-SHELL runs via /bin/sh, which is dash in this image and can't do /dev/tcp redirection at all, unlike the bash it's wrapped in today. So the check now sends a real HTTP GET for /healthz over /dev/tcp inside an explicit bash -c. Verified live with a real docker compose up --wait against the image, and with a negative control (pointed the probe at a dead port) that correctly reports unhealthy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First of the PRs replacing #591, which was too large to review as one change.
tests/e2e/docker-compose.ymlstarts Neo4j, Weaviate, its vectorizer and Qdrant unconditionally. Anyone who only wants Neo4j — which is most of the examples, and much of local development — pays for four containers and a model download.What changed
vectordbprofile. The default is Neo4j with APOC;--profile vectordbadds the rest.up --waitblocks until the services actually answer rather than merely start. CI currently polls readiness by hand for want of them.The one service without a healthcheck is
pinecone-local: its image ships no shell and no binary a healthcheck could run. I verified that by probing the image rather than assuming it, and the file header says so.The
t2v-transformershealthcheck usespython3because that image has neitherwgetnorcurl— also verified by running it; its ready endpoint answers 204, whichurlopentreats as success.Callers updated
No workflow references this file — only docs do — so the blast radius is documentation:
README.mdanddocs/source/index.rst(the e2e instructions now pass--profile vectordb)Teardown needs
--profile '*'.docker compose downonly removes services in the active profiles, so running it bare after starting--profile vectordbleaves four containers up and fails to remove the network with "Resource is still in use".--profile '*'matches every profile and tears down whatever you started. The docs say so.Verification
Run against the real thing, not just
config-validated:up -d --waiton the default profile: neo4j alone, healthy, exit 0.up -d --wait --profile vectordb: all five healthy in ~11s, exit 0.pinecone-localreports no(healthy)marker, as expected for a container with no healthcheck./v1/.well-known/ready200, Qdrant 200, Pinecone Local 200.--profile '*' downleaves zero containers and removes the network.The Neo4j healthcheck was the one real risk — it was written against
neo4j:5-enterpriseand is applied here to this file's incumbentneo4j:enterprise. Confirmedwgetis present and the check passes on that image.Type of Change
Complexity
Complexity: Low
How Has This Been Tested?
Checklist
🤖 Generated with Claude Code