diff --git a/AI/mem0/deploy.md b/AI/mem0/deploy.md index 067e2c8..53c4028 100644 --- a/AI/mem0/deploy.md +++ b/AI/mem0/deploy.md @@ -273,23 +273,98 @@ mem0 server 启动时读取 `DASHBOARD_URL`,设置 `allow_origins=[DASHBOARD_U 确保 `DASHBOARD_URL` 设为 dashboard 的外部访问地址(与 `NEXT_PUBLIC_API_URL` 的域名部分一致)。 -### sentence_transformers 导入错误 +## sentence_transformers 导入错误(永久修复) mem0 的 `huggingface.py` 在文件顶部执行 `from sentence_transformers import SentenceTransformer`,即使走 `huggingface_base_url` 路径(用 OpenAI 客户端调用 TEI,不需要本地模型)也会尝试加载,造成 `ModuleNotFoundError`。 -**临时修复**(容器内,重启会丢): +通过 init container + emptyDir 挂载实现持久修复,pod recreate 不丢失: -```bash -sed -i 's/from sentence_transformers import SentenceTransformer/# from sentence_transformers import SentenceTransformer/' /usr/local/lib/python3.12/site-packages/mem0/embeddings/huggingface.py +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mem0 + namespace: tei +spec: + replicas: 1 + selector: + matchLabels: + app: mem0 + template: + metadata: + labels: + app: mem0 + spec: + initContainers: + - name: patch-mem0 + image: ccr.ccs.tencentyun.com/tei_agent/mem0:latest + command: + - sh + - -c + - | + cp -r /usr/local/lib/python3.12/site-packages/mem0 /tmp/mem0-patch/ + sed -i 's/from sentence_transformers import SentenceTransformer/# from sentence_transformers import SentenceTransformer/' /tmp/mem0-patch/embeddings/huggingface.py + echo "patch done" + volumeMounts: + - name: mem0-code + mountPath: /tmp/mem0-patch + containers: + - name: mem0-ui + image: ccr.ccs.tencentyun.com/tei_agent/mem0-ui:latest + ports: + - containerPort: 3000 + name: http + env: + - name: NEXT_PUBLIC_API_URL + value: "https://api.mem0.violin-work.online" + - name: API_INTERNAL_URL + value: "http://mem0.tei.svc.cluster.local:8000" + - name: NEXT_PUBLIC_INSTANCE_NAME + value: Mem0 + resources: + limits: + cpu: 200m + memory: 500Mi + requests: + cpu: 100m + memory: 250Mi + - name: mem0 + image: ccr.ccs.tencentyun.com/tei_agent/mem0:latest + ports: + - containerPort: 8000 + name: http + envFrom: + - configMapRef: + name: mem0-env + - secretRef: + name: mem0-secrets + env: + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: dify-prod-db-secret + key: password + volumeMounts: + - name: mem0-history + mountPath: /app/data + - name: mem0-code + mountPath: /usr/local/lib/python3.12/site-packages/mem0 + resources: + limits: + cpu: "2" + memory: 4Gi + requests: + cpu: "500m" + memory: 1Gi + volumes: + - name: mem0-history + persistentVolumeClaim: + claimName: mem0-history + - name: mem0-code + emptyDir: {} ``` -验证: - -```bash -python3 -c "from mem0.embeddings.huggingface import HuggingFaceEmbedding" -``` - -**永久修复**:在 Dockerfile 里加这步,或修改本地 mem0 源码后 COPY 进容器。 +**原理**:init container 先于主容器启动,把镜像里的 mem0 代码复制到 emptyDir,sed 补丁打在 emptyDir 里。主容器挂载 emptyDir 到 site-packages,覆盖镜像原有文件,实现补丁持久化(recreate 不丢)。 ## 功能测试