OpenMemory(Mem0) 서비스 전면 폐기
kappa 세션의 MCP 호출 실패를 계기로 K3s 공용 OpenMemory 서비스를 완전히 폐기(ArgoCD Application + namespace 삭제, chart 소스 제거, MCP 클라이언트 등록 해제). heimdall/syn도 사용 중이었으나 대체 없이 중단. IronDesk 전용 별도 인스턴스(irondesk-openmemory, RUNNING 확인)는 범위에서 제외.
This commit is contained in:
@@ -15,6 +15,5 @@ tags: [moc, services]
|
||||
| [[gitea]] | Gitea 서버 및 CI/CD |
|
||||
| [[n8n]] | n8n 워크플로 자동화 |
|
||||
| [[netbis]] | Netbis 예비서버 (zlambda DR 프록시) |
|
||||
| [[openmemory]] | OpenMemory (Mem0) 시멘틱 메모리 |
|
||||
| [[searxng]] | SearXNG 메타 검색 엔진 |
|
||||
| [[twilio]] | Twilio 음성/메시지 서비스 |
|
||||
|
||||
@@ -1,244 +0,0 @@
|
||||
---
|
||||
title: OpenMemory (Mem0)
|
||||
updated: 2026-03-28
|
||||
tags:
|
||||
- service
|
||||
- ai
|
||||
- memory
|
||||
- mcp
|
||||
---
|
||||
|
||||
## 개요
|
||||
|
||||
OpenMemory는 [[Mem0]]에서 개발한 **오픈소스 AI 메모리 레이어**. LLM 기반 앱들이 공유 가능한 영속적 메모리를 로컬에서 사용할 수 있게 해주는 시스템.
|
||||
|
||||
- **로컬 우선**: 모든 데이터가 사용자 머신에 저장, 클라우드 동기화 없음
|
||||
- **크로스 클라이언트**: MCP 호환 도구 간 컨텍스트 공유
|
||||
- **프라이버시 우선**: "Nothing goes to the cloud"
|
||||
- GitHub: https://github.com/mem0ai/mem0 (`openmemory/` 디렉토리)
|
||||
- 공식 문서: https://docs.mem0.ai/openmemory
|
||||
|
||||
## Obsidian vs OpenMemory
|
||||
|
||||
| | Obsidian | OpenMemory (Mem0) |
|
||||
|---|---------|------------|
|
||||
| **성격** | 마크다운 지식베이스 | 오픈소스 AI 메모리 레이어 |
|
||||
| **용도** | 개인 지식 관리, 문서화 | AI 앱의 영속적 메모리 저장/공유 |
|
||||
| **소비자** | 사람 | MCP 호환 클라이언트 (Claude Desktop, Cursor, Windsurf, Cline 등) |
|
||||
| **검색** | 키워드 검색, wiki links | 벡터 임베딩 기반 시맨틱 검색 |
|
||||
| **저장** | 마크다운 파일 | SQLite + Qdrant 벡터 DB |
|
||||
| **연동** | 플러그인, git | MCP 프로토콜 (SSE) |
|
||||
| **상태관리** | 없음 | active / paused / archived / deleted |
|
||||
| **감사** | git log | 앱별 접근 로그 |
|
||||
| **프라이버시** | 로컬 파일 | 로컬 우선 (클라우드 동기화 없음) |
|
||||
|
||||
## 아키텍처
|
||||
|
||||
| 컴포넌트 | 기술 스택 | 포트 | 역할 |
|
||||
|----------|-----------|------|------|
|
||||
| `mem0_store` | Qdrant (벡터 DB) | 6333 | 메모리 벡터 저장소 |
|
||||
| `openmemory-mcp` | FastAPI + Uvicorn | 8765 | API 서버 + MCP 서버 |
|
||||
| `openmemory-ui` | Next.js (React) | 3000 | 웹 대시보드 |
|
||||
|
||||
DB: SQLite(`openmemory.db`) + Qdrant 벡터 스토어 이중 구조. Alembic으로 마이그레이션 관리.
|
||||
|
||||
## 주요 기능
|
||||
|
||||
- **시맨틱 메모리 검색**: 벡터 임베딩 기반 의미적 유사 메모리 검색
|
||||
- **크로스 앱 메모리 공유**: Claude, Cursor 등 여러 MCP 클라이언트 간 공유
|
||||
- **메모리 상태 관리**: active, paused, archived, deleted 4단계
|
||||
- **접근 감사 로그**: 어떤 앱이 언제 어떤 메모리에 접근했는지 기록
|
||||
- **카테고리 자동 분류**: 메모리에 자동 카테고리 태깅
|
||||
- **관련 메모리 탐색**: 같은 카테고리 관련 메모리 자동 추천
|
||||
- **앱별 권한 제어**: 앱 단위 메모리 접근 일시정지
|
||||
- **웹 대시보드(UI)**: 메모리 관리, 통계, 설정 GUI
|
||||
- **백업/복원**: 데이터 백업 내장
|
||||
- **다중 벡터 스토어**: Qdrant, pgvector, Redis, Milvus 등 8개 백엔드
|
||||
|
||||
## K3s 배포
|
||||
|
||||
K3s `openmemory` 네임스페이스에 배포. 매니페스트: `gitea.inouter.com/kaffa/k8s` → `manifests/openmemory/resources.yaml`
|
||||
|
||||
| 컴포넌트 | 이미지 | 상태 |
|
||||
|----------|--------|------|
|
||||
| openmemory-mcp | `gitea.inouter.com/kaffa/openmemory-mcp:1.0.8` | Deployment, imagePullPolicy: Always |
|
||||
| openmemory-ui | `mem0/openmemory-ui:latest` | Deployment |
|
||||
| qdrant | `qdrant/qdrant:latest` | Deployment |
|
||||
|
||||
| 항목 | 값 |
|
||||
|------|-----|
|
||||
| MCP SSE | `https://mem0.inouter.com/mcp/claude-code/sse/kaffa` |
|
||||
| UI | `https://mem0.inouter.com` (HTTPRoute 경유) |
|
||||
| API 문서 | `https://mem0.inouter.com/docs` |
|
||||
| DB | SQLite (`openmemory.db`, PVC `openmemory-data`) + Qdrant 벡터 |
|
||||
| Secret | `openmemory-secrets` (OPENAI_API_KEY) |
|
||||
| Registry | `gitea-registry` (imagePullSecrets) |
|
||||
|
||||
### 업데이트 절차
|
||||
|
||||
kaniko Job으로 GitHub 소스에서 빌드 → Gitea 레지스트리 push → Deployment 이미지 태그 변경:
|
||||
|
||||
```bash
|
||||
# 1. kaniko 빌드 (K3s 내에서 실행)
|
||||
cat <<'EOF' | kubectl apply -f -
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
name: build-openmemory
|
||||
namespace: openmemory
|
||||
spec:
|
||||
backoffLimit: 0
|
||||
ttlSecondsAfterFinished: 300
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: kaniko
|
||||
image: gcr.io/kaniko-project/executor:latest
|
||||
args:
|
||||
- "--context=git://github.com/mem0ai/mem0.git#refs/heads/main"
|
||||
- "--context-sub-path=openmemory/api"
|
||||
- "--destination=gitea.inouter.com/kaffa/openmemory-mcp:latest"
|
||||
- "--destination=gitea.inouter.com/kaffa/openmemory-mcp:NEW_VERSION"
|
||||
volumeMounts:
|
||||
- name: docker-config
|
||||
mountPath: /kaniko/.docker/
|
||||
volumes:
|
||||
- name: docker-config
|
||||
secret:
|
||||
secretName: gitea-registry
|
||||
items:
|
||||
- key: .dockerconfigjson
|
||||
path: config.json
|
||||
restartPolicy: Never
|
||||
EOF
|
||||
|
||||
# 2. 빌드 완료 확인
|
||||
kubectl logs -f job/build-openmemory -n openmemory
|
||||
|
||||
# 3. 이미지 전환
|
||||
kubectl set image deploy/openmemory-mcp -n openmemory \
|
||||
openmemory-mcp=gitea.inouter.com/kaffa/openmemory-mcp:NEW_VERSION
|
||||
|
||||
# 4. MCP 재연결 (Claude Code에서 /mcp 실행)
|
||||
```
|
||||
|
||||
### 설치 (최초, docker-compose 방식)
|
||||
|
||||
```bash
|
||||
export OPENAI_API_KEY=sk-xxx
|
||||
curl -sL https://raw.githubusercontent.com/mem0ai/mem0/main/openmemory/run.sh | bash
|
||||
|
||||
# 또는 수동
|
||||
git clone https://github.com/mem0ai/mem0.git
|
||||
cd mem0/openmemory
|
||||
make env && make build && make up
|
||||
```
|
||||
|
||||
**지원 벡터 스토어**: Qdrant(기본), Weaviate, Redis, pgvector, Chroma, Milvus, Elasticsearch, FAISS
|
||||
|
||||
## Makefile 명령어
|
||||
|
||||
| 명령 | 설명 |
|
||||
|------|------|
|
||||
| `make build` | Docker 이미지 빌드 |
|
||||
| `make up` | 서비스 시작 |
|
||||
| `make down` | 서비스 중지 + 볼륨 삭제 |
|
||||
| `make logs` | 로그 확인 |
|
||||
| `make shell` | API 컨테이너 셸 접속 |
|
||||
| `make migrate` | DB 마이그레이션 실행 |
|
||||
| `make env` | .env 템플릿 복사 |
|
||||
| `make ui-dev` | UI 개발 서버 실행 |
|
||||
|
||||
## MCP 서버 통합
|
||||
|
||||
### 엔드포인트
|
||||
|
||||
```
|
||||
GET /mcp/{client_name}/sse/{user_id} # SSE 연결
|
||||
POST /mcp/{client_name}/sse/{user_id}/messages/ # 메시지 전송
|
||||
POST /mcp/messages/ # 범용 메시지
|
||||
```
|
||||
|
||||
### MCP 도구 (4개)
|
||||
|
||||
| 도구 | 설명 |
|
||||
|------|------|
|
||||
| `add_memories` | 텍스트를 메모리로 저장 (벡터 임베딩 + DB 기록) |
|
||||
| `search_memory` | 시맨틱 검색으로 관련 메모리 조회 |
|
||||
| `list_memories` | 사용자의 모든 메모리 목록 조회 |
|
||||
| `delete_all_memories` | 전체 메모리 삭제 |
|
||||
|
||||
### 클라이언트 등록
|
||||
|
||||
```bash
|
||||
npx @openmemory/install local http://localhost:8765/mcp/<client-name>/sse/<user-id> --client <client-name>
|
||||
```
|
||||
|
||||
지원 클라이언트: Claude Desktop, Cursor, Windsurf, Cline 등 MCP 호환 도구 전체
|
||||
|
||||
## API 엔드포인트
|
||||
|
||||
API 문서: `/docs` (Swagger), `/redoc` (ReDoc)
|
||||
|
||||
### 메모리 API (`/api/v1/memories/`)
|
||||
|
||||
| 메서드 | 경로 | 설명 |
|
||||
|--------|------|------|
|
||||
| GET | `/api/v1/memories/` | 메모리 목록 (페이지네이션, 필터, 검색) |
|
||||
| POST | `/api/v1/memories/` | 메모리 생성 |
|
||||
| GET | `/api/v1/memories/{id}` | 메모리 상세 조회 |
|
||||
| PUT | `/api/v1/memories/{id}` | 메모리 수정 |
|
||||
| DELETE | `/api/v1/memories/` | 메모리 삭제 (배치) |
|
||||
| POST | `/api/v1/memories/actions/archive` | 메모리 아카이브 |
|
||||
| POST | `/api/v1/memories/actions/pause` | 메모리 일시정지 |
|
||||
| GET | `/api/v1/memories/{id}/access-log` | 접근 로그 조회 |
|
||||
| POST | `/api/v1/memories/filter` | 고급 필터 검색 |
|
||||
| GET | `/api/v1/memories/{id}/related` | 관련 메모리 조회 |
|
||||
| GET | `/api/v1/memories/categories` | 카테고리 목록 |
|
||||
|
||||
### 설정 API (`/api/v1/config/`)
|
||||
|
||||
| 메서드 | 경로 | 설명 |
|
||||
|--------|------|------|
|
||||
| GET/PUT | `/api/v1/config/` | 전체 설정 조회/수정 |
|
||||
| POST | `/api/v1/config/reset` | 설정 초기화 |
|
||||
| GET/PUT | `/api/v1/config/mem0/llm` | LLM 설정 |
|
||||
| GET/PUT | `/api/v1/config/mem0/embedder` | 임베딩 모델 설정 |
|
||||
| GET/PUT | `/api/v1/config/mem0/vector_store` | 벡터 스토어 설정 |
|
||||
|
||||
### 기타 API
|
||||
|
||||
| 경로 | 설명 |
|
||||
|------|------|
|
||||
| `/api/v1/stats/` | 통계 (메모리 수, 앱 수) |
|
||||
| `/api/v1/apps/` | 앱 관리 |
|
||||
| `/api/v1/backup/` | 백업 관리 |
|
||||
|
||||
## 설정
|
||||
|
||||
### config.json (기본값)
|
||||
|
||||
```json
|
||||
{
|
||||
"mem0": {
|
||||
"llm": {
|
||||
"provider": "openai",
|
||||
"config": {
|
||||
"model": "gpt-4o-mini",
|
||||
"temperature": 0.1,
|
||||
"max_tokens": 2000,
|
||||
"api_key": "env:OPENAI_API_KEY"
|
||||
}
|
||||
},
|
||||
"embedder": {
|
||||
"provider": "openai",
|
||||
"config": {
|
||||
"model": "text-embedding-3-small",
|
||||
"api_key": "env:OPENAI_API_KEY"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
LLM/임베딩 모델은 API를 통해 런타임에 변경 가능. 벡터 스토어도 REST API로 동적 전환 가능.
|
||||
Reference in New Issue
Block a user