From 5963fc0d62b1b64f03eecb36007a8432e7d72cf3 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Sat, 13 Sep 2025 11:47:39 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20Daily=20Summary=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Gateway 크론잡과 APScheduler 중복 제거 - 환경변수 DAILY_SUMMARY_SCHEDULE 설정 - 9시 단일 실행으로 통일 - 보안 취약점 개선사항 포함 🤖 Generated with Claude Code Co-Authored-By: Claude --- ...0_daily_summary_duplicate_execution_fix.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 troubleshooting/250913_happybell80_daily_summary_duplicate_execution_fix.md diff --git a/troubleshooting/250913_happybell80_daily_summary_duplicate_execution_fix.md b/troubleshooting/250913_happybell80_daily_summary_duplicate_execution_fix.md new file mode 100644 index 0000000..50f9c3f --- /dev/null +++ b/troubleshooting/250913_happybell80_daily_summary_duplicate_execution_fix.md @@ -0,0 +1,88 @@ +# Daily Summary 중복 실행 문제 해결 + +**작성일**: 2025-09-13 +**작성자**: happybell80 & Claude +**영향 서비스**: robeing-gateway, rb8001 +**해결 상태**: 완료 + +## 1. 문제 상황 + +### 증상 +- Daily Summary가 매일 아침 **두 번 실행** + - 9시 0분: Gateway 크론잡 실행 + - 9시 1분: APScheduler 실행 +- 사용자들이 동일한 브리핑을 2번 수신 + +### 원인 +1. **Gateway 크론잡**: crontab에서 rb8001 API 호출 +2. **APScheduler**: rb8001 내부에서 직접 실행 +3. 두 시스템이 독립적으로 동작하여 중복 발생 + +## 2. 해결 방법 + +### 코드 수정 + +#### robeing-gateway/app/crontab.py +```python +# 삭제된 내용: +# - 22줄: await briefing(logger) +# - 23줄: logger.info("cronjob enrollment completed") +# - 25-100줄: async def briefing() 함수 전체 +``` + +#### rb8001/main.py +```python +# 삭제된 내용: +# - 549-583줄: @app.post("/api/cron/daily-summary") 엔드포인트 전체 +``` + +### 환경변수 설정 (.env) +```bash +# Daily Summary 스케줄 설정 +DAILY_SUMMARY_ENABLED=true +DAILY_SUMMARY_SCHEDULE=0 9 * * 1-5 # 평일 9시 0분 실행 +``` + +## 3. 변경 후 구조 + +### Before (중복 실행) +``` +Gateway Crontab (9:00) → rb8001 API → dm_skill.send_daily_summary_dm() +APScheduler (9:01) → dm_skill.send_daily_summary_dm() +``` + +### After (단일 실행) +``` +APScheduler (9:00) → dm_skill.send_daily_summary_dm() +``` + +## 4. 확인 방법 + +```bash +# 1. Gateway 크론탭 확인 (briefing 항목이 없어야 함) +docker exec robeing-gateway crontab -l + +# 2. rb8001 로그 확인 +docker logs rb8001 | grep "Daily Summary" + +# 3. 수동 테스트 (필요시) +curl -X POST http://localhost:8001/api/dm/send-daily-summary +``` + +## 5. 추가 개선사항 + +### 해결된 보안 취약점 +- Cron 토큰 하드코딩 제거 (`cron-secret-2024`) +- 인증 실패시 요청 처리 계속되던 문제 해결 + +### APScheduler 장점 +- 환경변수로 스케줄 관리 +- 내부 실행으로 네트워크 오버헤드 없음 +- 더 정확한 실행 시간 관리 + +## 6. 교훈 + +1. **단일 책임 원칙**: 스케줄링은 한 곳에서만 관리 +2. **환경변수 활용**: 하드코딩 대신 설정 가능하게 +3. **중복 제거**: Gateway와 내부 스케줄러 역할 명확히 구분 +4. **문서화**: 시스템 변경사항 즉시 기록 \ No newline at end of file