DOCS/journey/troubleshooting/251021_rb8001_coldmail_workflow_update.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

4.6 KiB
Raw Permalink Blame History

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"
    • 직접 호출 테스트:
      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 설정값 우선).
    • 단건 실행 테스트:
      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 정합성 확인 필요.

롤백 방법

  • 문제 발생 시 직전 커밋으로 되돌림:
    cd rb8001 && git revert b8901ae
    
    (CI/CD가 동작 중이면 revert 후 재배포 필요)

교훈

  • 외부/내부 스킬 연동은 API Key 헤더를 일관되게 사용해 인증 오류를 예방한다.
  • 하드코딩된 서비스 URL은 환경변수로 치환해 컨테이너/서버/로컬 간 동작 일관성을 확보한다.
  • 변경 후에는 Slack/Email 경로 각각에 대해 독립적인 헬스/기능 테스트를 수행한다.