All apps · 0 apps
mem0-aio
Docker app from JSONbored's Repository
Overview
Mem0 OpenMemory gives LLM apps a persistent memory layer with a web UI, MCP/API server, and pluggable vector backends.
All-In-One Unraid Editionmem0-aio packages the OpenMemory UI, API, and embedded Qdrant into one Unraid-first container so beginners can get a working first boot without wiring a separate vector database.
Quick Install (Beginners)
- Install the template and leave the default appdata path in place.
- For the fastest hosted path, set [code]OPENAI_API_KEY[/code].
- For the normal local-LLM homelab path, set [code]OLLAMA_BASE_URL[/code] to your external Ollama root URL and set the Ollama chat/embed models you actually have pulled.
- Start the container and open the Web UI. The wrapper will auto-default to Ollama when [code]OLLAMA_BASE_URL[/code] is set and no explicit provider overrides are supplied.
- Leave the direct API/MCP port unpublished unless you intentionally need external MCP/API clients behind your own access controls. If you publish it, set [code]MEM0_API_HOST=0.0.0.0[/code] and protect that endpoint yourself.
Advanced View
- Leave storage defaults in place for the bundled SQLite + Qdrant path.
- If you use external vector storage, configure exactly one backend. The wrapper rejects competing selectors such as Redis plus PGVector plus external Qdrant because OpenMemory can only initialize one vector store at a time.
- Provider overrides are available for native Ollama, OpenAI-compatible endpoints, hosted model providers, and supported external vector stores, but only set the fields your chosen path needs.
Important Notes
- This wrapper is meant to simplify first boot on Unraid, not remove the real complexity of model/provider credentials and external-service tuning.
- Actual memory generation still requires a valid LLM/embedder configuration. Leaving [code]OPENAI_API_KEY[/code] blank is fine if you are using Ollama, but you still need to provide a reachable Ollama endpoint and valid model names.
- Native Ollama uses the root API URL such as [code]http://host.docker.internal:11434[/code], not an OpenAI-compatible [code]/v1[/code] path. If your reverse proxy adds auth and only exposes an OpenAI-style [code]/v1[/code] endpoint, use the advanced OpenAI-compatible base URL fields instead of the native Ollama provider path.
- The embedded Qdrant service is intentionally bundled for the beginner AIO path; it is skipped only when one valid external vector backend is configured.
Readme
View on GitHubmem0-aio
An Unraid-first, single-container deployment of Mem0 OpenMemory for people who want the easiest reliable self-hosted install without manually wiring a separate vector database on day one.
mem0-aio keeps the critical first-boot dependency bundled: Qdrant plus persistent local storage. The wrapper is opinionated for a predictable beginner install, but it does not hide the real tradeoffs: OpenMemory still needs a valid model/provider configuration to do useful work, external vector backends and hosted model endpoints still need operator knowledge, and exposing the direct MCP/API port is a deliberate security decision rather than a default requirement.
What This Image Includes
- OpenMemory web UI on port
3000 - OpenMemory API / MCP server on internal localhost port
8765 - Embedded Qdrant vector store
- Persistent appdata storage for SQLite and Qdrant state
- Upstream backup/export helper scripts bundled into the image
- Same-origin UI routing to the API so a standard Unraid install does not need separate browser-facing API networking
- Unraid CA template at mem0-aio.xml
Beginner Install
If you want the simplest supported path:
- Install the Unraid template.
- Leave the default appdata path in place.
- Either set
OPENAI_API_KEYfor the hosted quick-start, or setOLLAMA_BASE_URLto your external native Ollama root URL for the normal local-LLM path. - If you use Ollama, also set
LLM_MODELandEMBEDDER_MODELto models you already have pulled on that server. - Start the container.
- Open the web UI on port
3000. - If you need something more custom, finish provider configuration in the UI or use the advanced environment overrides.
Leaving OPENAI_API_KEY blank is supported. The intended companion path is external Ollama, not bundled inference inside this image.
When OLLAMA_BASE_URL is set and you do not explicitly override LLM_PROVIDER or EMBEDDER_PROVIDER, the wrapper now defaults both to ollama automatically.
For normal Ollama installs, the wrapper now also auto-detects the embedding dimension it needs for Qdrant. If you use a custom embedder and auto-detection cannot determine the size, set EMBEDDER_DIMENSIONS explicitly in Advanced View.
Direct API / MCP Clients
The web UI works without publishing the direct OpenMemory API / MCP port because the UI proxies API traffic through the same published web port. Direct MCP clients, agents, or tools that connect to port 8765 need two Advanced View settings:
- Set
API / MCP Portto the host port you want to publish, usually8765. - Set
[Security] API Bind Address (MEM0_API_HOST)to0.0.0.0.
The default MEM0_API_HOST=127.0.0.1 is intentional. It keeps the direct API / MCP service reachable only inside the container for normal UI-only installs, which avoids exposing an unauthenticated memory API and model/provider configuration surface by accident.
If the container is healthy but external MCP clients cannot connect, check both the host port mapping and MEM0_API_HOST first. Leave MEM0_API_HOST on 127.0.0.1 unless you deliberately publish port 8765 behind your own LAN, firewall, VPN, or reverse-proxy controls.
Power User Surface
This repo is deliberately not a stripped-down wrapper. The template now tracks the practical OpenMemory self-hosted environment surface exposed by upstream source and docs, plus AIO defaults for the bundled SQLite + Qdrant path. In Advanced View you can:
- point OpenMemory at Ollama, Anthropic, Groq, Together, DeepSeek, Azure OpenAI, Bedrock-compatible providers, and other upstream-supported provider values
- use native Ollama root URLs for the normal homelab path, or OpenAI-compatible
/v1base URLs for auth-protected reverse proxies - override both LLM and embedder providers, models, API keys, and base URLs independently
- move vector storage to Chroma, Weaviate, Redis, pgvector, Milvus, Elasticsearch, OpenSearch, or FAISS
- use authenticated external Qdrant with
QDRANT_URLandQDRANT_API_KEY - keep using bundled Qdrant privately by default with telemetry disabled unless you explicitly re-enable it
- keep the bundled internal defaults for the easiest install while still exposing the upstream env surface for power users
External vector storage is exclusive. Configure one backend only: REDIS_URL, PG_*, external QDRANT_*, Chroma, Weaviate, Milvus, Elasticsearch, OpenSearch, or FAISS. The container rejects competing or partial vector-store selectors instead of letting OpenMemory silently pick the first matching backend.
The wrapper still defaults to the internal bundled storage path so new Unraid users are not forced into extra services on day one.
Runtime Notes
- As of
2026-04-17, upstream Mem0 has a newer stable release than the original wrapper baseline; this repo is being moved to the current stablev2.0.0line rather than staying on the olderv1.0.xline. - The direct API / MCP port is optional for normal browser use because the UI proxies to the API over the same published web port. By default, the API binds to
127.0.0.1inside the container and is not published by the Unraid template; setMEM0_API_HOST=0.0.0.0only when intentionally publishing port8765behind your own network or reverse-proxy access controls. - The embedded Qdrant service is intentionally bundled because that is the critical first-boot dependency for the AIO path. External vector store support remains optional advanced configuration.
- For authenticated external Qdrant, prefer
QDRANT_URL=http://qdrant:6333plusQDRANT_API_KEYinstead of onlyQDRANT_HOSTandQDRANT_PORT. - Do not set
QDRANT_API_KEYagainst the bundled Qdrant default. UseQDRANT_URLor an externalQDRANT_HOSTwhen Qdrant auth is enabled. - Native Ollama provider support expects the root Ollama URL such as
http://host.docker.internal:11434, not an OpenAI-compatible/v1path. - If your homelab front door adds auth and only exposes an OpenAI-style
/v1endpoint, use the OpenAI-compatible base URL fields instead of the native Ollama provider path. - Elasticsearch/OpenSearch support is now wired for real external deployments, but those stacks usually need explicit auth and SSL choices. For Elasticsearch, the advanced template exposes
ELASTICSEARCH_USE_SSLandELASTICSEARCH_VERIFY_CERTS. For OpenSearch, it exposes optional user/password plusOPENSEARCH_USE_SSLandOPENSEARCH_VERIFY_CERTS. SSL and certificate verification both default totrue; set verification tofalseonly for a trusted self-signed endpoint on a private network. - If you expose OpenMemory beyond your LAN, treat the direct MCP/API surface and your model/provider credentials as real attack surface.
Publishing and Releases
- Wrapper releases use the upstream version plus an AIO revision, such as
v2.0.0-aio.1. - Upstream monitoring, release preparation, registry publishing, and catalog sync are owned by
aio-fleetfrom.aio-fleet.yml. - Changelog generation and XML
<Changes>sync are run centrally byaio-fleetduring release preparation. mainpublisheslatest, the pinned upstream version tag, an explicit AIO packaging line tag, andsha-<commit>.- Publish jobs require Docker Hub credentials and push the CA-facing Docker Hub tags directly.
See docs/releases.md for the central release process details.
Validation
Required local validation is split between app-specific tests and aio-fleet:
git submodule update --init --recursive
python3 -m venv .venv-local
.venv-local/bin/pip install -e "../aio-fleet[app-tests]"
.venv-local/bin/pytest tests/template --junit-xml=reports/pytest-unit.xml -o junit_family=xunit1
.venv-local/bin/pytest tests/integration -m integration --junit-xml=reports/pytest-integration.xml -o junit_family=xunit1
cd ../aio-fleet
.venv/bin/python -m aio_fleet validate-repo --repo mem0-aio --repo-path ../mem0-aio
.venv/bin/python -m aio_fleet trunk run --repo mem0-aio --repo-path ../mem0-aio --no-fix
CI cost model:
- relevant PRs and
mainpushes run the fast validation layers first - Docker-backed integration tests run for build-relevant changes, for
mainrelease-metadata commits when publish is still in play, and for manual dispatches - image publish stays gated behind the integration suite instead of treating skipped integration as acceptable
- the external backend matrix is part of the same integration suite so supported vector-store overrides are tested before publish
The external-backend coverage uses the same pytest command. By default it starts a local mock Ollama container for deterministic embeddings; set OLLAMA_CONTAINER only if you intentionally want to test against an existing Ollama container:
.venv-local/bin/pytest tests/integration -m integration
Support
- Repo issues: JSONbored/mem0-aio issues
- Upstream app: mem0ai/mem0
- Official OpenMemory docs: docs.mem0.ai
Funding
If this work saves you time, support it here:
Star History
Media gallery
1 / 3Install mem0-aio on Unraid in a few clicks.
Find mem0-aio in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Requirements
Categories
Download Statistics
Related apps
Explore more like this
Explore allDetails
jsonbored/mem0-aio:latestRuntime arguments
- Web UI
http://[IP]:[PORT:3000]- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Main OpenMemory web interface port.
- Target
- 3000
- Default
- 3000
- Value
- 3000
Optional direct API and MCP host port. Leave blank for normal UI-only access. If you publish this port, also set [Security] API Bind Address (MEM0_API_HOST) to 0.0.0.0 and protect access at your network or reverse proxy.
- Target
- 8765
Persistent storage for the SQLite database, embedded Qdrant data, and AIO state.
- Target
- /mem0/storage
- Default
- /mnt/user/appdata/mem0-aio/storage
- Value
- /mnt/user/appdata/mem0-aio/storage
Optional hosted-provider quick start. Leave blank if you plan to use Ollama instead.
- Target
- OPENAI_API_KEY
Default user namespace used by the API and MCP server.
- Target
- USER
- Default
- default_user
- Value
- default_user
Native external Ollama root URL. Example: http://host.docker.internal:11434 or http://192.168.1.10:11434. When set, the wrapper auto-defaults to Ollama if no explicit provider override is supplied.
- Target
- OLLAMA_BASE_URL
Optional Ollama chat model override. Set this to a model you already have pulled on your Ollama server. Example: llama3.1:latest or mistral:7b
- Target
- LLM_MODEL
Optional Ollama embedding model override. Set this to a model you already have pulled on your Ollama server. Example: nomic-embed-text
- Target
- EMBEDDER_MODEL
Bind address for the internal API/MCP server. Keep 127.0.0.1 for UI-only access; use 0.0.0.0 only when deliberately publishing the API/MCP port behind your own LAN, VPN, firewall, or reverse-proxy controls.
- Target
- MEM0_API_HOST
- Default
- 127.0.0.1
- Value
- 127.0.0.1
Default same-origin proxy path for the web UI. Leave this alone unless you intentionally want the browser to call a different API URL directly.
- Target
- NEXT_PUBLIC_API_URL
- Default
- /openmemory-api
- Value
- /openmemory-api
Default user ID shown in the browser client. Usually keep this aligned with USER.
- Target
- NEXT_PUBLIC_USER_ID
- Default
- default_user
- Value
- default_user
Advanced provider override. Leave this on auto for the normal wrapper behavior: OpenAI when no Ollama URL is set, or Ollama when OLLAMA_BASE_URL is set.
- Target
- LLM_PROVIDER
- Default
- auto|openai|anthropic|azure_openai|ollama|together|groq|litellm|mistralai|google_ai|aws_bedrock|gemini|deepseek|xai|lmstudio|langchain
- Value
- auto
Optional provider-specific API key if you are not using OPENAI_API_KEY or if you want the LLM to use a different secret.
- Target
- LLM_API_KEY
Optional custom LLM API base URL for OpenAI-compatible or provider-specific endpoints. Use this for auth-protected OpenAI-style proxies, usually ending in /v1.
- Target
- LLM_BASE_URL
Optional host override used by upstream Docker Ollama auto-detection. Example: host.docker.internal
- Target
- OLLAMA_HOST
Advanced embedder provider override. Leave this on auto for the normal wrapper behavior so the embedder follows the matching OpenAI or Ollama path.
- Target
- EMBEDDER_PROVIDER
- Default
- auto|openai|azure_openai|ollama|huggingface|vertexai|gemini|lmstudio|together|langchain|aws_bedrock
- Value
- auto
Optional provider-specific embedder API key.
- Target
- EMBEDDER_API_KEY
Optional custom embedder API base URL. Use this for OpenAI-compatible or separate embedding endpoints, including auth-protected proxies that expose /v1.
- Target
- EMBEDDER_BASE_URL
Optional explicit embedding dimension override for vector-store setup. Usually leave blank and let the wrapper auto-detect it, but set this if your embedder is custom or auto-detection cannot determine the correct size.
- Target
- EMBEDDER_DIMENSIONS
Advanced override for the API database connection. Leave the default SQLite path for normal AIO usage.
- Target
- DATABASE_URL
- Default
- sqlite:////mem0/storage/openmemory.db
- Value
- sqlite:////mem0/storage/openmemory.db
Legacy upstream alias used by older OpenMemory examples that referenced env:API_KEY. Leave blank unless you intentionally depend on that older pattern.
- Target
- API_KEY
External Qdrant URL, for example http://qdrant:6333 or https://qdrant.example.com. Use this instead of external QDRANT_HOST when auth or HTTPS is involved. Do not combine with Redis, PGVector, or other vector backends.
- Target
- QDRANT_URL
Bundled Qdrant host by default. Leave as 127.0.0.1 for the AIO path; set to an external host only when Qdrant is the one external vector backend you want.
- Target
- QDRANT_HOST
- Default
- 127.0.0.1
- Value
- 127.0.0.1
Qdrant port for the bundled or selected external Qdrant backend.
- Target
- QDRANT_PORT
- Default
- 6333
- Value
- 6333
API key for authenticated external Qdrant. Requires QDRANT_URL or an external QDRANT_HOST; the bundled Qdrant service is not started with API-key auth.
- Target
- QDRANT_API_KEY
Controls Qdrant usage-statistics reporting for the bundled embedded vector store. Default is true so the AIO image stays privacy-first by default.
- Target
- QDRANT__TELEMETRY_DISABLED
- Default
- true|false
- Value
- true
External Chroma host. Requires CHROMA_PORT and must be the only external vector backend configured.
- Target
- CHROMA_HOST
External Chroma port. Requires CHROMA_HOST.
- Target
- CHROMA_PORT
External Weaviate cluster URL. Use this or WEAVIATE_HOST/WEAVIATE_PORT, and do not combine with another vector backend.
- Target
- WEAVIATE_CLUSTER_URL
External Weaviate host. Requires WEAVIATE_PORT unless WEAVIATE_CLUSTER_URL is set.
- Target
- WEAVIATE_HOST
External Weaviate port. Requires WEAVIATE_HOST unless WEAVIATE_CLUSTER_URL is set.
- Target
- WEAVIATE_PORT
Redis-backed vector-store URL. Example: redis://:password@host:6379/0. This selects Redis as the vector backend; do not combine with PGVector or Qdrant.
- Target
- REDIS_URL
External PostgreSQL/pgvector host. Requires PG_PORT and must be the only external vector backend configured.
- Target
- PG_HOST
External PostgreSQL/pgvector port. Required when any PG_* vector-store setting is used.
- Target
- PG_PORT
External PostgreSQL database name for pgvector. Defaults to mem0 when PGVector is selected and this is blank.
- Target
- PG_DB
External PostgreSQL username for pgvector. Defaults to mem0 when PGVector is selected and this is blank.
- Target
- PG_USER
External PostgreSQL password for pgvector. Defaults to mem0 when PGVector is selected and this is blank.
- Target
- PG_PASSWORD
Optional external Milvus host.
- Target
- MILVUS_HOST
Optional external Milvus port.
- Target
- MILVUS_PORT
Optional Milvus token for authenticated deployments.
- Target
- MILVUS_TOKEN
Optional Milvus database name.
- Target
- MILVUS_DB_NAME
Optional external Elasticsearch host.
- Target
- ELASTICSEARCH_HOST
Optional external Elasticsearch port.
- Target
- ELASTICSEARCH_PORT
Optional Elasticsearch username.
- Target
- ELASTICSEARCH_USER
Optional Elasticsearch password.
- Target
- ELASTICSEARCH_PASSWORD
Whether the Elasticsearch HTTP endpoint uses HTTPS. Default is true because modern Elasticsearch containers usually expose HTTPS.
- Target
- ELASTICSEARCH_USE_SSL
- Default
- true|false
- Value
- true
Whether to verify Elasticsearch TLS certificates. Keep true for external HTTPS backends; set false only for a trusted self-signed endpoint on a private network.
- Target
- ELASTICSEARCH_VERIFY_CERTS
- Default
- true|false
- Value
- true
Optional external OpenSearch host.
- Target
- OPENSEARCH_HOST
Optional external OpenSearch port.
- Target
- OPENSEARCH_PORT
Optional OpenSearch username.
- Target
- OPENSEARCH_USER
Optional OpenSearch password.
- Target
- OPENSEARCH_PASSWORD
Whether the OpenSearch HTTP endpoint uses HTTPS. Default is true because modern OpenSearch containers usually expose HTTPS.
- Target
- OPENSEARCH_USE_SSL
- Default
- true|false
- Value
- true
Whether to verify OpenSearch TLS certificates. Keep true for external HTTPS backends; set false only for a trusted self-signed endpoint on a private network.
- Target
- OPENSEARCH_VERIFY_CERTS
- Default
- true|false
- Value
- true
Optional FAISS storage path inside the container or a mounted host path.
- Target
- FAISS_PATH
Optional one-shot filter for the bundled upstream export helper script. Only set this if you intentionally run the export tooling inside the container.
- Target
- EXPORT_USER_ID
Optional one-shot filter for the bundled upstream export helper script.
- Target
- EXPORT_APP_ID
Optional one-shot export filter. Epoch timestamp in seconds.
- Target
- EXPORT_FROM_DATE
Optional one-shot export filter. Epoch timestamp in seconds.
- Target
- EXPORT_TO_DATE