让 AI 编程助手拥有“记忆“:Mem0 OpenMemory MCP 部署到 K8s 全记录(踩坑 + 解决方案)

你有没有遇到过这种情况:每次打开 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 Server
  • qdrant/qdrant:latest --- 向量数据库
  • busybox:1.36 --- init container(等待 Qdrant 就绪)

三、前置条件

  1. Kubernetes 集群(1.24+)
  2. kubectl 已配置并可访问集群
  3. 可用的 StorageClass(示例中使用 cfs,按需替换)
  4. OpenAI 兼容的 API 代理地址和 API Key
  5. Ingress Controller(示例中使用 Traefik,按需替换)
  6. 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 值

    bash 复制代码
    sed -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.pycategorization.pyOpenAI(),此时需要 OPENAI_API_KEYOPENAI_BASE_URL 环境变量。

解决 :在 ConfigMap 中添加 OPENAI_BASE_URL,在 Secret 中配置 OPENAI_API_KEY,通过 envFrom 注入到容器。

5. LLM/Embedding 配置不生效

现象 :ConfigMap 中的 LLM_MODELEMBEDDER_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.pyget_memory_client() 函数在合并数据库配置时,只处理了 llmembedder,忽略了 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

九、已知限制与后续优化

  1. SQLite 不持久化:Pod 重启后元数据(用户、App 记录)会丢失并自动重建。向量数据在 Qdrant 中持久化,不受影响。
  2. 单副本限制:SQLite 文件锁不支持多副本。如需高可用,需将元数据库替换为 PostgreSQL。
  3. 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 部署文件见文章配套仓库。

相关推荐
翼龙云_cloud2 小时前
腾讯云代理商:云上 OpenClaw5 分钟接入 Slack 指南 AI 助手一键部署实战
服务器·人工智能·云计算·腾讯云·openclaw
AI医影跨模态组学2 小时前
Eur Radiol(IF=4.7)山西医科大学第一医院核磁影像科王效春等团队:基于Transformer增强型卷积神经网络的多中心MRI评估膀胱癌肌层浸润
人工智能·深度学习·论文·transformer·医学·医学影像
YuanDaima20482 小时前
大语言模型生命周期全链路解析:从架构基石到高效推理
开发语言·人工智能·python·语言模型·架构·transformer
Purple Coder2 小时前
AI预测超导材料论文素材
人工智能
K姐研究社2 小时前
TapNow Seedance 2.0实测:《牌子》《纸手机》AI制作全流程开源
人工智能·智能手机
美狐美颜sdk2 小时前
直播美颜效果差、卡顿严重如何解决?视频美颜SDK开发丨优化详解
人工智能·计算机视觉·直播美颜sdk·视频美颜sdk·美颜api·美狐美颜sdk·直播app开发
AI应用实战 | RE2 小时前
001、Agent智能体开发入门:概念、应用与前景
人工智能·自然语言处理
深海鱼在掘金2 小时前
从Claude Code泄露源码看工程架构:第九章 —— Claude Code 与架构的总结展望
人工智能·设计模式·架构
GitCode官方2 小时前
G-Star 精选开源项目推荐|第十四期
数据库·人工智能·自动化