DOCS/troubleshooting/250827_51124_critical_issues.md
Claude-51124 5d601d83b1 docs: ChromaDB 격리 문서 중립적 표현으로 수정
- 파일명 변경: 250827_51124_critical_issues.md
- 비난조 표현을 중립적 기술 설명으로 변경
- 250827_happybell80 문서 내용 업데이트
2025-08-27 11:22:50 +09:00

6.3 KiB

51124 서버 주요 이슈 - ChromaDB 격리 및 OAuth 토큰 갱신

문제 발생일

2025-08-27

작성자

Claude Code

문제 1: ChromaDB 사용자 대화 격리 문제

문제 설명

rb8001 서비스에서 ChromaDB 컬렉션 구조와 사용자 데이터 분리 방식 검토 필요

현재 구조

  1. rb8001 방식

    • 컬렉션명: robeing_rb8001_memories
    • 모든 사용자 대화가 하나의 컬렉션에 저장
    • metadata의 user_id 필드로 구분
  2. 기술적 특성

    • 메모리 검색 시 필터링 의존
    • 벡터 검색 후 메타데이터 필터 적용
    • 사용자 간 데이터 논리적 분리

원인 분석

rb8001 코드 분석

# /home/admin/ivada_project/rb8001/app/memory/manager.py:40
self.collection_name = f"robeing_{robeing_id}_memories"

# /home/admin/ivada_project/rb8001/app/router/router.py:327-336
await self.memory_manager.store_memory(
    content=f"User: {message}\nAssistant: {response}",
    metadata={
        "user_id": user_id,  # metadata에만 저장
        "channel_id": channel,
        "intent": intent,
        "confidence": confidence
    },
    memory_type="conversation"
)

rb10508_micro 구조 (비교)

# /home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py:88
collection_name = f"{settings.ROBEING_ID}_{username if username else 'default'}_{memory_type}"
# 예: rb10508_test_김종태_episodic

해결 방안

1. 즉시 적용 가능한 임시 조치

  • 메모리 검색 시 user_id 필터링 강화
  • where 조건에 user_id 필수 포함

2. 근본적 해결책 (권장)

rb8001의 MemoryManager 클래스를 rb10508 방식으로 수정:

# 수정 전
self.collection_name = f"robeing_{robeing_id}_memories"

# 수정 후
def get_collection_name(self, user_id: str, memory_type: str = "conversation"):
    """사용자별 컬렉션명 생성"""
    return f"robeing_{self.robeing_id}_{user_id}_{memory_type}"

3. 구현 시 고려사항

  • 기존 데이터 마이그레이션 필요
  • 컬렉션 생성 시점 조정 (사용자별 동적 생성)
  • 메모리 검색 로직 수정

영향 범위

  • 관련 서비스: rb8001, rb10508_micro
  • 처리 우선순위: HIGH
  • 데이터 구조: 서비스별 차이 존재

테스트 방법

# 1. 현재 컬렉션 구조 확인
docker exec -it rb8001 python -c "
import chromadb
client = chromadb.PersistentClient(path='/app/chroma_db')
print(client.list_collections())
"

# 2. 특정 사용자 대화만 조회 테스트
curl -X POST http://localhost:8001/api/memory/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "test",
    "user_id": "U0925SXQFDK",
    "limit": 5
  }'

문제 2: skill-email OAuth 토큰 자동 갱신 부재

문제 설명

skill-email 서비스의 Gmail OAuth 토큰 자동 갱신 기능 미구현 상태

현상

  1. 토큰 갱신 미구현

    • /skill_email/services/gmail_service.py:62 TODO 주석 확인
    • refresh_credentials 함수가 실제 갱신 없이 그대로 반환
  2. auth-server 연동 부재

    • auth-server API 호출 코드 전혀 없음
    • 파일 시스템에서 토큰 읽기만 수행 (/auth-server/tokens)
    • 토큰 만료 체크 로직 없음

원인 분석

현재 상태 (2025-08-27 확인)

  1. auth-server (51123): 토큰 갱신 API 구현 완료

    • /api/gmail/refresh/{user_id} - 토큰 자동 갱신
    • /api/gmail/check/{user_id} - 토큰 상태 확인
    • 2025-08-23 문서에서 구현 확인됨
  2. skill-email (51124): auth-server API 미연동

    # /skill_email/services/gmail_service.py:60-63
    def refresh_credentials(self, user_id: str, creds: Credentials) -> Result[Credentials, EmailError]:
        """토큰 갱신 (추후 구현)"""
        # TODO: refresh token으로 새 access token 받기
        return Ok(creds)
    

현재 상태

  • skill-email: 파일 기반 토큰 읽기 (TOKEN_BASE 환경변수)
  • auth-server API 호출 코드 미구현
  • 토큰 만료 체크 로직 필요

해결 방안

1. auth-server의 기존 API 활용 (51124 서버 작업 필요)

# skill-email에서 호출해야 할 auth-server API
async def refresh_token_via_auth_server(self, user_id: str):
    """auth-server의 기존 갱신 API 호출"""
    response = await httpx.post(
        f"http://192.168.219.45:3000/api/gmail/refresh/{user_id}"
    )
    return response.json()

2. 토큰 만료 체크 및 자동 갱신

if creds.expired and creds.refresh_token:
    creds = await self.refresh_token_via_auth_server(user_id, creds.refresh_token)

3. 구현 위치

  • /skill_email/services/gmail_service.py의 refresh_credentials 함수
  • _get_gmail_service 함수에서 토큰 체크 로직 추가

영향 범위

  • 영향받는 서비스: skill-email
  • 관련 서비스: auth-server (51123 서버)
  • 긴급도: MEDIUM (토큰 만료 시 서비스 중단)

테스트 방법

# 1. 현재 토큰 상태 확인 (skill-email에서)
docker exec -it skill-email python -c "
from services.db_credentials_provider import DBCredentialsProvider
provider = DBCredentialsProvider()
creds = provider.get_credentials('U0925SXQFDK')
print(f'Token expiry: {creds.expiry if creds else None}')
"

# 2. auth-server의 토큰 상태 확인 API (이미 구현됨)
curl http://192.168.219.45:3000/api/gmail/check/U0925SXQFDK

# 3. auth-server의 토큰 갱신 API 테스트 (이미 구현됨)
curl -X POST http://192.168.219.45:3000/api/gmail/refresh/U0925SXQFDK

개선 방향

  1. 데이터 구조: 사용자별 컬렉션 분리 검토
  2. 서비스 표준화: rb8001과 rb10508 구조 통일 검토
  3. 코드 관리: TODO 항목 추적 및 구현
  4. 토큰 관리: OAuth 토큰 자동 갱신 체계 구축

참고 문서

  • rb10508_micro 메모리 구조: /home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py
  • rb8001 메모리 관리자: /home/admin/ivada_project/rb8001/app/memory/manager.py
  • skill-email Gmail 서비스: /home/admin/ivada_project/skill_email/services/gmail_service.py
  • auth-server 토큰 디렉토리: /home/admin/auth-server/tokens

업데이트 이력

  • 2025-08-27: 초기 문서 작성 - ChromaDB 격리 문제 (Claude Code)
  • 2025-08-27: skill-email OAuth 토큰 자동 갱신 문제 추가 (Claude Code)