# Robeing Monitor 통합 작업 문서 ## 작업 완료 사항 (2025-08-20) ### 1. UUID 변환 기능 구현 - **문제**: Slack User ID (예: U091UNVE41M)와 PostgreSQL의 UUID 형식 불일치로 인한 데이터베이스 조회 실패 - **해결**: 모든 서비스에 일관된 UUID 변환 로직 적용 ```python namespace = uuid.UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8') user_uuid = str(uuid.uuid5(namespace, slack_id)) ``` #### 수정된 파일들: - `/home/heejae/robeing-monitor/app/api/items.py` - UUID 변환 헬퍼 함수 추가 - `/home/heejae/rb8001/app/skills/email_integration.py` - UUID 변환 적용 - `/home/heejae/skill-email/services/db_credentials_provider.py` - UUID 변환 적용 ### 2. Robeing Monitor API 확장 - **새 엔드포인트**: `/api/items/gmail/{user_id}/token` - skill-email이 Gmail 토큰 데이터를 가져올 수 있도록 지원 - Slack ID를 자동으로 UUID로 변환 - scopes를 JSON 배열로 파싱하여 반환 ### 3. Skill-Email API Provider 구현 - **새 파일**: `/home/heejae/skill-email/services/api_credentials_provider.py` - robeing-monitor API를 통해 Gmail 자격증명을 가져오는 Provider - 기존 DB 직접 연결 방식을 API 호출로 대체 - Result 타입 시스템과 호환되도록 구현 ### 4. 환경 설정 변경 - **skill-email/docker-compose.yml**: ```yaml environment: - TOKEN_PROVIDER=api - ROBEING_MONITOR_URL=http://localhost:9024 ``` - **robeing-monitor/.env**: ``` DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db ``` ## 현재 아키텍처 ``` [rb8001] ─────> [skill-email] ─────> [robeing-monitor] ─────> [PostgreSQL] │ │ │ │ │ │ │ │ └─ Slack ID ──────┴───── API 호출 ────────┴─── UUID 변환 ───────┘ ``` ### 데이터 흐름: 1. rb8001이 Slack User ID로 skill-email 호출 2. skill-email이 robeing-monitor API 호출 (Slack ID 전달) 3. robeing-monitor가 Slack ID를 UUID로 변환 4. PostgreSQL에서 데이터 조회 후 반환 ## 해결된 문제들 1. **UUID 타입 에러**: "invalid input syntax for type uuid: 'U091UNVE41M'" - 모든 서비스에서 일관된 UUID 변환 적용으로 해결 2. **데이터베이스 연결 문제**: - SSH 터널 설정 (localhost:5433 → 124.55.18.179:5432) - 올바른 데이터베이스 이름 사용 (main_db) 3. **Scopes 파싱 문제**: - PostgreSQL에 문자열로 저장된 scopes를 JSON 배열로 변환 ## 2025-08-28 레벨 표시 문제 해결 완료 ✅ ### 핵심 해결 - robeing-monitor의 state_service를 `/api` 경로에 마운트 - Gateway 모든 stats 요청 → robeing-monitor로 통합 - DB에 누락된 스탯 컬럼 추가 (memory, compute 등) - Frontend가 rb8001 레벨 20 정상 표시 ## 남은 작업 사항 ### 1. 토큰 갱신 메커니즘 - **현재 상태**: Gmail access token이 만료됨 - **필요 작업**: - OAuth 재인증 플로우 구현 - Refresh token을 사용한 자동 갱신 로직 - robeing-monitor에 토큰 업데이트 API 추가 ### 2. 에러 처리 개선 - **필요 작업**: - 토큰 만료 시 사용자에게 재인증 안내 - Slack에서 "죄송합니다" 대신 구체적인 오류 메시지 표시 - 재시도 로직 구현 ### 3. 모니터링 및 로깅 - **필요 작업**: - API 호출 성공/실패 메트릭 수집 - 토큰 만료 예측 및 사전 알림 - 감사 로그 (gmail_audit_logs 테이블) 활용 ### 4. 성능 최적화 - **고려 사항**: - API 호출 캐싱 - 연결 풀링 최적화 - 불필요한 UUID 변환 최소화 ## SSH 터널 및 PostgreSQL 접속 ### SSH 터널 설정 ```bash # SSH 터널 시작 sshpass -p "19800508" ssh -o StrictHostKeyChecking=no -f -N -L 5433:localhost:5432 admin@124.55.18.179 -p 51123 # 터널 확인 nc -zv localhost 5433 # 터널 프로세스 확인 pgrep -f "ssh.*5433:localhost:5432" ``` ### PostgreSQL 접속 ```bash # SSH를 통한 원격 실행 sshpass -p "19800508" ssh -o StrictHostKeyChecking=no admin@124.55.18.179 -p 51123 "PGPASSWORD=robeings psql -h localhost -U robeings -d main_db -c 'SELECT * FROM gmail_tokens'" # 로컬 터널을 통한 접속 (psql 클라이언트 필요) PGPASSWORD=robeings psql -h localhost -p 5433 -U robeings -d main_db ``` ### 주요 테이블 - `gmail_tokens`: Gmail OAuth 토큰 저장 - `gmail_audit_logs`: Gmail 작업 감사 로그 - `robeing_stats`: Robeing 레벨 정보 - `slack_user_mapping`: Slack-UUID 매핑 (현재 미사용) ## 테스트 명령어 ### Robeing Monitor API 테스트 ```bash # Gmail 아이템 조회 curl -s http://localhost:9024/api/items/gmail -H "X-User-Id: U091UNVE41M" | python3 -m json.tool # 토큰 데이터 조회 curl -s http://localhost:9024/api/items/gmail/U091UNVE41M/token -H "X-User-Id: U091UNVE41M" | python3 -m json.tool ``` ### Skill-Email 테스트 ```bash # 이메일 전송 테스트 curl -X POST http://localhost:8501/send \ -H "Content-Type: application/json" \ -d '{ "to": "test@example.com", "subject": "Test", "body": "Test email", "user_id": "U091UNVE41M" }' ``` ## Docker 관리 ### Robeing Monitor ```bash cd /home/heejae/robeing-monitor docker compose down && docker compose up -d --build docker logs robeing_monitor --tail 50 ``` ### Skill-Email ```bash cd /home/heejae/skill-email docker compose down && docker compose up -d --build docker logs skill-email --tail 50 ``` ## 중요 참고사항 1. **UUID Namespace**: 모든 서비스에서 동일한 namespace UUID 사용 필수 - `6ba7b810-9dad-11d1-80b4-00c04fd430c8` 2. **데이터베이스**: - 실제 데이터는 `main_db`에 저장됨 - `auth_db`는 존재하지 않음 3. **포트 정보**: - robeing-monitor: 9024 - skill-email: 8501 - PostgreSQL (SSH tunnel): 5433 4. **환경변수 우선순위**: - Docker 컨테이너는 .env 파일과 docker-compose.yml의 environment 섹션 모두 참조 - 재빌드 필요 시 `docker compose down && docker compose up -d --build` 실행 ## 다음 단계 권장사항 1. **즉시 필요**: - Gmail OAuth 토큰 재인증 구현 - 토큰 자동 갱신 메커니즘 2. **단기 개선**: - 에러 메시지 개선 - 로깅 시스템 강화 3. **장기 개선**: - 마이크로서비스 간 통신 표준화 - API Gateway 패턴 고려 - 중앙 집중식 인증/인가 시스템