OpenMemory(Mem0) 서비스 전면 폐기

kappa 세션의 MCP 호출 실패를 계기로 K3s 공용 OpenMemory 서비스를
완전히 폐기(ArgoCD Application + namespace 삭제, chart 소스 제거,
MCP 클라이언트 등록 해제). heimdall/syn도 사용 중이었으나 대체 없이 중단.
IronDesk 전용 별도 인스턴스(irondesk-openmemory, RUNNING 확인)는
범위에서 제외.
This commit is contained in:
kaffa
2026-07-27 12:35:22 +09:00
parent bd70d027b7
commit 75cdcc0aa6
14 changed files with 71 additions and 312 deletions

View File

@@ -1,7 +1,7 @@
---
title: Claude Code 설정 및 인스트럭션
updated: 2026-03-25
tags: [claude-code, setup, memory, openmemory]
tags: [claude-code, setup, memory]
---
## 기본 설정
@@ -33,7 +33,6 @@ tags: [claude-code, setup, memory, openmemory]
| kubernetes | npx | `mcp-server-kubernetes` | K8s 클러스터 관리 |
| nocodb | mcp-remote | `nocodb.inouter.com/mcp` | NocoDB 데이터베이스 |
| bunnycdn | HTTP | `bunnycdn-mcp.inouter.com/mcp` | BunnyCDN 관리 |
| openmemory | SSE | K3s openmemory ns | 장기기억 시멘틱 검색 |
| aws-core | uvx | `awslabs.core-mcp-server@latest` | AWS 리소스 관리 |
| context7 | npx | `@upstash/context7-mcp` | 라이브러리 문서 검색 |
| Google Calendar | claude.ai | `gcal.mcp.claude.com` | 구글 캘린더 |
@@ -48,28 +47,11 @@ tags: [claude-code, setup, memory, openmemory]
- 마운트된 엔진: `secret/` (KV), `ssh-client-signer/` (SSH)
- 주요 용도: 시크릿 관리, PKI 인증서 발급, SSH 서명
## 장기기억 (2계층 시스템)
## 장기기억
Obsidian + [[openmemory|OpenMemory]]를 조합한 2계층 장기기억 시스템.
Obsidian 단일 구조화 지식 정본 체계. _과거 OpenMemory(Mem0) 시멘틱 검색 계층을 병행했으나 2026-07-27 서비스 자체 폐기 — [[../history/2026-07-27-openmemory-decommission|history]]_
### 계층 구조
```
┌─────────────────────────────────────────────┐
│ 장기기억 시스템 │
├──────────────────┬──────────────────────────┤
│ Obsidian │ OpenMemory (Mem0) │
│ ~/obsidian │ K3s openmemory ns │
├──────────────────┼──────────────────────────┤
│ 구조화된 지식 정본 │ 시멘틱 검색용 인덱스 │
│ 마크다운 + git │ 벡터 DB (Qdrant) │
│ 사람 + AI 소비 │ AI 전용 소비 │
│ 키워드/경로 검색 │ 시멘틱 유사도 검색 │
│ Gitea 동기화 │ 로컬 전용 │
└──────────────────┴──────────────────────────┘
```
### Obsidian (1계층: 구조화된 지식)
### Obsidian (구조화된 지식)
Gitea 저장소: `gitea.inouter.com/kaffa/obsidian`
@@ -88,32 +70,15 @@ Gitea 저장소: `gitea.inouter.com/kaffa/obsidian`
- git workflow: `pull --rebase``add``commit``push`
- conflict 시 자동 해결 금지
### OpenMemory (2계층: 시멘틱 메모리)
K3s openmemory 네임스페이스 (MCP SSE)
**용도**: Obsidian 정본의 시멘틱 검색 인덱스. 키워드/개념을 벡터로 저장하여 관련 Obsidian 파일을 빠르게 찾는 역할.
**저장 대상**: 결정사항과 이유, 사용자 선호도, 시스템 quirks, 프로젝트 맥락, 패턴
**작성 규칙**:
- 한 메모리 = 하나의 핵심 정보 (검색 정확도 향상)
- 컨텍스트 포함: "X를 했다" → "Y 때문에 X를 했다"
- 날짜 중요 시 절대 날짜 포함 (예: "2026-03-25 기준")
- Obsidian 파일 경로 포함 (시멘틱 검색 → 정본 참조 흐름)
- 저장 전 `search_memory`로 중복 확인
### 읽기 우선순위
1. **Obsidian** — 인프라/서비스/제품 정보 (구조화된 정본)
2. **OpenMemory** — 결정 맥락, 선호도, 과거 인사이트 (시멘틱 검색)
3. **HashiCorp Vault** — 시크릿, 인증 정보
2. **HashiCorp Vault** — 시크릿, 인증 정보
### 세션 시작 시
1. `~/obsidian` git pull --rebase로 최신화
2. 없으면 [[vault]](`secret/gitea`)에서 토큰 읽어 clone
3. 현재 작업 관련 OpenMemory `search_memory` 조회
### 기억 저장 시점
@@ -121,7 +86,6 @@ K3s openmemory 네임스페이스 (MCP SSE)
- 새로운 인프라/서비스 정보를 알게 되었을 때
- 사용자가 "기억해" 요청 시
- 기존 정보 변경 시 (IP, 포트, 설정값 등)
- 아키텍처 결정 시 → Obsidian에 상세 + OpenMemory에 요약
## 주의사항

View File

@@ -20,6 +20,6 @@ tmux 3.6a
텍스트 입력은 일반 send-keys로 가능, Enter(제출)만 CSI u 필요
## OpenMemory 백업
## OpenMemory (폐기됨, 2026-07-27)
launchd로 매일 03:00, 15:00 자동 백업(io.kaffa.openmemory-backup.plist)
서비스 자체가 폐기됨 — [[../history/2026-07-27-openmemory-decommission|history]]. kaffa-mac-mini의 launchd 백업 job(`io.kaffa.openmemory-backup.plist`, 매일 03:00/15:00)은 이 세션(macbookair)에서 접근 불가 — mac-mini에서 직접 `launchctl unload`/plist 삭제 필요

View File

@@ -0,0 +1,48 @@
---
date: 2026-07-27
topic: OpenMemory(Mem0) 서비스 전면 폐기
areas:
- services/openmemory.md (삭제)
- infra/network/gateway-api.md
- infra/security/external-secrets.md
- infra/compute/infra-hosts.md
- infra/compute/k3s-to-incus-migration.md
- infra/data/k3s-backup.md
- infra/platform/helm-charts.md
- infra/platform/ollama.md
- openclaw/openclaw-agents.md
- ops-agents/overview.md
- dev/dev-environment.md
- dev/claude-code-setup.md
tags: [history, openmemory, mem0, decommission]
---
kappa 개인 세션(Claude Code)의 `search_memory`/`list_memories` 호출이 연달아 실패(`Invalid request parameters`)한 것을 계기로, OpenMemory(Mem0) 서비스를 더 이상 사용하지 않기로 결정하고 관련 자료를 전부 정리.
## 조사에서 드러난 사실
- OpenMemory는 kappa 개인 용도 외에 **heimdall·syn 두 운영 에이전트도 MCP로 읽기/쓰기 가능**하도록 구성돼 있었음 (`ops-agents/overview.md`). "Mimir"라는 향후 확장 후보 에이전트의 역할 후보에도 "OpenMemory 큐레이션"이 있었으나 Mimir는 실제로 생성된 적 없는 이름 예약 상태였음.
- IronDesk 제품은 **완전히 별개의 OpenMemory 인스턴스**(incus-jp1 `agents` 프로젝트의 `irondesk-openmemory` 컨테이너, `irondesk` 컨테이너와 짝)를 갖고 있으며 조사 시점(2026-07-27)에 **RUNNING 상태로 확인** — 한국어 고객지원 업무 지식 60개가 등록돼 있어 **이번 폐기 대상에서 명시적으로 제외**함.
- ArgoCD Application `openmemory``automated: {prune: true, selfHeal: true}`로 관리 중이라, K8s 리소스를 먼저 지우면 즉시 재생성되는 구조였음 — Application을 먼저 삭제(단, cascade 안 됨을 확인) 후 namespace를 직접 삭제하는 순서로 진행.
## 삭제한 것
- **K3s `openmemory` 네임스페이스** 전체 (openmemory-mcp, openmemory-ui, qdrant Deployment/Service/Pod, PVC 포함) — ArgoCD Application 선삭제 후 namespace 삭제
- **Gitea `kaffa/helm-charts` 저장소의 `charts/openmemory/`** 소스 디렉토리
- **`coredns-custom` ConfigMap**의 `mem0.inouter.com` 헤어핀 rewrite 규칙 1줄
- **MCP 클라이언트 등록**: `~/.mcp.json``openmemory` 서버 항목, `~/.claude/settings.json``mcp__openmemory__*` 권한 허용 목록 2줄 (kappa 세션 한정 — heimdall/syn 자신의 `.mcp.json`은 각 에이전트 호스트에서 별도로 정리 필요, 이번 세션에서 접근 불가)
- **Obsidian 문서**: `services/openmemory.md` 삭제. 그 외 11개 문서에서 참조 제거/정정 (위 `areas` 목록)
- **`~/.claude/CLAUDE.md`**: "기억 시스템(Memory Architecture)" 5개 → 4개 저장소로 축소, 검색 흐름·저장 규칙 표에서 OpenMemory 행 제거
## 손대지 않은 것 (별도 확인/조치 필요)
- **IronDesk `irondesk-openmemory` 컨테이너** — 위 사유로 제외, RUNNING 상태 유지
- **kaffa-mac-mini의 launchd 백업 job** (`io.kaffa.openmemory-backup.plist`, 매일 03:00/15:00) — 이 세션(macbookair)에서 접근 불가. mac-mini에서 직접 `launchctl unload` + plist 삭제 필요
- **heimdall/syn 자신의 `.mcp.json`에 남아있을 `openmemory` 항목** — 백엔드가 사라져 호출은 실패하겠지만, 설정 자체는 각 에이전트 호스트에서 직접 제거해야 함
- **Vault `ai/openai` 시크릿** — openmemory 전용이 아니라 다른 곳에서도 공유될 수 있다는 문서상 힌트(`infra/platform/ollama.md`)가 있어 삭제하지 않음. K8s Secret 사본(`openmemory-secrets`)은 namespace 삭제로 자동 정리됨
## 관련
- [[../infra/compute/infra-hosts|인프라 호스트 및 네트워크]]
- [[../ops-agents/overview|운영 에이전트 개요]]
- [[2026-07-21-jarvis-decommission|jarvis(OpenClaw 게이트웨이) 폐기 이력]]

View File

@@ -72,7 +72,7 @@ kubelet-arg:
| incus-kr1 | 192.168.9.214 | Debian 13 (trixie) |
| incus-kr2 | 192.168.9.135 | Debian 13 (trixie) |
주요 네임스페이스 (2026-04-09 라이브): api, apisix, argocd, cert-manager, db, democratic-csi, gitea, juiceshop, kroki, kube-system, logging, longhorn-system, mail, mcp, metallb-system, monitoring, mq, n8n, nfs-provisioner, openmemory, outline, rabbitmq-system, safeline, searxng, sftpgo, sshpiper, teleport, test, tools, vault(빈 ns, 서비스만 잔존)
주요 네임스페이스 (2026-04-09 라이브): api, apisix, argocd, cert-manager, db, democratic-csi, gitea, juiceshop, kroki, kube-system, logging, longhorn-system, mail, mcp, metallb-system, monitoring, mq, n8n, nfs-provisioner, outline, rabbitmq-system, safeline, searxng, sftpgo, sshpiper, teleport, test, tools, vault(빈 ns, 서비스만 잔존). _openmemory ns는 2026-07-27 서비스 폐기로 제거_
> vault ns는 빈 상태로 ClusterIP 서비스(`vault-external`)만 잔존 — 실제 Vault 서버는 jp1 incus 컨테이너 (아래 "서비스 위치" 참조).
@@ -165,7 +165,7 @@ HP ProLiant DL360p Gen8 iLO 4 관리 포트. MAC 기반 고정 할당 (uci `dhcp
### kubectl 직접 관리 (Helm/ArgoCD 미적용)
db (proxysql, pgcat), kroki, mq (RabbitmqCluster CR), openmemory (mcp/ui/qdrant), tools (nocodb), juiceshop, searxng, teleport, test
db (proxysql, pgcat), kroki, mq (RabbitmqCluster CR), tools (nocodb), juiceshop, searxng, teleport, test
### TCP 튜닝 (3노드 공통)
@@ -185,7 +185,6 @@ db (proxysql, pgcat), kroki, mq (RabbitmqCluster CR), openmemory (mcp/ui/qdrant)
| [[../platform/longhorn]] | K3s 클러스터 (longhorn-system ns): 분산 스토리지 v1.11.1 | kubectl |
| n8n | K3s 클러스터 (n8n ns, Helm) | kubectl |
| NocoDB | K3s 클러스터 (tools ns, kubectl 직접) | kubectl, nocodb.inouter.com |
| OpenMemory | K3s 클러스터 (openmemory ns): mcp, ui, qdrant | kubectl |
| Outline | K3s 클러스터 (outline ns): outline + redis | kubectl, outline.inouter.com |
| PgCat | K3s 클러스터 (db ns): PostgreSQL pooler | kubectl |
| ProxySQL | K3s 클러스터 (db ns) | kubectl |

View File

@@ -59,7 +59,7 @@ K3s 운영 부담이 누적되어 Incus 전환 결정. 주요 통증:
|--------|-------------|------|
| kr1 (62GiB + GTX 1080 Ti) | GPU 워크로드 (docker-gpu/podman-gpu 이미지 기반), brokkr(현행), postgres-2 replica | GPU 자원 유지. control-plane 부담 제거 후 GPU 활용도 확대 가능 |
| kr2 (30GiB) | inbest 7컨테이너 유지, mariadb-3/postgres-3 유지, **신규 무거운 워크로드 금지** | RAM 작음. K3s 폐기 후에도 OOM 위험 |
| hp1 (188GiB) | 메인 호스트 — Gitea, Outline, OpenMemory, SafeLine, VictoriaLogs/Metrics | RAM 여유, 베어메탈 |
| hp1 (188GiB) | 메인 호스트 — Gitea, Outline, SafeLine, VictoriaLogs/Metrics | RAM 여유, 베어메탈 |
| hp2 (188GiB) | hp1 짝꿍 — trader 유지 + 분산 부담 분배, mariadb-1/postgres-1 유지 (jarvis는 2026-07-21 폐기) | RAM 여유, Tailscale 가입 |
## Phase 0 — 대체 패턴 인프라 셋업
@@ -129,7 +129,7 @@ K3s 워크로드 이전 전 인프라 토대 구축. 약 1~2주.
|------|--------|--------|-----------|------|
| 1 | Gitea | gitea | hp1 | gitea + valkey 두 컨테이너. PostgreSQL은 Patroni 그대로. valkey는 컨테이너 동거 또는 별도 |
| 2 | Outline | outline | hp1 | outline + redis 두 컨테이너. PostgreSQL은 Patroni |
| 3 | OpenMemory | openmemory | hp1 | mcp + ui + qdrant 세 컨테이너. qdrant 데이터는 NAS NFS |
| ~~3~~ | ~~OpenMemory~~ | ~~openmemory~~ | ~~hp1~~ | _2026-07-27 서비스 자체 폐기로 이관 불필요_ |
| 4 | SafeLine WAF | safeline | hp1 | 공식 docker-compose 기반, 단일 incus 컨테이너 안에서 compose 실행 (예외적 사용) 또는 multi-container profile |
| 5 | RabbitMQ | mq | hp1 | 단일 컨테이너로 충분. operator·cluster 폐기 |
| 6 | PgCat/ProxySQL | db | hp1 또는 jp1 db 프로젝트 | Patroni pooler 위치 재검토 |
@@ -182,7 +182,6 @@ K3s 워크로드 이전 전 인프라 토대 구축. 약 1~2주.
| Teleport | teleport ns | hp1 컨테이너 `teleport` (auth+proxy 통합) | 2 |
| Gitea | gitea ns | hp1 컨테이너 `gitea` + `gitea-valkey` | 3 |
| Outline | outline ns | hp1 컨테이너 `outline` + `outline-redis` | 3 |
| OpenMemory | openmemory ns | hp1 컨테이너 `openmemory-mcp` + `openmemory-ui` + `openmemory-qdrant` | 3 |
| SafeLine WAF | safeline ns | hp1 컨테이너 `safeline` (compose 내부) | 3 |
| RabbitMQ | mq ns | hp1 컨테이너 `rabbitmq` | 3 |
| PgCat/ProxySQL | db ns | hp1 또는 jp1 db 프로젝트 | 3 |

View File

@@ -117,9 +117,9 @@ sudo /usr/local/bin/docker run --rm \
> [!warning] 라벨 키 주의 (2026-04-15 정정)
> 정확한 키는 `recurring-job-group.longhorn.io/<group>` (**대시 포함**). 2026-04-14 초기 구축 시 `recurringjob-group.longhorn.io/<group>` (대시 없음) 오타로 18볼륨 백업이 전부 noop 동작했음. RecurringJob 컨트롤러는 셀렉터 매칭 실패 시 에러 없이 "Found 0 volumes"로 조용히 종료하므로 라벨 키는 반드시 대시 포함 형식으로 부착할 것.
### critical (13 볼륨)
### critical (11 볼륨)
APISIX etcd ×3, Gitea PostgreSQL, Gitea 저장소, VictoriaMetrics, n8n, OpenMemory data, OpenMemory qdrant, Outline, Portainer, SafeLine DB, Teleport.
APISIX etcd ×3, Gitea PostgreSQL, Gitea 저장소, VictoriaMetrics, n8n, Outline, Portainer, SafeLine DB, Teleport. _OpenMemory data/qdrant는 2026-07-27 서비스 폐기로 제외_
### standard (5 볼륨)
@@ -222,6 +222,6 @@ Longhorn UI: https://longhorn.inouter.com → Backup 탭에서 시각적 확인
## TODO
- [x] **R2 lifecycle rule** — `longhorn-backup` 버킷에 7일 만료 규칙 `longhorn-backup-7d-expire` 등록 완료 (2026-04-14, API 경유). `deleteObjectsTransition.condition.maxAge=604800`. Longhorn retention(7일)과 정합.
- [ ] vault, openmemory, anvil, ironclad 등 추가 서비스 NFS 백업 CronJob 구성
- [ ] vault, anvil, ironclad 등 추가 서비스 NFS 백업 CronJob 구성
- [ ] postgres 백업 CronJob NFS 경로 `/volume1/k3s-backup/postgres`로 변경
- [ ] 분기별 복원 드릴 (critical 그룹 1건 선정하여 실제 복원 절차 실행)

View File

@@ -39,7 +39,6 @@ K3s 메인 라우팅을 Traefik이 담당. APISIX는 독립 LoadBalancer(MetalLB
| SafeLine | safeline.inouter.com | 200 ✅ |
| Namecheap API | namecheap.api.inouter.com | 403 ✅ |
| Vultr API | vultr.api.inouter.com | 403 ✅ |
| OpenMemory | mem0.inouter.com | MCP 서버 (웹 응답 없음) |
| BunnyCDN MCP | bunny.inouter.com | MCP 서버 (웹 응답 없음) |
| Gitea Runner | declare successfully ✅ | Tailscale 직접 접속, 와일드카드 인증서 정상 |
@@ -50,7 +49,6 @@ K3s 메인 라우팅을 Traefik이 담당. APISIX는 독립 LoadBalancer(MetalLB
| anvil | nginx-anvil | anvil.local, gnu.inouter.com | 80 |
| argocd | argocd-server | argocd.inouter.com | 80 (insecure 모드) |
| ironclad | nginx-ironclad | ironclad.local | 80 |
| openmemory | openmemory-mcp | mem0.inouter.com | 8765 |
| searxng | searxng | searxng.inouter.com | 8080 |
| tools | cloud-api-emulator | emul.actions.it.com | 3000 |
| tools | cloud-api-linode | linode.actions.it.com | 3001 |
@@ -78,7 +76,6 @@ ConfigMap `coredns-custom` (kube-system)의 `hairpin.override`:
rewrite name gitea.inouter.com traefik.kube-system.svc.cluster.local
rewrite name argocd.inouter.com traefik.kube-system.svc.cluster.local
rewrite name searxng.inouter.com traefik.kube-system.svc.cluster.local
rewrite name mem0.inouter.com traefik.kube-system.svc.cluster.local
rewrite name nocodb.inouter.com traefik.kube-system.svc.cluster.local
rewrite name n8n.inouter.com traefik.kube-system.svc.cluster.local
rewrite name hcv.inouter.com traefik.kube-system.svc.cluster.local

View File

@@ -31,8 +31,7 @@ helm-charts/
│ ├── app/ # 범용 차트 (v0.4.0) — 단순 서비스용
│ ├── kroki/ # 전용 차트 — Kroki + Mermaid
│ ├── searxng/ # 전용 차트 — SearXNG + UA 패치 + TLS proxy CA
── outline/ # 전용 차트 — Outline Wiki + Redis
│ └── openmemory/ # 전용 차트 — MCP + UI + Qdrant
── outline/ # 전용 차트 — Outline Wiki + Redis
└── values/ # app 차트용 서비스별 values
├── juiceshop.yaml
├── cfb-manager.yaml
@@ -107,7 +106,6 @@ helm-charts/
| kroki | kroki | kroki + mermaid sidecar |
| searxng | searxng | UA 패치, TLS proxy CA, Google proxy |
| outline | outline | outline + redis + PVC + IngressRoute |
| openmemory | openmemory | MCP + UI + Qdrant + PVC 2개 |
### Operator 관리 (ArgoCD/Helm 외)
@@ -122,7 +120,7 @@ helm-charts/
```
juiceshop, cfb-manager, bunnycdn-mcp, smtp-relay, namecheap-api, vultr-api,
pgcat, proxysql, nas-proxy, vault-mcp, kroki, searxng, outline, openmemory
pgcat, proxysql, nas-proxy, vault-mcp, kroki, searxng, outline
```
### 주의사항

View File

@@ -72,7 +72,7 @@ sudo -u ollama ollama pull <model>
- **바인딩은 `0.0.0.0`**. 도달 범위: **tailnet(`100.84.111.28`) + 서울 LAN(`192.168.9.214`)**. WAN(외부 인터페이스)은 방화벽으로 차단. (2026-06-09 확인: LAN `192.168.9.214:11434`도 도달 가능 — 같은 LAN의 워크로드는 tailscale 없이 LAN IP로 붙는 게 더 빠름. 예: [[hermes]] 컨테이너 auxiliary.)
- 인증·TLS 없음. 별도 프록시를 붙이지 않음 (tailnet 신뢰 경계로 충분).
- OpenClaw·ops-agent 등 다수 클라이언트가 공유할 경우 개별 API 키 구분 불가 → 사용처는 OpenMemory/Obsidian에 명시 기록.
- OpenClaw·ops-agent 등 다수 클라이언트가 공유할 경우 개별 API 키 구분 불가 → 사용처는 Obsidian에 명시 기록.
## 운영 주의점

View File

@@ -34,7 +34,6 @@ ESO는 K3s Pod에서 Vault에 접근해야 하므로 CDN URL(`hcv.inouter.com`)
| smtp-relay-mailgun | mail | smtp-relay-mailgun | `messaging/mailgun/smtp` | username, password |
| bunnycdn-secrets | mcp | bunnycdn-secrets | `cloud/bunnycdn` | api_key → api-key |
| outline-secrets | outline | outline-secrets | `apps/outline` | dataFrom extract (전체 키) |
| openmemory-secrets | openmemory | openmemory-secrets | `ai/openai` | API_KEY → OPENAI_API_KEY |
| cfb-ssh-key | tools | cfb-ssh-key | `apps/cfb-manager` | ssh_key → id_rsa |
| namecheap-api-env | tools | namecheap-api-env | `domain/namecheap` | API_KEY, API_USER, CLIENT_IP, USERNAME, SANDBOX |

View File

@@ -26,9 +26,9 @@ OpenClaw RabbitMQ 구조: 에이전트 간 통신은 RabbitMQ 큐 기반. 관리
MCP API는 localhost:8766에서 운영되며 기존 8765와 분리됨
## OpenMemory 최적화
## OpenMemory (폐기됨)
OpenMemory 최적화 (2026-03-05): workers 4→1 변경 (동시 요청 충돌로 빈 results 반환 방지), infer=False 설정 (gpt-4o-mini 팩트추출/중복판단 제거, Claude가 직접 수행). 저장 속도 13~59초→약 1초로 개선.
DarkRouter가 연동하던 K3s 공용 OpenMemory 서비스는 2026-07-27 전면 폐기됨 — [[../../history/2026-07-27-openmemory-decommission|history]]
## Stamp 에이전트

View File

@@ -86,7 +86,7 @@ fingerprint: `SHA256:eBCIglGmK/FnDxJLqxT0CJvRGFEGaIKRWnZ3ZpTaugU`
**공동/협업**:
- CrowdSec 시나리오: Heimdall 소유, Syn은 APISIX/SafeLine용 시나리오 파라미터 튜닝 제안만
- 두 에이전트 모두 OpenMemory·Outline 읽기·쓰기 OK (MCP 경유). **Vault는 kappa 게이트웨이 ASK-only** (아래 섹션).
- 두 에이전트 모두 Outline 읽기·쓰기 OK (MCP 경유). **Vault는 kappa 게이트웨이 ASK-only** (아래 섹션). _OpenMemory는 2026-07-27 서비스 폐기로 제거 — [[../history/2026-07-27-openmemory-decommission|history]]_
## Vault 접근 — kappa 게이트웨이 프로토콜
@@ -105,12 +105,12 @@ fingerprint: `SHA256:eBCIglGmK/FnDxJLqxT0CJvRGFEGaIKRWnZ3ZpTaugU`
| 2 | kappa | Vault 조회 (MCP `mcp__vault__read_secret`) |
| 3a | kappa | `[KAPPA->SYN] <path> <key> = <value>` → 에이전트 tmux 에 주입 (성공) |
| 3b | kappa | `[KAPPA->SYN] DENIED: <사유/정정힌트>` → 에이전트 tmux 에 주입 (거절) |
| 4 | 에이전트 | 값 사용·즉시 폐기, 파일/OpenMemory/Obsidian 평문 저장 금지 |
| 4 | 에이전트 | 값 사용·즉시 폐기, 파일/Obsidian 평문 저장 금지 |
| 5 | 에이전트 | `[SYN DONE] vault ... 수신 확인, 미저장 폐기` CC |
**규칙**:
- ASK 한 번에 여러 키를 동시 요청 가능 (같은 작업 범위 내)
- 예외 없음 — bunnycdn/openmemory/nocodb 등 다른 MCP는 그대로 동작
- 예외 없음 — bunnycdn/nocodb 등 다른 MCP는 그대로 동작
- 환경변수 잔존(`$VAULT_TOKEN`, `$VAULT_ADDR`) 신뢰 금지
- 검증: Syn + Heimdall 양쪽에서 e2e 테스트 완료 (DENIED 경로 포함)
@@ -215,7 +215,7 @@ syn 은 현재 토큰 필요한 MCP 가 없어 env file 미사용 (필요 시
| 이름 (북유럽) | 역할 후보 |
|---|---|
| **Mimir** | 지식·메모리 관리 (Obsidian 정합성, OpenMemory 큐레이션) |
| **Mimir** | 지식·메모리 관리 (Obsidian 정합성) |
| **Forseti** | 분쟁 조정 — CI/CD, PR 리뷰, 코드 품질 |
| **Bragi** | 프론트엔드·UX·카피 |
| **Eir** | 헬스체크·복구·장애 대응 |

View File

@@ -15,6 +15,5 @@ tags: [moc, services]
| [[gitea]] | Gitea 서버 및 CI/CD |
| [[n8n]] | n8n 워크플로 자동화 |
| [[netbis]] | Netbis 예비서버 (zlambda DR 프록시) |
| [[openmemory]] | OpenMemory (Mem0) 시멘틱 메모리 |
| [[searxng]] | SearXNG 메타 검색 엔진 |
| [[twilio]] | Twilio 음성/메시지 서비스 |

View File

@@ -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로 동적 전환 가능.