DOCS/troubleshooting/251021_rb8001_coldmail_workflow_update.md

87 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2025-10-21 rb8001 Coldmail 워크플로 변경 점검 (Slack 헤더/Email URL)
**작성일**: 2025-10-21
**작성자**: Claude (51124 서버 전담)
**상태**: 완료
---
## 배경/문제
- Coldmail 요약을 Slack으로 전송할 때 간헐적 인증 문제(401/403)가 발생할 수 있었음.
- 원인: `X-API-Key` 헤더 미전달 케이스 존재.
- `scripts/run_coldmail_email.py`가 하드코딩 URL(`localhost:8501`)을 사용하여 컨테이너/서버 환경에서 잘못된 대상에 요청할 가능성.
## 변경 사항
- 커밋: `b8901ae` (rb8001, main)
- 파일:
1) `app/services/workflows/coldmail_workflow.py`
- Slack 전송 요청에 `headers={"X-API-Key": os.getenv("SKILL_SLACK_API_KEY", "")}` 추가.
- 효과: skill-slack 연동 시 API Key 기반 인증 일관성 보장.
2) `scripts/run_coldmail_email.py`
- `SKILL_EMAIL_URL = os.getenv("SKILL_EMAIL_URL", "http://localhost:8501")`로 변경.
- 효과: 컨테이너/서버 환경에서 환경변수 우선 사용(필요 시 로컬 기본값).
### 2025-10-21~22 후속 변경(피드백 UI/표시/학습 신호)
- 커밋: `520a7c7`, `058ecb8`, `1e93d49`, `748eacd` (rb8001)
- 파일: `app/services/coldmail_processor.py`, `app/router/slack_handler.py`
- 피드백 UI 라디오 → 드롭다운(static_select) → 최종: 질문 context(작은 글자) + 가로 버튼(맞음/아님) 구성으로 정리
- 발신 표시 개선: 이메일 > 이름(“없음” 제외) > 원문 문자열 순으로 표시, 학습 value는 이메일 우선 사용
- 인터랙티브 처리: radio_buttons(selected_option) 지원 및 ‘무시(skip) 값은 학습 갱신 생략
- 참고: 피드백 UI는 Block Kit 제약으로 폰트 크기 비율 직접 조정이 불가하여 작은 텍스트는 context 블록으로 구현
### 2025-10-22 학습 신호 확장 (제목→본문/첨부까지)
- 커밋: `268ab2f` (rb8001)
- 파일: `app/services/coldmail_filter.py`, `app/services/coldmail_hybrid_filter.py`
- Naive Bayes 특징추출을 제목 + 본문 + 첨부파일명(+도메인 토큰)으로 확장
- 하이브리드 Stage3(NB) 호출경로에 body/attachments 전달 연동
- 자세한 내용: `troubleshooting/251022_coldmail_nb_feature_expansion.md`
## 관련 설정 확인
- 환경변수 예시(rb8001/.env)
- `SKILL_SLACK_API_KEY` (필수)
- `SKILL_SLACK_URL` (예: `http://localhost:8502`)
- `SKILL_EMAIL_URL` (compose에서 별도 지정 가능)
- Compose 설정(rb8001/docker-compose.yml)
- `env_file: .env`로 로드 후, 필요 시 `environment:`에서 `SKILL_EMAIL_URL` 재설정됨.
## 재현/검증 절차
1) Slack 전송 인증 확인
- 컨테이너/서버에서 환경변수 확인: `printenv | grep -E "SKILL_SLACK_URL|SKILL_SLACK_API_KEY"`
- 직접 호출 테스트:
```bash
curl -sS -X POST "$SKILL_SLACK_URL/api/v1/send" \
-H "Content-Type: application/json" \
-H "X-API-Key: $SKILL_SLACK_API_KEY" \
-d '{"channel":"'$COLDMAIL_CHANNEL_ID'","text":"coldmail test"}'
```
- 기대값: 200 OK 및 Slack 채널 메시지 확인.
- 주의: .env 인라인 주석으로 채널 값 파싱 오류가 날 수 있어 채널 ID는 순수 값만 사용
2) Coldmail 스크립트 URL 확인
- `printenv SKILL_EMAIL_URL`로 현재 값 확인(컨테이너에서는 compose 설정값 우선).
- 단건 실행 테스트:
```bash
cd /home/admin/ivada_project/rb8001
docker exec rb8001 python scripts/run_coldmail_email.py <email_id>
```
- 기대값: 이메일 상세 조회 성공(200), 오류 로그 없음.
- 보조: `scripts/find_pdf_emails.py <days>`로 최근 PDF 첨부 이메일 id 탐색 (PYTHONPATH=rb8001 필요)
3) 서비스 로그 확인(운영)
- `docker logs rb8001 --tail 200 | grep -iE "coldmail|slack|error|fail|warn"`
- 실패 시 상태코드/응답 메시지로 원인(401/403/5xx) 식별.
## 영향/리스크
- Slack API Key 미설정/오설정 시 여전히 401/403 발생 가능 → `.env`/Secrets 관리 필요.
- `SKILL_EMAIL_URL`이 환경에 맞지 않으면 이메일 상세 조회 실패(연결 거부/타임아웃) → compose/.env 정합성 확인 필요.
## 롤백 방법
- 문제 발생 시 직전 커밋으로 되돌림:
```bash
cd rb8001 && git revert b8901ae
```
(CI/CD가 동작 중이면 revert 후 재배포 필요)
## 교훈
- 외부/내부 스킬 연동은 API Key 헤더를 일관되게 사용해 인증 오류를 예방한다.
- 하드코딩된 서비스 URL은 환경변수로 치환해 컨테이너/서버/로컬 간 동작 일관성을 확보한다.
- 변경 후에는 Slack/Email 경로 각각에 대해 독립적인 헬스/기능 테스트를 수행한다.