# mem0 自托管部署 ## 镜像 ``` ccr.ccs.tencentyun.com/tei_agent/mem0:latest ``` ## 依赖服务(tei namespace) | 服务 | 地址 | 用途 | |---|---|---| | PostgreSQL | 192.168.3.49:5432 | 关系数据存储 | | Qdrant | qdrant:6333 | 向量存储 | | TEI (BGE-M3) | tei:8080 | Embedder(文本→向量) | ## 环境变量 ### ConfigMap (mem0-env) | 变量 | 值 | 说明 | |---|---|---| | APP_DB_NAME | mem0 | 数据库名 | | QDRANT_HOST | qdrant | Qdrant 服务地址 | | QDRANT_PORT | 6333 | Qdrant 端口 | | QDRANT_COLLECTION_NAME | mem0 | 集合名 | | EMBEDDER_PROVIDER | tei | Embedder 使用 TEI | | TEI_ENDPOINT | http://tei:8080 | TEI endpoint | | LLM_PROVIDER | openai | LLM provider(MiniMax 兼容 OpenAI 格式) | | OPENAI_API_KEY | YOUR_MINIMAX_KEY | MiniMax API key | | OPENAI_BASE_URL | https://api.minimax.chat/v1 | MiniMax API 地址 | | AUTH_DISABLED | false | 启用认证 | | MEM0_TELEMETRY | false | 关闭遥测 | | REQUEST_LOG_RETENTION_DAYS | 30 | 日志保留天数 | | HISTORY_DB_PATH | /app/data/mem0_history.db | SQLite 历史数据库路径 | ### Secret (mem0-secrets) | 变量 | 说明 | |---|---| | JWT_SECRET | JWT 签名密钥 | | ADMIN_API_KEY | 管理后台 API key | | POSTGRES_PASSWORD | PostgreSQL 密码 | ## 数据库迁移 (Alembic) mem0 server 使用 Alembic 管理 PostgreSQL schema。**首次部署前必须先执行迁移**,创建 `request_logs` 等表。 ### 迁移 Job ```yaml apiVersion: batch/v1 kind: Job metadata: name: mem0-migrate namespace: tei spec: ttlSecondsAfterFinished: 300 # 完成后5分钟自动清理 template: spec: restartPolicy: OnFailure containers: - name: alembic image: ccr.ccs.tencentyun.com/tei_agent/mem0:latest command: ["alembic", "upgrade", "head"] envFrom: - configMapRef: name: mem0-env - secretRef: name: mem0-secrets resources: limits: memory: "512Mi" cpu: "500m" ``` ### 迁移部署步骤 ```bash # 1. 先跑迁移(只执行一次) kubectl apply -f mem0-migrate-job.yaml # 2. 确认迁移完成 kubectl get job mem0-migrate -n tei -w # 3. 确认成功后再部署 mem0 kubectl apply -f mem0-deployment.yaml # 4. 如果迁移失败,查看原因 kubectl logs job/mem0-migrate -n tei ``` **重要**:迁移 Job 只跑一次。Pod 重启时不需要重新迁移,PostgreSQL schema 不会天天变。 ## 前置要求 1. **pgvector 扩展** — PostgreSQL 需要安装 pgvector 2. **mem0 数据库** — 需要提前创建 3. **mem0-migrate Job** — 首次部署前必须先执行迁移 4. **mem0-history PVC** — 必须提前创建 5. **Qdrant collection** — mem0 启动时自动创建(首次调用时) ## 部署清单 ### PVC + ConfigMap + Secret + Deployment + Service ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mem0-history namespace: tei spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: standard # 根据你的 StorageClass 调整 --- apiVersion: v1 kind: ConfigMap metadata: name: mem0-env namespace: tei data: APP_DB_NAME: "mem0" QDRANT_HOST: "qdrant" QDRANT_PORT: "6333" QDRANT_COLLECTION_NAME: "mem0" EMBEDDER_PROVIDER: "tei" TEI_ENDPOINT: "http://tei:8080" LLM_PROVIDER: "openai" OPENAI_API_KEY: "YOUR_MINIMAX_KEY" OPENAI_BASE_URL: "https://api.minimax.chat/v1" AUTH_DISABLED: "false" MEM0_TELEMETRY: "false" REQUEST_LOG_RETENTION_DAYS: "30" HISTORY_DB_PATH: "/app/data/mem0_history.db" --- apiVersion: v1 kind: Secret metadata: name: mem0-secrets namespace: tei type: Opaque stringData: JWT_SECRET: "your-jwt-secret-change-me" ADMIN_API_KEY: "your-admin-key-change-me" POSTGRES_PASSWORD: "gitlab" --- apiVersion: apps/v1 kind: Deployment metadata: name: mem0 namespace: tei spec: replicas: 1 selector: matchLabels: app: mem0 template: metadata: labels: app: mem0 spec: containers: - 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 volumeMounts: - name: mem0-history mountPath: /app/data livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 10 periodSeconds: 5 resources: limits: cpu: "2" memory: "4Gi" requests: cpu: "500m" memory: "1Gi" volumes: - name: mem0-history persistentVolumeClaim: claimName: mem0-history --- apiVersion: v1 kind: Service metadata: name: mem0 namespace: tei spec: ports: - port: 8000 name: http selector: app: mem0 ``` ## 验证 ```bash # 检查 PVC kubectl get pvc -n tei mem0-history # 检查 Pod kubectl get pods -n tei -l app=mem0 # 查看日志 kubectl logs -n tei -l app=mem0 --tail=50 # 健康检查 curl http://mem0:8000/health ``` ## History SQLite 说明 mem0 的对话历史存储在 SQLite,位于 `/app/data/mem0_history.db`。**必须用 PVC 持久化**,emptyDir 挂载重启后数据丢失。 如果 PVC 空间不足或不需要历史功能,可以改用空目录(数据丢失但不影响核心记忆功能): ```yaml # 测试/轻量级环境用 emptyDir volumes: - name: mem0-history emptyDir: {} ```