# 뉴스 스킬과 퍼블리시 분리 아키텍처 계획 ## 1. 현재 구조 (검증 완료) - **기존 시스템**: company-x_hompage - 완전 자동화된 뉴스 수집/게시 - **rb8001 실행 중**: Docker 상태 "Up 11 hours (healthy)" 확인 - **DM 기능**: /api/cron/daily-summary 구현, dm_skill.py:384 위치 - **재사용 가능**: 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은 asyncio만 사용 중) ### Phase 2: skill-publish (2주차) **기존 코드 재사용 (company-x_hompage/src/publishers/)**: - squarespace_login.py, squarespace_publisher.py - post_formatter.py (중복 체크 로직 포함) ### Phase 3: 통합 및 배포 (3주차) **Nginx 설정** [확인 필요]: - 현재 skill-email(8501)만 설정됨 - skill-news, skill-publish 라우팅 추가 필요 **Slack App 권한**: - 확인됨: chat:write (mrkdwn, Block Kit 지원) - 추가 필요 여부: files:write, users:read [확인 필요] ## 4. 데이터베이스 (확인됨) **PostgreSQL (51123 서버)**: - main_db 사용 (구 auth_db) - users, gmail_tokens, robeing_stats 테이블 존재 **ChromaDB (51124 서버)**: - 포트 8000, 경로 /app/data/chroma - 벡터 기반 중복 체크 구현됨 **신규 테이블 필요**: ```sql CREATE TABLE rb_news ( id UUID PRIMARY KEY, keyword VARCHAR(100), title TEXT, url TEXT UNIQUE, status VARCHAR(50) -- collected, selected, published ); ``` ## 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:384 구현됨 - **사용자 목록**: 하드코딩 3명 확인 (DB 연동 필요) - **Gmail 토큰 갱신**: 2025-08-27 해결 완료 - **ProcessLock**: 완전 구현 (PID 확인, 타임아웃 3600초, atexit) - **서버 분리**: 51123(메인), 51124(로빙/스킬) 물리적 분리 ## 7. 확인 필요 사항 - **Nginx 라우팅**: skill-news(8505), skill-publish(8511) 프록시 설정 - **Slack 추가 권한**: files:write, users:read 필요 여부 - **APScheduler vs asyncio**: 스케줄링 방식 결정 ## 8. 일정 (현실적 추정) - **1주차**: skill-news 구현 (코드 90% 재사용으로 충분히 가능) - **2주차**: skill-publish + Slack 통합 - **3주차**: 테스트 및 배포