# 뉴스 스킬과 퍼블리시 분리 아키텍처 계획 ## 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 (**구현 완료** - [트러블슈팅](../troubleshooting/250906_skill_publish_implementation.md)) - **데이터 흐름**: 수집 → 검증/요약 → DM 전송 → 사용자 선택 → 게시 → 결과 보고 ## 3. 구현 계획 ### Phase 1: skill-news (⚠️ 불완전 구현 발견) **2025-09-07 개선사항**: - ✅ rb8001 → skill-news POST 파라미터 전달 - ✅ 중복 체크 collector 내부로 이동 (엔드포인트 제거) - ✅ Company-X 전용 봇 토큰 분리 (COMPANY_X_SLACK_BOT_TOKEN) - ✅ 뉴스 없을 때 메시지 비활성화 - [상세: troubleshooting/250907_company_x_news_zero_articles.md] **착각했던 문제점**: - ❌ skill-news는 검색만 함 (스크래핑/요약 없음) - ❌ 본문(content)과 요약(summary) 없이 제목/URL만 전달 - ❌ skill-publish가 빈 콘텐츠로 홈페이지 게시 시도 - ❌ company-x_hompage는 완전한 파이프라인 보유 **필수 변수 (Squarespace 게시용)**: - id, company_name, title, **summary**(280-320자) - date, publisher, url, thumbnail_url - formatted_content (제목+요약+날짜+언론사) ### Phase 2: skill-publish (✅ 완료) **구현 상세**: [트러블슈팅 문서](../troubleshooting/250906_skill_publish_implementation.md) 참조 ### 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_token, 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) - **skill-publish**: ✅ 포트 8511 구현 완료 ([상세](../troubleshooting/250906_skill_publish_implementation.md)) ## 7. 즉시 필요 작업 - **데이터 저장**: ✅ JSON 파일 기반 구현 완료 - **Slack 사용자 ID**: .env 설정 필요 (51124) - **내부 통신**: ✅ 포트 8511 HTTP API 준비 완료 ## 8. 일정 (완료 상태) - **1주차**: ✅ skill-news 운영 중 (포트 8505) - **2주차**: ✅ skill-publish 구현 완료 (포트 8511) - **3주차**: Slack 통합 및 rb8001 연동 예정