# rb8001 일일 요약 크론잡 실패 분석 ## 작성일: 2025-08-24 ## 작성자: 서버 관리자 with Claude ## 영향 서버: 51123(Gateway) → 51124(rb8001, skill-email) --- ## 1. 문제 개요 ### 1.1 증상 - **발생 시간**: 매일 오전 9시 (KST) - **영향**: 사용자들에게 불완전한 모닝 브리핑 전송 (이메일 요약 누락) - **대상 사용자**: - 전희재 (U091UNVE41M) - 김종태 (U0925SXQFDK) - HanYong Hwang (U092F7FQ55L) ### 1.2 에러 메시지 ``` Gmail token not ready for user U091UNVE41M: reauth_required 500 Internal Server Error from skill-email service ``` --- ## 2. 시스템 아키텍처 ### 2.1 크론잡 구성 (51123 서버) ```bash # Gateway 컨테이너 내부 크론탭 0 9 * * * curl -X POST http://192.168.219.52:8001/api/cron/daily-summary \ -H "Content-Type: application/json" \ 2>/dev/null || true # briefing ``` ### 2.2 네트워크 플로우 ``` [51123 Gateway 크론] ↓ POST 요청 [51124 rb8001:8001] ↓ 데이터 수집 (병렬) ├→ skill-news:8505 (뉴스 검색) ✅ ├→ skill-email:8501 (이메일 조회) ❌ 500 에러 └→ rb10508_micro (LLM 요약) ✅ ↓ [Slack API → 사용자 DM] ``` ### 2.3 인증 체계 - **엔드포인트**: `/api/cron/daily-summary` - **인증 토큰**: Bearer cron-secret-2024 - **실행 주체**: Gateway 컨테이너 (51123) --- ## 3. 근본 원인 분석 ### 3.1 skill-email 서비스 실패 (51124 서버) #### 데이터베이스 연결 문제 ```python # skill-email 환경 설정 TOKEN_PROVIDER=database DATABASE_URL=postgresql://robeings:robeings@localhost:5433/auth_db ``` **문제점**: 1. **auth_db 부재**: 51123 서버에 auth_db 데이터베이스 없음 (main_db만 존재) 2. **SSH 터널 설정**: 5433 포트가 51123으로 포워딩되나 DB 자체가 없음 3. **토큰 조회 실패**: DBCredentialsProvider가 연결 실패로 토큰 조회 불가 #### 에러 체인 ``` 1. rb8001 → skill-email API 호출 (/messages?user_id=U091UNVE41M) 2. skill-email → PostgreSQL 연결 시도 (auth_db) 3. PostgreSQL → "database 'auth_db' does not exist" 에러 4. skill-email → "reauth_required" 폴백 응답 5. rb8001 → 500 Internal Server Error 수신 ``` ### 3.2 추가 이슈 #### datetime import 누락 ```python # rb8001/main.py 에러 NameError: name 'datetime' is not defined ``` #### 슬랙 워크스페이스 불일치 - **현재 등록**: T035VFRKCN6 (GoodGang Labs) - **필요한 것**: T0925SXPS4D (미등록) --- ## 4. 실행 프로세스 상세 ### 4.1 정상 동작 시나리오 1. **09:00:00** - Gateway 크론 트리거 2. **09:00:01** - rb8001 `/api/cron/daily-summary` 호출 3. **09:00:02** - 병렬 데이터 수집 시작 - 뉴스: AI 키워드로 최신 뉴스 5개 - 이메일: 사용자별 최근 이메일 5개 4. **09:00:05** - LLM 요약 생성 5. **09:00:07** - Slack DM 전송 ### 4.2 현재 실패 시나리오 1. **09:00:00** - Gateway 크론 트리거 ✅ 2. **09:00:01** - rb8001 엔드포인트 호출 ✅ 3. **09:00:02** - 데이터 수집 시작 - 뉴스: 성공 ✅ - 이메일: **실패** ❌ (500 에러) 4. **09:00:03** - 부분적 요약 생성 (뉴스만) 5. **09:00:04** - 불완전한 DM 전송 --- ## 5. 해결 방안 ### 5.1 즉시 조치 (임시) ```bash # skill-email 환경 변경 (database → file 모드) cd /home/admin/ivada_project/skill_email vi .env # TOKEN_PROVIDER=file 로 변경 # 서비스 재시작 docker compose down && docker compose up -d --build ``` ### 5.2 근본 해결 #### 옵션 1: auth_db → main_db 마이그레이션 ```bash # skill-email .env 수정 DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db # gmail_tokens 테이블이 main_db에 이미 존재하므로 정상 작동 예상 ``` #### 옵션 2: 51123 서버 직접 연결 ```bash # SSH 터널 대신 직접 연결 DATABASE_URL=postgresql://robeings:robeings@192.168.219.45:5432/main_db ``` #### 옵션 3: rb8001 내장 이메일 기능 사용 - rb8001에 이미 통합된 email_integration.py 활용 - skill-email 의존성 제거 ### 5.3 코드 수정 필요 ```python # rb8001/main.py 상단에 추가 import datetime # 또는 from datetime import datetime ``` --- ## 6. 검증 방법 ### 6.1 수동 테스트 ```bash # skill-email 직접 테스트 curl -X GET http://localhost:8501/messages?user_id=U091UNVE41M \ -H "Authorization: Bearer test-token" # rb8001 크론 엔드포인트 테스트 curl -X POST http://localhost:8001/api/cron/daily-summary \ -H "Authorization: Bearer cron-secret-2024" ``` ### 6.2 로그 확인 ```bash # skill-email 로그 docker logs skill-email --tail 50 # rb8001 로그 docker logs rb8001 --tail 50 # Gateway 로그 (크론 실행 확인) docker exec robeing-gateway tail -f /var/log/cron.log ``` --- ## 7. 모니터링 포인트 ### 7.1 일일 체크리스트 - [ ] 오전 9시 크론 실행 여부 - [ ] skill-email 500 에러 발생 여부 - [ ] Slack DM 정상 수신 여부 - [ ] 이메일 요약 포함 여부 ### 7.2 알람 설정 권장 ```bash # 크론 실패 시 알람 0 9 * * * curl ... || echo "Cron failed" | mail -s "Alert" admin@example.com ``` --- ## 8. 교훈 및 개선사항 ### 8.1 아키텍처 개선 1. **환경 일관성**: 모든 서비스가 동일한 DB 사용 (main_db) 2. **의존성 최소화**: 단일 서비스 장애가 전체 기능 마비 방지 3. **폴백 메커니즘**: 이메일 실패 시에도 기본 브리핑 전송 ### 8.2 운영 개선 1. **헬스체크 강화**: 각 마이크로서비스 상태 모니터링 2. **에러 핸들링**: graceful degradation 구현 3. **로그 중앙화**: 분산 서비스 로그 통합 관리 ### 8.3 문서화 1. **시스템 다이어그램**: 서비스 간 의존성 명확화 2. **환경변수 문서**: 각 서비스별 필수 설정 문서화 3. **트러블슈팅 가이드**: 일반적인 문제 해결 방법 정리 --- ## 9. 관련 파일 ### 51123 서버 - `/home/admin/robeing-gateway/entrypoint.sh` - 크론 시작 - `/home/admin/robeing-gateway/Dockerfile` - 크론 설치 ### 51124 서버 - `/home/admin/ivada_project/rb8001/main.py` - 크론 엔드포인트 - `/home/admin/ivada_project/rb8001/app/cron/daily_summary.py` - 요약 로직 - `/home/admin/ivada_project/skill_email/.env` - DB 설정 - `/home/admin/ivada_project/skill_email/services/gmail_service.py` - Gmail 서비스 --- ## 10. 현재 상태 (2025-08-24 23:50) ### 확인 사항 - **Gateway 크론**: 정상 작동 ✅ - **rb8001 서비스**: 정상 작동 ✅ - **skill-news**: 정상 작동 ✅ - **skill-email**: 500 에러 ❌ - **auth_db**: 존재하지 않음 ❌ - **main_db gmail_tokens**: 정상 존재 ✅ ### 긴급도 - **높음**: 매일 오전 9시 사용자 영향 - **권장 조치**: skill-email을 file 모드로 전환 또는 main_db 연결 --- **문서 끝**