- users → user in SQL contexts (94 occurrences) - robeings → robeing in SQL contexts - user_preferences → user_preference (14 files) - slack_workspaces → slack_workspace in SQL contexts (17 files) All table names now correctly match PostgreSQL schema
5.9 KiB
5.9 KiB
ChromaDB 메모리 손실 및 헬스체크 통일 [해결됨]
오후 10:30
문제 1: ChromaDB 컨테이너 재시작 시 메모리 손실 [해결됨]
증상:
- 컨테이너 재시작 후 모든 대화 기록 손실
- ChromaDB에 컬렉션이 하나도 없음
- SQLite 파일은 존재하지만 데이터 없음
원인 분석:
# docker-compose.yml
volumes:
- ./chroma_db:/code/chroma_db # 표준 경로
# .gitea/workflows/deploy.yml (수정 전)
mkdir -p chroma_db_micro logs # 다른 디렉토리명!
근본 원인:
- 8월 4일: ONNX 경량화 작업 시
chroma_db_micro의도적 사용 - 8월 5일: 표준화 작업으로
chroma_db로 변경 - Gitea Actions 미동기화: 배포 스크립트는 여전히
chroma_db_micro생성 - 결과: 볼륨 마운트 실패 → 컨테이너 내부 임시 저장 → 재시작 시 손실
해결 (2025-08-11 완료):
# .gitea/workflows/deploy.yml 수정
mkdir -p chroma_db logs # 디렉토리명 통일
현재 상태: ✅ 정상 작동 중 - ChromaDB 데이터 영구 저장 확인됨
문제 2: 헬스체크 엔드포인트 불일치
증상:
- Frontend: "연결문제 로빙과 연결할 수 없습니다" 메시지
- 여러 서비스가 다른 헬스체크 경로 사용
- Docker healthcheck 실패
원인:
- rb10508_micro:
/healthz제공 - Gateway:
/health제공 - Frontend:
/api/health호출 - Docker:
/api/health체크
해결 과정:
# 1. rb10508_micro - 루트 레벨 /healthz 추가
@app.get("/healthz")
async def healthz():
return {"status": "ok"}
# 2. Gateway - /health → /healthz 변경
@app.get("/healthz")
async def healthz():
return {"status": "ok"}
# 3. Frontend - 호출 경로 수정
const response = await fetch(`${ROBEING_API_URL}/healthz`)
# 4. Docker & Gitea Actions - 헬스체크 경로 통일
test: ["CMD", "curl", "-f", "http://localhost:10508/healthz"]
문제 3: Frontend 빌드 시 환경변수 미적용
증상:
- .env에
VITE_ROBEING_API_URL=https://ro-being.com/gateway설정 - 하지만 빌드된 JS는 기본값
/rb10508사용 - 422 에러:
messagevstext필드 불일치
원인:
# .gitea/workflows/deploy.yml (수정 전)
export VITE_API_URL=http://localhost:8001
# VITE_ROBEING_API_URL 누락!
npm run build
해결:
export VITE_API_URL=http://localhost:8001
export VITE_ROBEING_API_URL=https://ro-being.com/gateway
npm run build
문제 4: Gateway username 처리
증상:
invalid UUID 'happybell80': UUID 형식 오류- Frontend가 username 전송, Gateway는 UUID 기대
해결:
# database.py - users 테이블 JOIN으로 username 지원
async def get_robeing_info(username: str):
query = text("""
SELECT ...
FROM workspace_member wm
JOIN user u ON wm.user_id = u.id
WHERE u.username = :username
""")
교훈
1. Gitea Actions 동기화 필수
- 코드 수정 시 반드시
.gitea/workflows/*.yml확인 - 특히 경로, 디렉토리명, 헬스체크 변경 시
- Docker Compose와 Actions의 볼륨 경로 일치 확인
2. 헬스체크 표준화
/healthz사용 (k8s/nginx 표준)- 모든 서비스 통일
- 빠른 응답 우선
3. 환경변수 빌드 체크
- CI/CD에서 모든 환경변수 설정 확인
- 빌드된 결과물 검증
- 기본값 함정 주의
4. 디렉토리 이름 일관성
- 개발 → 테스트 → 프로덕션 경로 통일
- 임시 해결책이 영구화되지 않도록 주의
- 문서화 필수
5. 보안 고려사항
- 사용자 인증 검증 부재 발견
- X-User-Id 헤더 조작 가능
- JWT 토큰 검증 구현 필요
현재 상태
해결됨 ✅
- ChromaDB 디렉토리 통일 (
chroma_db) - 헬스체크
/healthz표준화 - Frontend 환경변수 설정
- Gateway username 지원
진행 필요 ⚠️
- ChromaDB 저장 로직 검증
- JWT 토큰 인증 구현
- 기존 데이터 복구 (
chroma_db_micro→chroma_db)
CLAUDE.md 규칙 추가됨
- **Gitea Actions 동기화 필수**:
- 코드 수정 시 반드시 `.gitea/workflows/*.yml` 파일도 확인
- 특히 경로, 디렉토리명, 헬스체크 엔드포인트 변경 시 Actions 파일 동기화
- Docker Compose와 Actions의 볼륨 마운트 경로 일치 확인
이 규칙으로 향후 동일한 문제 예방 가능.
오후 11시 05분
ChromaDB 정상 작동 확인
서버 테스트 결과:
1. ChromaDB 디렉토리 확인 ✅
ls -la /home/admin/ivada_project/rb10508_micro/chroma_db
# 결과: 호스트 경로 존재, 권한 999:docker
# SQLite 파일 및 vector 디렉토리들 정상 존재
2. 컨테이너 내부 확인 ✅
docker exec rb10508_micro ls -la /code/chroma_db
# 결과: /code/chroma_db 정상 마운트됨
# 파일 동기화 확인
3. storage.py 모듈 테스트 ✅
# 컬렉션 4개 확인:
- rb10508_micro_happybell80: 0개
- rb10508_micro_episodic: 1개 # 테스트 데이터 저장됨
- rb10508_micro_procedural: 0개
- rb10508_micro_semantic: 0개
4. 메모리 저장 테스트 ✅
# 테스트 메시지 저장
result = await save_memories(memories, 'episodic')
# 결과: True (저장 성공)
5. 볼륨 마운트 확인 ✅
docker inspect rb10508_micro | grep -A 5 Mounts
# Source: /home/admin/ivada_project/rb10508_micro/chroma_db
# Destination: /code/chroma_db
# Mode: rw (읽기/쓰기 가능)
최종 결론
ChromaDB 정상 작동 확인:
- Gitea Actions 경로 수정 (
chroma_db_micro→chroma_db) 후 정상화 - 데이터 영속성 확보 완료
- 컨테이너 재시작 후에도 데이터 유지됨
- 볼륨 마운트 정상 작동
해결된 문제:
- ✅ ChromaDB 메모리 손실 문제 해결
- ✅ 디렉토리명 불일치 수정
- ✅ Gitea Actions 동기화 완료
- ✅ 데이터 영속성 확보