295 lines
6.5 KiB
Markdown
295 lines
6.5 KiB
Markdown
# 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)
|
||
|
||
| 变量 | 值 | 说明 |
|
||
|---|---|---|
|
||
| DATABASE_URL | postgres://gitlab:gitlab@192.168.3.49:5432/mem0 | 连接字串 |
|
||
| APP_DB_NAME | mem0_app | 数据库名 |
|
||
| 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 | 日志保留天数 |
|
||
|
||
### Secret (mem0-secrets)
|
||
|
||
| 变量 | 说明 |
|
||
|---|---|
|
||
| JWT_SECRET | JWT 签名密钥 |
|
||
| ADMIN_API_KEY | 管理后台 API key |
|
||
| POSTGRES_PASSWORD | PostgreSQL 密码 |
|
||
|
||
## 部署清单
|
||
|
||
```yaml
|
||
apiVersion: v1
|
||
kind: ConfigMap
|
||
metadata:
|
||
name: mem0-env
|
||
namespace: tei
|
||
data:
|
||
DATABASE_URL: "postgres://gitlab:gitlab@192.168.3.49:5432/mem0"
|
||
APP_DB_NAME: "mem0_app"
|
||
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"
|
||
---
|
||
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
|
||
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"
|
||
---
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: mem0
|
||
namespace: tei
|
||
spec:
|
||
ports:
|
||
- port: 8000
|
||
name: http
|
||
selector:
|
||
app: mem0
|
||
```
|
||
|
||
## History PVC(SQLite 持久化)
|
||
|
||
mem0 的对话历史(history)默认存在 SQLite,**必须用 PVC 持久化**(emptyDir 重启丢失)。
|
||
|
||
### 前置:创建 PVC
|
||
|
||
```yaml
|
||
apiVersion: v1
|
||
kind: PersistentVolumeClaim
|
||
metadata:
|
||
name: mem0-history
|
||
namespace: tei
|
||
spec:
|
||
accessModes:
|
||
- ReadWriteOnce
|
||
resources:
|
||
requests:
|
||
storage: 1Gi
|
||
storageClassName: standard # 根据你的 StorageClass 调整
|
||
```
|
||
|
||
### 环境变量追加
|
||
|
||
| 变量 | 值 | 说明 |
|
||
|---|---|---|
|
||
| HISTORY_DB_PATH | /app/data/mem0_history.db | SQLite 数据库路径 |
|
||
|
||
### PVC + 完整 Deployment
|
||
|
||
```yaml
|
||
apiVersion: v1
|
||
kind: PersistentVolumeClaim
|
||
metadata:
|
||
name: mem0-history
|
||
namespace: tei
|
||
spec:
|
||
accessModes:
|
||
- ReadWriteOnce
|
||
resources:
|
||
requests:
|
||
storage: 1Gi
|
||
storageClassName: standard
|
||
---
|
||
apiVersion: v1
|
||
kind: ConfigMap
|
||
metadata:
|
||
name: mem0-env
|
||
namespace: tei
|
||
data:
|
||
DATABASE_URL: "postgres://gitlab:***@192.168.3.49:5432/mem0"
|
||
APP_DB_NAME: "mem0_app"
|
||
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
|
||
```
|
||
|
||
## 前置要求
|
||
|
||
1. **pgvector 扩展** — PostgreSQL 需要安装 pgvector
|
||
2. **mem0_app 数据库** — 需要提前创建
|
||
3. **Qdrant collection** — mem0 启动时自动创建(首次调用时)
|
||
4. **mem0-history PVC** — 必须提前创建
|
||
|
||
## 验证
|
||
|
||
```bash
|
||
kubectl get pvc -n tei mem0-history
|
||
kubectl get pods -n tei -l app=mem0
|
||
kubectl logs -n tei -l app=mem0 --tail=50
|
||
|
||
# 健康检查
|
||
curl http://mem0:8000/health
|
||
``` |