Deployment recipes for the FoxMemory stack.
If you’re new to infra: this repo is the "how to run it" layer. It does not contain core API code; it contains Docker Compose topologies and runbooks.
- Start FoxMemory services with sane defaults
- Choose a topology based on your environment
- Provide smoke tests and operations runbooks
compose.one.yml— one-node stack (infer+store)compose.split.yml— split deployment across environmentscompose.external.yml— onlystore; inference from an external OpenAI-compatible provider
Use this path when you already have an OpenAI-compatible provider and want a quick smoke pass.
cp .env.example .env
# set OPENAI_BASE_URL and OPENAI_API_KEY in .env
bash scripts/smoke-memory.shExpected success line:
smoke-memory: PASScp .env.example .env
docker compose -f compose.one.yml up -dHealth checks:
curl -s http://localhost:8081/health
curl -s http://localhost:8082/healthStop:
docker compose -f compose.one.yml down -vbash scripts/smoke-one.shcp .env.example .env
# set OPENAI_BASE_URL and OPENAI_API_KEY for your provider
bash scripts/validate-env.sh
bash scripts/smoke-external.shThe .env file configures image tags, model names, and provider keys.
| Variable | Purpose | Consumed by | Example |
|---|---|---|---|
FOXMEMORY_INFER_IMAGE |
Infer container image tag | Docker Compose (infer) |
docker.io/foxlightfoundation/foxmemory-infer:latest |
FOXMEMORY_STORE_IMAGE |
Store container image tag | Docker Compose (store) |
docker.io/foxlightfoundation/foxmemory-store:latest |
OLLAMA_BASE_URL |
Local model runtime URL for infer | infer service |
http://host.docker.internal:11434 |
OLLAMA_EMBED_MODEL |
Embedding model name for infer | infer service |
nomic-embed-text |
OLLAMA_CHAT_MODEL |
Chat model name for infer | infer service |
llama3.1:8b |
INFER_API_KEY |
API key accepted by infer and forwarded to store in one-node compose | infer service; one-node store auth wiring |
change-me |
OPENAI_BASE_URL |
OpenAI-compatible base URL for store calls | store service |
http://infer:8081/v1 |
OPENAI_API_KEY |
Provider API key used by store | store service |
change-me |
MEM0_LLM_MODEL |
LLM model used for memory reasoning | store service |
gpt-4.1-nano |
MEM0_EMBED_MODEL |
Embedding model used by store | store service |
text-embedding-3-small |
QDRANT_URL |
Canonical Qdrant endpoint URL | store runtime (where supported) | http://qdrant:6333 |
QDRANT_API_KEY |
Qdrant auth key (optional) | store runtime | `` |
QDRANT_COLLECTION |
Collection name for memory vectors | store service |
foxmemory |
Backward-compatible variables still present in some scripts/builds:
QDRANT_HOSTQDRANT_PORT
Common cause: store container is trying to reach localhost instead of the Docker service name.
Checks:
docker compose -f compose.external.yml ps
curl -s http://localhost:6333/healthFix:
- In compose/runtime env, set
QDRANT_HOST=qdrantandQDRANT_PORT=6333for container-to-container calls. - Keep
localhost:6333only for host-side diagnostics.
Common cause: OPENAI_BASE_URL points to a service that does not exist in the chosen topology.
Checks:
grep -n "OPENAI_BASE_URL" .envExpected:
compose.one.yml:OPENAI_BASE_URL=http://infer:8081/v1compose.external.yml:OPENAI_BASE_URLmust point to your external provider (for examplehttps://api.openai.com/v1)
bash scripts/validate-env.sh
bash scripts/smoke-memory.shExpected final line:
smoke-memory: PASSdocs/RUNBOOK.md— step-by-step operations guide
MIT (see LICENSE in service repos)
If foxmemory-store (or an upstream dependency) responds with HTTP 429 Too Many Requests, clients should treat Retry-After as authoritative wait time before retrying. This keeps autonomous loops from amplifying overload during partial outages.