DOCS/plan/250906_news_skill_publish_separation.md

3.4 KiB

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

1. 현재 구조 분석

  • 단일 시스템: company-x_hompage에서 뉴스 수집부터 게시까지 모두 처리
  • 자동 게시: 사용자 개입 없이 자동으로 Squarespace에 게시
  • 문제점: 사용자 선택권 없음, 로빙 스킬 시스템과 분리되어 있음

2. 목표 아키텍처

2.1 시스템 분리

  • skill-news: 뉴스 수집, 검증, 요약, Slack DM 전송
  • skill-publish: 사용자 선택 뉴스를 Squarespace에 게시

2.2 데이터 흐름

  1. skill-news가 매일 정해진 시간에 뉴스 수집
  2. 중복 검사 및 검증 후 요약 생성
  3. Slack DM으로 뉴스 목록 전송 (선택 버튼 포함)
  4. 사용자 선택 시 skill-publish API 호출
  5. 게시 완료 후 Slack으로 결과 보고

3. 기술 스택

  • skill-news: FastAPI (포트 8511)
  • skill-publish: FastAPI (포트 8512)
  • 데이터 저장: PostgreSQL (rb_news 테이블)
  • 통신: HTTP API, Slack Web API
  • 스케줄링: APScheduler

4. 구현 계획

Phase 1: skill-news 구현

기존 코드 재사용:

  • google_news_collector.py → news_collector.py
  • scrape_news_playwright.py → news_scraper.py
  • news_summarizer.py → 그대로 사용

새로 구현:

  • FastAPI 서버 (main.py)
  • Slack 인터랙션 처리 (slack_handler.py)
  • DB 모델 (models.py): news_id, title, url, summary, status, created_at

API 엔드포인트:

  • POST /collect: 뉴스 수집 트리거
  • GET /news/{date}: 특정 날짜 뉴스 조회
  • POST /slack/interactive: Slack 버튼 응답 처리

Phase 2: skill-publish 구현

기존 코드 재사용:

  • squarespace_login.py → 그대로 사용
  • squarespace_publisher.py → 그대로 사용
  • post_formatter.py → 그대로 사용

API 엔드포인트:

  • POST /publish: 선택된 뉴스 게시
  • GET /status/{publish_id}: 게시 상태 확인

Phase 3: Slack 통합

Slack App 설정:

메시지 포맷:

  • Block Kit 사용하여 뉴스 카드 생성
  • 각 뉴스에 "게시" 버튼 추가
  • action_id에 news_id 포함

Phase 4: 데이터베이스 설계

CREATE TABLE rb_news (
    id UUID PRIMARY KEY,
    keyword VARCHAR(100),
    title TEXT,
    url TEXT UNIQUE,
    publisher VARCHAR(200),
    published_date DATE,
    summary TEXT,
    status VARCHAR(50), -- collected, selected, published
    slack_ts VARCHAR(50),
    created_at TIMESTAMP,
    published_at TIMESTAMP
);

5. 배포 계획

  1. Docker 이미지 빌드 (skill-news, skill-publish)
  2. docker-compose.yml 업데이트
  3. Nginx 리버스 프록시 설정
  4. Gitea Actions CI/CD 파이프라인 구성

6. 모니터링

  • 로그: /mnt/hdd/logs/skill-news/, /mnt/hdd/logs/skill-publish/
  • 헬스체크: /health 엔드포인트
  • Slack 알림: 오류 발생 시 자동 알림

7. 일정

  • Week 1: skill-news 기본 구현 및 테스트
  • Week 2: skill-publish 구현 및 Slack 통합
  • Week 3: 통합 테스트 및 배포

8. 주의사항

  • 환경변수 분리 관리 (.env.skill-news, .env.skill-publish)
  • API 키 보안 (Slack Token, Squarespace 인증)
  • 중복 실행 방지 (ProcessLock 사용)
  • 타임아웃 설정 (스크래핑 60초, 게시 120초)