diff --git a/dev/claude-code-setup.md b/dev/claude-code-setup.md index a0a5e5e..c1707de 100644 --- a/dev/claude-code-setup.md +++ b/dev/claude-code-setup.md @@ -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에 요약 ## 주의사항 diff --git a/dev/dev-environment.md b/dev/dev-environment.md index 2bab7b7..67c4782 100644 --- a/dev/dev-environment.md +++ b/dev/dev-environment.md @@ -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 삭제 필요 diff --git a/history/2026-07-27-openmemory-decommission.md b/history/2026-07-27-openmemory-decommission.md new file mode 100644 index 0000000..8bc5170 --- /dev/null +++ b/history/2026-07-27-openmemory-decommission.md @@ -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 게이트웨이) 폐기 이력]] diff --git a/infra/compute/infra-hosts.md b/infra/compute/infra-hosts.md index 4459a37..8dd1279 100644 --- a/infra/compute/infra-hosts.md +++ b/infra/compute/infra-hosts.md @@ -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 | diff --git a/infra/compute/k3s-to-incus-migration.md b/infra/compute/k3s-to-incus-migration.md index 9684ee0..31524f7 100644 --- a/infra/compute/k3s-to-incus-migration.md +++ b/infra/compute/k3s-to-incus-migration.md @@ -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 | diff --git a/infra/data/k3s-backup.md b/infra/data/k3s-backup.md index 61569c9..b6bf62c 100644 --- a/infra/data/k3s-backup.md +++ b/infra/data/k3s-backup.md @@ -117,9 +117,9 @@ sudo /usr/local/bin/docker run --rm \ > [!warning] 라벨 키 주의 (2026-04-15 정정) > 정확한 키는 `recurring-job-group.longhorn.io/` (**대시 포함**). 2026-04-14 초기 구축 시 `recurringjob-group.longhorn.io/` (대시 없음) 오타로 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건 선정하여 실제 복원 절차 실행) diff --git a/infra/network/gateway-api.md b/infra/network/gateway-api.md index 8e67e99..3c225f4 100644 --- a/infra/network/gateway-api.md +++ b/infra/network/gateway-api.md @@ -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 diff --git a/infra/platform/helm-charts.md b/infra/platform/helm-charts.md index d122032..6796162 100644 --- a/infra/platform/helm-charts.md +++ b/infra/platform/helm-charts.md @@ -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 ``` ### 주의사항 diff --git a/infra/platform/ollama.md b/infra/platform/ollama.md index 8adadb3..fb34ade 100644 --- a/infra/platform/ollama.md +++ b/infra/platform/ollama.md @@ -72,7 +72,7 @@ sudo -u ollama ollama pull - **바인딩은 `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에 명시 기록. ## 운영 주의점 diff --git a/infra/security/external-secrets.md b/infra/security/external-secrets.md index 2d76120..3424e5a 100644 --- a/infra/security/external-secrets.md +++ b/infra/security/external-secrets.md @@ -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 | diff --git a/openclaw/openclaw-agents.md b/openclaw/openclaw-agents.md index 985bb69..c176b1e 100644 --- a/openclaw/openclaw-agents.md +++ b/openclaw/openclaw-agents.md @@ -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 에이전트 diff --git a/ops-agents/overview.md b/ops-agents/overview.md index 835d8d2..d0d32bd 100644 --- a/ops-agents/overview.md +++ b/ops-agents/overview.md @@ -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] = ` → 에이전트 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** | 헬스체크·복구·장애 대응 | diff --git a/services/_index.md b/services/_index.md index 3c4b64c..4e0a106 100644 --- a/services/_index.md +++ b/services/_index.md @@ -15,6 +15,5 @@ tags: [moc, services] | [[gitea]] | Gitea 서버 및 CI/CD | | [[n8n]] | n8n 워크플로 자동화 | | [[netbis]] | Netbis 예비서버 (zlambda DR 프록시) | -| [[openmemory]] | OpenMemory (Mem0) 시멘틱 메모리 | | [[searxng]] | SearXNG 메타 검색 엔진 | | [[twilio]] | Twilio 음성/메시지 서비스 | diff --git a/services/openmemory.md b/services/openmemory.md deleted file mode 100644 index 01ec81b..0000000 --- a/services/openmemory.md +++ /dev/null @@ -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//sse/ --client -``` - -지원 클라이언트: 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로 동적 전환 가능.