你有没有遇到过这种情况:每次打开 Cursor / Kiro / Claude Desktop,AI 助手都像失忆了一样,之前聊过的偏好、项目背景、技术选型全忘了?Mem0 的 OpenMemory 就是来解决这个问题的 ------ 给 AI 编程助手加一层持久化语义记忆,让它真正"记住你"。
本文记录了将 OpenMemory MCP Server 部署到 Kubernetes 的完整过程,包括 6 个实际踩过的坑和解决方案,希望能帮你少走弯路。
一、这是什么?能干嘛?
OpenMemory 是 Mem0 开源的记忆服务,通过 MCP(Model Context Protocol)协议与 IDE 中的 AI 助手对接。部署后,你可以:
- 让 AI 记住你的技术偏好("我喜欢用 TypeScript")
- 让 AI 记住项目上下文("我们用的是 React 19 + Next.js 15")
- 团队共享记忆(同一个 URL,多人共享同一份项目记忆)
- 多项目隔离(不同项目的记忆互不干扰)
二、架构一览
IDE (Kiro/Cursor) → Ingress → OpenMemory MCP Server → Qdrant (向量数据库)
↓
LLM API Proxy (记忆提取/总结)
Embedding API Proxy (向量化)
技术栈一览
| 组件 | 说明 |
|---|---|
| 记忆引擎 | Mem0 SDK(LLM 驱动的记忆提取与检索) |
| 向量数据库 | Qdrant(官方默认) |
| 元数据库 | SQLite(嵌入式,零配置) |
| LLM | 通过 OpenAI 兼容 API 代理调用 |
| Embedding | text-embedding-3-large(通过 API 代理) |
| 传输协议 | SSE + Streamable HTTP(MCP 标准协议) |
镜像说明
全部使用官方镜像,零代码修改,零自建镜像:
mem0/openmemory-mcp:latest--- MCP Serverqdrant/qdrant:latest--- 向量数据库busybox:1.36--- init container(等待 Qdrant 就绪)
三、前置条件
- Kubernetes 集群(1.24+)
- kubectl 已配置并可访问集群
- 可用的 StorageClass(示例中使用
cfs,按需替换) - OpenAI 兼容的 API 代理地址和 API Key
- Ingress Controller(示例中使用 Traefik,按需替换)
- DNS 解析配置(将域名指向 Ingress Controller 的 LB 地址)
四、部署步骤(一键 apply)
第一步:修改配置
编辑 openmemory-mcp-standalone.yaml,替换以下内容:
1. API Key(Secret)
yaml
# ==================== 2. Secret ====================
stringData:
OPENAI_API_KEY: "your-api-key-here" # ← 替换为你的 API Key
2. LLM 和 Embedding 配置(ConfigMap)
yaml
# ==================== 3. ConfigMap ====================
data:
LLM_MODEL: "gpt-4o-mini" # ← LLM 模型名称
LLM_BASE_URL: "https://your-api-proxy.com/v1" # ← API 代理地址
EMBEDDER_MODEL: "text-embedding-3-large" # ← Embedding 模型名称
EMBEDDER_BASE_URL: "https://your-api-proxy.com/v1"
OPENAI_BASE_URL: "https://your-api-proxy.com/v1"
3. 启动脚本中的模型配置
在 Deployment 的 args 中,找到 Python 配置注入脚本,修改:
python
'model': 'gpt-4o-mini', # ← LLM 模型
'openai_base_url': 'https://your-api-proxy.com/v1' # ← API 代理地址
4. StorageClass(按需)
yaml
storageClassName: cfs # ← 替换为你集群的 StorageClass
5. Ingress 域名
yaml
rules:
- host: openmemory-mcp.your-domain.com # ← 替换为你的域名
第二步:部署
bash
kubectl apply -f openmemory-mcp-standalone.yaml
第三步:验证部署
bash
# 查看 Pod 状态
kubectl get pods -n mcp-system
# 期望输出:
# openmemory-qdrant-xxx 1/1 Running
# openmemory-mcp-xxx 1/1 Running
# 查看 MCP Server 日志
kubectl logs -n mcp-system -l app=openmemory-mcp --tail=30
# 期望看到:
# Config inserted into database
# INFO: Uvicorn running on http://0.0.0.0:8765
第四步:测试连通性
bash
# 通过 Ingress 域名测试
curl https://openmemory-mcp.your-domain.com/docs
# 通过 NodePort 测试
curl http://<节点IP>:30531/docs
# 测试 MCP SSE 端点
curl -N https://openmemory-mcp.your-domain.com/mcp/default/sse/my-project
# 期望返回:event: endpoint\ndata: /mcp/messages/?session_id=xxx
五、IDE 配置(3 分钟接入)
Kiro
编辑 ~/.kiro/settings/mcp.json:
json
{
"mcpServers": {
"team-memory": {
"url": "https://openmemory-mcp.your-domain.com/mcp/default/sse/my-project",
"autoApprove": ["*"]
}
}
}
Cursor
在 Settings → MCP 中添加:
json
{
"mcpServers": {
"team-memory": {
"url": "https://openmemory-mcp.your-domain.com/mcp/cursor/sse/my-project"
}
}
}
Claude Desktop
编辑 claude_desktop_config.json:
json
{
"mcpServers": {
"team-memory": {
"url": "https://openmemory-mcp.your-domain.com/mcp/claude-desktop/sse/my-project"
}
}
}
六、URL 路径与隔离机制
MCP 端点格式:/mcp/{client_name}/sse/{user_id}
| 参数 | 说明 | 示例 |
|---|---|---|
client_name |
客户端标识,用于区分不同 IDE 的记忆来源 | kiro, cursor, default |
user_id |
用户/项目标识,用于隔离不同项目的记忆 | my-project, project-alpha |
隔离机制
client_name不同 → 记忆按客户端隔离(Kiro 和 Cursor 各自独立)user_id不同 → 记忆按项目隔离- 同一
client_name+user_id→ 共享记忆(适合团队协作)
七、踩坑实录(6 个坑,个个致命)
以下是实际部署过程中遇到的问题,每一个都会导致服务无法启动或功能不可用。
1. Qdrant DNS 解析失败
现象 :Failed to initialize memory client: [Errno -2] Name or service not known
原因 :官方镜像硬编码 vector_store.host = "mem0_store"(Docker Compose 服务名),K8s 中该 hostname 不存在。且 mem0_store 包含下划线,DNS 不支持。
解决:
-
方案 A(推荐):启动时用
sed替换源码中的 host 值bashsed -i 's/"host": "mem0_store"/"host": "openmemory-qdrant"/' /usr/src/openmemory/app/utils/memory.py -
方案 B:创建 ExternalName Service 做 DNS 别名(注意下划线问题,
mem0_store无法作为 Service 名)
2. Alembic 找不到配置文件
现象 :No 'script_location' key found in configuration
原因 :PVC 挂载到 /usr/src/openmemory 覆盖了整个工作目录,导致 alembic.ini 等文件丢失。
解决:不要将 PVC 挂载到工作目录。SQLite 数据库暂存在容器内(Pod 重启会丢失),向量数据由 Qdrant 独立持久化,不受影响。
3. SQLite 无法打开数据库文件
现象 :sqlite3.OperationalError: unable to open database file
原因:CFS(NFS 类存储)不支持 SQLite 的文件锁机制。
解决 :SQLite 数据库使用容器本地存储(默认路径 ./openmemory.db),不挂载到 NFS 类型的 PVC。元数据(用户、App、记忆索引)在 Pod 重启后会重建,核心向量数据在 Qdrant 中持久化。
4. OpenAI API Key 未注入
现象 :The api_key client option must be set
原因 :Alembic 迁移时加载 models.py → categorization.py → OpenAI(),此时需要 OPENAI_API_KEY 和 OPENAI_BASE_URL 环境变量。
解决 :在 ConfigMap 中添加 OPENAI_BASE_URL,在 Secret 中配置 OPENAI_API_KEY,通过 envFrom 注入到容器。
5. LLM/Embedding 配置不生效
现象 :ConfigMap 中的 LLM_MODEL、EMBEDDER_MODEL 等环境变量不被 Mem0 SDK 读取。
原因 :OpenMemory 的配置加载逻辑优先读数据库 Config 表,其次用 get_default_memory_config() 硬编码默认值。环境变量 LLM_MODEL 等不会被自动映射到 Mem0 SDK 配置。
解决:在启动脚本中通过 Python 代码将正确的配置写入数据库 Config 表:
python
from app.database import SessionLocal
from app.models import Config as ConfigModel
db = SessionLocal()
config_value = {
'mem0': {
'llm': {
'provider': 'openai',
'config': {
'model': 'your-llm-model',
'api_key': 'env:OPENAI_API_KEY',
'openai_base_url': 'https://your-api-proxy.com/v1'
}
},
'embedder': {
'provider': 'openai',
'config': {
'model': 'text-embedding-3-large',
'api_key': 'env:OPENAI_API_KEY',
'openai_base_url': 'https://your-api-proxy.com/v1'
}
}
}
}
new_config = ConfigModel(key='main', value=config_value)
db.add(new_config)
db.commit()
6. 数据库配置合并不完整
现象 :数据库中配置了 vector_store,但不生效。
原因 :app/utils/memory.py 的 get_memory_client() 函数在合并数据库配置时,只处理了 llm 和 embedder,忽略了 vector_store。
解决 :不依赖数据库配置 vector_store,改用 sed 直接修改源码中的默认 host。
八、运维命令速查
bash
# 查看所有组件状态
kubectl get all -n mcp-system
# 查看 MCP Server 日志
kubectl logs -n mcp-system -l app=openmemory-mcp -f --tail=50
# 查看 Qdrant 日志
kubectl logs -n mcp-system -l app=openmemory-qdrant -f --tail=50
# 重启 MCP Server
kubectl rollout restart deployment openmemory-mcp -n mcp-system
# 卸载全部组件
kubectl delete -f openmemory-mcp-standalone.yaml
九、已知限制与后续优化
- SQLite 不持久化:Pod 重启后元数据(用户、App 记录)会丢失并自动重建。向量数据在 Qdrant 中持久化,不受影响。
- 单副本限制:SQLite 文件锁不支持多副本。如需高可用,需将元数据库替换为 PostgreSQL。
- Qdrant 版本兼容性:官方镜像内置的 Qdrant 客户端版本可能与最新 Qdrant Server 不完全兼容(会有 Warning,不影响功能)。
十、效果展示
部署完成后,在 IDE 中就可以这样使用:
存入记忆
调用 add_memories 工具,传入 "我喜欢用 TypeScript 开发",返回结果:
json
{
"results": [
{
"id": "eba31fec-7ed4-4d99-9113-7f764495ad29",
"memory": "喜欢用 TypeScript 开发",
"event": "ADD"
}
]
}
Mem0 自动从原始文本中提取了关键记忆:"喜欢用 TypeScript 开发"。
搜索记忆
调用 search_memory 工具,查询 "开发语言偏好",返回结果:
json
[
{
"id": "eba31fec-7ed4-4d99-9113-7f764495ad29",
"memory": "喜欢用 TypeScript 开发",
"score": 0.48524624,
"created_at": "2026-04-19T23:46:13.117429-07:00"
}
]

即使搜索词和存入的文本完全不同("开发语言偏好" vs "我喜欢用 TypeScript 开发"),语义检索依然能准确召回。这就是向量化记忆的威力。
完整链路
IDE (Kiro) → Ingress (域名) → OpenMemory MCP → LLM (记忆提取) + Embedding (向量化) → Qdrant (存储/检索)
AI 助手终于不再"失忆"了。
如果这篇文章对你有帮助,欢迎点赞收藏。有问题欢迎评论区交流。
完整的 K8s YAML 部署文件见文章配套仓库。
