DOCS/plan/250906_news_skill_publish_separation.md

3.6 KiB

뉴스 스킬과 퍼블리시 분리 아키텍처 계획

1. 현재 구조 (검증 완료)

  • 기존 시스템: company-x_hompage - 완전 자동화된 뉴스 수집/게시
  • rb8001 실행 중: Docker 상태 "Up 11 hours (healthy)" 확인
  • DM 기능: /api/cron/daily-summary 구현, dm_skill.py (577라인)
  • 재사용 가능: collectors 모듈 100%, ProcessLock(타임아웃 3600초), thumbnail_manager

2. 목표 아키텍처

  • skill-news: 포트 8505 (51124 서버 정상 운영 확인)
  • skill-publish: 포트 8511 (신규 구현 예정)
  • 데이터 흐름: 수집 → 검증/요약 → DM 전송 → 사용자 선택 → 게시 → 결과 보고

3. 구현 계획

Phase 1: skill-news (1주차)

기존 코드 재사용 (company-x_hompage/src/):

  • collectors/google_news_collector.py (100% 재사용)
  • collectors/scrape_news_playwright.py (100% 재사용)
  • collectors/summarize_news.py (100% 재사용)
  • utils/process_lock.py (완전 구현됨 - PID 확인, 타임아웃, atexit)
  • collectors/thumbnail_manager.py (이미지 처리)

새로 구현:

  • Slack 인터랙션 핸들러 (rb8001 DMSkill 참조)
  • APScheduler 통합 (rb8001에 이미 구현됨, 재사용)

Phase 2: skill-publish (2주차)

기존 코드 재사용 (company-x_hompage/src/publishers/):

  • squarespace_login.py, squarespace_publisher.py
  • post_formatter.py (중복 체크 로직 포함)

Phase 3: 통합 및 배포 (3주차)

통신 방식:

  • 내부: Docker 네트워크 (rb8001 ↔ skill-*)
  • skill-news: 포트 8505 (운영 중)
  • skill-publish: 포트 8511 (구현 예정)
  • Nginx 프록시: 외부 노출 불필요 (내부 통신만)

Slack App 권한:

  • 확인됨: chat:write (mrkdwn, Block Kit 지원)
  • 추가 필요 여부: files:write, users:read [확인 필요]

4. 데이터베이스 (확인됨)

PostgreSQL (51123 서버):

  • main_db 사용 (구 auth_db)
  • users, gmail_tokens, robeing_stats 테이블 존재
  • rb_news 테이블: DB 작업 후 구현 예정

ChromaDB (51124 서버):

  • 경로: /home/admin/ivada_project/rb8001/chroma_db (확인됨)
  • 16개 사용자별 UUID 컬렉션 존재

데이터 저장 방식:

  • 단기: JSON 파일 기반 (/app/data/news_state.json)
  • Slack 메시지 ID에 뉴스 ID 임베드
  • ChromaDB로 중복 체크
  • 향후: PostgreSQL rb_news 테이블로 마이그레이션 계획

5. API 엔드포인트

skill-news:

  • POST /collect: 뉴스 수집 (Cron 트리거)
  • GET /news/{date}: 날짜별 조회
  • POST /slack/interactive: 버튼 응답

skill-publish:

  • POST /publish: 선택 뉴스 게시
  • GET /status/{id}: 게시 상태

6. 확인된 구현 사항

  • 브리핑 시스템: rb8001/app/skills/dm_skill.py 구현됨
  • APScheduler: rb8001에 이미 구현 (평일 09:00 스케줄링)
  • 사용자 목록: Slack ID .env 미설정 (DB 연동 필요)
  • Gmail 토큰 갱신: 2024-08-27 해결 완료
  • ProcessLock: 완전 구현 (PID 확인, 타임아웃 3600초, atexit)
  • 서버 분리: 51123(메인), 51124(로빙/스킬) 물리적 분리
  • Gemini 모델: 환경변수 GEMINI_MODEL로 통일 (gemini-2.5-flash-lite)

7. 즉시 필요 작업

  • 데이터 저장: JSON 파일 기반으로 우선 구현
  • Slack 사용자 ID: .env 설정 필요 (51124)
  • 내부 통신: Docker 네트워크로 직접 연결 (Nginx 불필요)

8. 일정 (현실적 추정)

  • 1주차: skill-news 구현 (코드 90% 재사용으로 충분히 가능)
  • 2주차: skill-publish + Slack 통합
  • 3주차: 테스트 및 배포