Bound shared MCP container lifecycle
This commit is contained in:
@@ -56,8 +56,10 @@ Only the variables below are part of the public configuration surface. Other
|
||||
| Variable | Default | Purpose |
|
||||
|---|---|---|
|
||||
| `CONTEXT_KIT_DATA_DIR` | `$HOME/.local/share/context-kit` | Persistent docs indexes and model cache |
|
||||
| `CONTEXT_KIT_COMPOSE_PROJECT` | `context-kit` | Docker Compose project and network prefix |
|
||||
| `CONTEXT_KIT_COMPOSE_PROJECT` | `context-kit` | Shared-service ownership boundary and Compose name prefix |
|
||||
| `CONTEXT_KIT_SEARXNG_PORT` | `8099` | Localhost SearXNG port |
|
||||
| `CONTEXT_KIT_WEB_SEARCH_PORT` | `8777` | Localhost port for the long-lived web-search HTTP service |
|
||||
| `CONTEXT_KIT_WEB_SEARCH_HTTP_URL` | `http://127.0.0.1:${CONTEXT_KIT_WEB_SEARCH_PORT}/mcp` | URL emitted into HTTP MCP install snippets |
|
||||
| `CONTEXT_KIT_WEB_SEARCH_MAX_BYTES` | `52428800` | Max bytes `context-web-search` accepts and downloads per fetch |
|
||||
| `CONTEXT_KIT_WEB_SEARCH_PROVIDER` | `searxng` | Default `search_web` provider; fallback order depends on this provider |
|
||||
| `CONTEXT_KIT_WEB_SEARCH_HTTP_TIMEOUT` | `15000` | HTTP timeout in milliseconds for search providers |
|
||||
@@ -76,26 +78,63 @@ Only the variables below are part of the public configuration surface. Other
|
||||
| `CONTEXT_KIT_DOCS_LOCAL_SOURCES_DIR` | `${CONTEXT_KIT_DATA_DIR}/local-sources` | Machine-local llms.txt tree mounted read-only into docs-mcp |
|
||||
| `CONTEXT_KIT_DOCS_LOCAL_SOURCES_PORT` | `8769` | Loopback port inside docs-mcp for serving local source files |
|
||||
|
||||
## Docker Ownership
|
||||
|
||||
One Compose project owns the shared `searxng`, `web-search-mcp`, and `docs-mcp`
|
||||
services. Compose derives stable container and network names from
|
||||
`CONTEXT_KIT_COMPOSE_PROJECT`; the default network is `context-kit_default`.
|
||||
Compose's existing labels remain the ownership markers for SearXNG, docs, the
|
||||
network, and `searxng-cache`. Their definitions are unchanged from
|
||||
`origin/main`, avoiding a resource-recreation prompt. The new web-search service
|
||||
also records `dev.context-kit.uid`.
|
||||
|
||||
`start`, `stop`, and `restart` use one canonical
|
||||
`/tmp/context-kit-PROJECT.lock` directory, which must be a non-symlink directory
|
||||
owned by the current uid with mode `0700`. Existing docs and web-search
|
||||
containers must have the same uid; cross-user lifecycle control is rejected.
|
||||
|
||||
`start` passes `--no-recreate` to Compose. On failure it removes only service
|
||||
containers that did not exist before the attempt, restores prior running/stopped
|
||||
states by exact container ID, and leaves the deterministic network and cache
|
||||
volume intact for reuse. `restart` operates on the same container IDs and uses
|
||||
the same state restoration. Neither command replaces an existing container.
|
||||
`stop` stops containers without removing them or their network.
|
||||
|
||||
The stdio bridge commands and Repomix create uniquely named client containers
|
||||
with `dev.context-kit.lifecycle=client` and an invocation-specific owner label.
|
||||
Their cleanup verifies that owner label before removing the exact container ID.
|
||||
|
||||
Web search runs stateless MCP sessions. Its front end accepts only loopback Host
|
||||
values or the internal `web-search-mcp:8000` service name and returns 403 for any
|
||||
request carrying Origin. It probes initialize and tools/list periodically; a
|
||||
dead stdio backend terminates the container so Docker can restart it.
|
||||
|
||||
`restart` restarts existing container IDs, so it reloads bind-mounted docs source
|
||||
files but does not apply rebuilt images or changed container environment. There
|
||||
is intentionally no automatic replacement path while the old container cannot
|
||||
be restored transactionally.
|
||||
|
||||
## TTL Guidance
|
||||
|
||||
`24h` is the default. Most reference docs do not need re-embedding more often,
|
||||
and the shared service does not re-fetch sources until the TTL elapses.
|
||||
|
||||
Use shorter TTLs for fast-moving APIs:
|
||||
Set a shorter TTL in `.env` for fast-moving APIs:
|
||||
|
||||
```sh
|
||||
CONTEXT_KIT_DOCS_TTL=6h bin/context-kit restart
|
||||
```dotenv
|
||||
CONTEXT_KIT_DOCS_TTL=6h
|
||||
```
|
||||
|
||||
Use longer TTLs for stable specs:
|
||||
Set a longer TTL for stable specs:
|
||||
|
||||
```sh
|
||||
CONTEXT_KIT_DOCS_TTL=30d bin/context-kit restart
|
||||
```dotenv
|
||||
CONTEXT_KIT_DOCS_TTL=30d
|
||||
```
|
||||
|
||||
The docs-mcp container reads `CONTEXT_KIT_DOCS_TTL` at startup, so changes
|
||||
require `bin/context-kit restart`. When freshness matters for one task, prefer
|
||||
calling the `docs_refresh` MCP tool instead of lowering the global TTL.
|
||||
The docs-mcp container environment is fixed when Compose creates it. A safe
|
||||
same-ID `restart` does not apply a changed TTL; it takes effect only when a new
|
||||
container is explicitly provisioned. When freshness matters for one task,
|
||||
prefer `docs_refresh` instead of replacing the shared container.
|
||||
|
||||
## Browser CORS
|
||||
|
||||
@@ -103,12 +142,13 @@ calling the `docs_refresh` MCP tool instead of lowering the global TTL.
|
||||
HTTP clients do not need CORS. If a browser-based local client must call the MCP
|
||||
endpoint directly, allow only the exact local origin(s) it uses:
|
||||
|
||||
```sh
|
||||
CONTEXT_KIT_DOCS_ALLOW_ORIGIN="http://127.0.0.1:3000 http://localhost:3000" \
|
||||
bin/context-kit restart
|
||||
```dotenv
|
||||
CONTEXT_KIT_DOCS_ALLOW_ORIGIN="http://127.0.0.1:3000 http://localhost:3000"
|
||||
```
|
||||
|
||||
Avoid `*`; the docs MCP is a local unauthenticated endpoint.
|
||||
Avoid `*`; the docs MCP is a local unauthenticated endpoint. Like other
|
||||
container-environment changes, this takes effect only on explicit provisioning
|
||||
of a new docs container, not a same-ID `restart`.
|
||||
|
||||
## Source Profiles
|
||||
|
||||
|
||||
Reference in New Issue
Block a user