mem0-aio

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 Edition
mem0-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)

  1. Install the template and leave the default appdata path in place.
  2. For the fastest hosted path, set [code]OPENAI_API_KEY[/code].
  3. 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.
  4. 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.
  5. 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.

mem0-aio

mem0-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:

  1. Install the Unraid template.
  2. Leave the default appdata path in place.
  3. Either set OPENAI_API_KEY for the hosted quick-start, or set OLLAMA_BASE_URL to your external native Ollama root URL for the normal local-LLM path.
  4. If you use Ollama, also set LLM_MODEL and EMBEDDER_MODEL to models you already have pulled on that server.
  5. Start the container.
  6. Open the web UI on port 3000.
  7. 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:

  1. Set API / MCP Port to the host port you want to publish, usually 8765.
  2. Set [Security] API Bind Address (MEM0_API_HOST) to 0.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 /v1 base 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_URL and QDRANT_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 stable v2.0.0 line rather than staying on the older v1.0.x line.
  • 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.1 inside the container and is not published by the Unraid template; set MEM0_API_HOST=0.0.0.0 only when intentionally publishing port 8765 behind 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:6333 plus QDRANT_API_KEY instead of only QDRANT_HOST and QDRANT_PORT.
  • Do not set QDRANT_API_KEY against the bundled Qdrant default. Use QDRANT_URL or an external QDRANT_HOST when Qdrant auth is enabled.
  • Native Ollama provider support expects the root Ollama URL such as http://host.docker.internal:11434, not an OpenAI-compatible /v1 path.
  • If your homelab front door adds auth and only exposes an OpenAI-style /v1 endpoint, 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_SSL and ELASTICSEARCH_VERIFY_CERTS. For OpenSearch, it exposes optional user/password plus OPENSEARCH_USE_SSL and OPENSEARCH_VERIFY_CERTS. SSL and certificate verification both default to true; set verification to false only 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-fleet from .aio-fleet.yml.
  • Changelog generation and XML <Changes> sync are run centrally by aio-fleet during release preparation.
  • main publishes latest, the pinned upstream version tag, an explicit AIO packaging line tag, and sha-<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 main pushes run the fast validation layers first
  • Docker-backed integration tests run for build-relevant changes, for main release-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

Funding

If this work saves you time, support it here:

Star History

Star History Chart

Media gallery

1 / 3

Install 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.

Open the Apps tab on your Unraid server Search Community Apps for mem0-aio Review the template variables and paths Click Install

Requirements

OpenMemory still needs a valid LLM/embedder setup for actual memory generation. For the easiest first boot, keep bundled storage defaults and either set OPENAI_API_KEY or point the app at a reachable native Ollama endpoint with chat and embedding models you already have pulled. External vector storage is advanced: configure exactly one backend.

Download Statistics

10,399
Total Downloads

Related apps

Details

Repository
jsonbored/mem0-aio:latest
Last Updated2026-06-18
First Seen2026-04-17

Runtime arguments

Web UI
http://[IP]:[PORT:3000]
Network
bridge
Shell
sh
Privileged
false

Template configuration

Web UI PortPorttcp

Main OpenMemory web interface port.

Target
3000
Default
3000
Value
3000
API / MCP PortPorttcp

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
AppData - OpenMemory StoragePathrw

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
OpenAI API KeyVariable

Optional hosted-provider quick start. Leave blank if you plan to use Ollama instead.

Target
OPENAI_API_KEY
Default User IDVariable

Default user namespace used by the API and MCP server.

Target
USER
Default
default_user
Value
default_user
Ollama Base URLVariable

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
Ollama Chat ModelVariable

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
Ollama Embed ModelVariable

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
[Security] API Bind Address (MEM0_API_HOST)Variable

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
[UI] Browser API URLVariable

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
[UI] Public User IDVariable

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
[LLM] ProviderVariable

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
[LLM] API KeyVariable

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
[LLM] Base URLVariable

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
[LLM] Ollama Host OverrideVariable

Optional host override used by upstream Docker Ollama auto-detection. Example: host.docker.internal

Target
OLLAMA_HOST
[Embedder] ProviderVariable

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
[Embedder] API KeyVariable

Optional provider-specific embedder API key.

Target
EMBEDDER_API_KEY
[Embedder] Base URLVariable

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
[Embedder] Dimensions OverrideVariable

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
[Storage] DATABASE_URLVariable

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] API_KEY AliasVariable

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
[Vector Store:Qdrant] URLVariable

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
[Vector Store:Qdrant] HostVariable

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
[Vector Store:Qdrant] PortVariable

Qdrant port for the bundled or selected external Qdrant backend.

Target
QDRANT_PORT
Default
6333
Value
6333
[Vector Store:Qdrant] API KeyVariable

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
[Vector Store:Qdrant] Disable TelemetryVariable

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
[Vector Store:Chroma] HostVariable

External Chroma host. Requires CHROMA_PORT and must be the only external vector backend configured.

Target
CHROMA_HOST
[Vector Store:Chroma] PortVariable

External Chroma port. Requires CHROMA_HOST.

Target
CHROMA_PORT
[Vector Store:Weaviate] Cluster URLVariable

External Weaviate cluster URL. Use this or WEAVIATE_HOST/WEAVIATE_PORT, and do not combine with another vector backend.

Target
WEAVIATE_CLUSTER_URL
[Vector Store:Weaviate] HostVariable

External Weaviate host. Requires WEAVIATE_PORT unless WEAVIATE_CLUSTER_URL is set.

Target
WEAVIATE_HOST
[Vector Store:Weaviate] PortVariable

External Weaviate port. Requires WEAVIATE_HOST unless WEAVIATE_CLUSTER_URL is set.

Target
WEAVIATE_PORT
[Vector Store:Redis] URLVariable

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
[Vector Store:PGVector] HostVariable

External PostgreSQL/pgvector host. Requires PG_PORT and must be the only external vector backend configured.

Target
PG_HOST
[Vector Store:PGVector] PortVariable

External PostgreSQL/pgvector port. Required when any PG_* vector-store setting is used.

Target
PG_PORT
[Vector Store:PGVector] DatabaseVariable

External PostgreSQL database name for pgvector. Defaults to mem0 when PGVector is selected and this is blank.

Target
PG_DB
[Vector Store:PGVector] UserVariable

External PostgreSQL username for pgvector. Defaults to mem0 when PGVector is selected and this is blank.

Target
PG_USER
[Vector Store:PGVector] PasswordVariable

External PostgreSQL password for pgvector. Defaults to mem0 when PGVector is selected and this is blank.

Target
PG_PASSWORD
[Vector Store:Milvus] HostVariable

Optional external Milvus host.

Target
MILVUS_HOST
[Vector Store:Milvus] PortVariable

Optional external Milvus port.

Target
MILVUS_PORT
[Vector Store:Milvus] TokenVariable

Optional Milvus token for authenticated deployments.

Target
MILVUS_TOKEN
[Vector Store:Milvus] Database NameVariable

Optional Milvus database name.

Target
MILVUS_DB_NAME
[Vector Store:Elasticsearch] HostVariable

Optional external Elasticsearch host.

Target
ELASTICSEARCH_HOST
[Vector Store:Elasticsearch] PortVariable

Optional external Elasticsearch port.

Target
ELASTICSEARCH_PORT
[Vector Store:Elasticsearch] UserVariable

Optional Elasticsearch username.

Target
ELASTICSEARCH_USER
[Vector Store:Elasticsearch] PasswordVariable

Optional Elasticsearch password.

Target
ELASTICSEARCH_PASSWORD
[Vector Store:Elasticsearch] Use SSLVariable

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
[Vector Store:Elasticsearch] Verify CertsVariable

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
[Vector Store:OpenSearch] HostVariable

Optional external OpenSearch host.

Target
OPENSEARCH_HOST
[Vector Store:OpenSearch] PortVariable

Optional external OpenSearch port.

Target
OPENSEARCH_PORT
[Vector Store:OpenSearch] UserVariable

Optional OpenSearch username.

Target
OPENSEARCH_USER
[Vector Store:OpenSearch] PasswordVariable

Optional OpenSearch password.

Target
OPENSEARCH_PASSWORD
[Vector Store:OpenSearch] Use SSLVariable

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
[Vector Store:OpenSearch] Verify CertsVariable

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
[Vector Store:FAISS] PathVariable

Optional FAISS storage path inside the container or a mounted host path.

Target
FAISS_PATH
[Backup Export] User ID FilterVariable

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
[Backup Export] App ID FilterVariable

Optional one-shot filter for the bundled upstream export helper script.

Target
EXPORT_APP_ID
[Backup Export] From Date (epoch)Variable

Optional one-shot export filter. Epoch timestamp in seconds.

Target
EXPORT_FROM_DATE
[Backup Export] To Date (epoch)Variable

Optional one-shot export filter. Epoch timestamp in seconds.

Target
EXPORT_TO_DATE