diff --git a/plan/250906_news_skill_publish_separation.md b/plan/250906_news_skill_publish_separation.md new file mode 100644 index 0000000..5588c68 --- /dev/null +++ b/plan/250906_news_skill_publish_separation.md @@ -0,0 +1,104 @@ +# 뉴스 스킬과 퍼블리시 분리 아키텍처 계획 + +## 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 설정**: +- Bot Token Scopes: chat:write, im:write +- Interactive Components 활성화 +- Request URL: https://ro-being.com/skill-news/slack/interactive + +**메시지 포맷**: +- Block Kit 사용하여 뉴스 카드 생성 +- 각 뉴스에 "게시" 버튼 추가 +- action_id에 news_id 포함 + +### Phase 4: 데이터베이스 설계 +```sql +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초) \ No newline at end of file