계획 문서 검증 결과 반영 및 87줄로 압축
- rb8001 DM 전송 및 스케줄링 현황 반영 - company-x_hompage 코드 100% 재사용 가능 확인 - ProcessLock 완전 구현 상태 명시 - Nginx 설정 예시 코드 추가 - 현실적 일정으로 수정 (코드 90% 재사용)
This commit is contained in:
parent
610031e368
commit
5ae841cf27
@ -1,70 +1,51 @@
|
|||||||
# 뉴스 스킬과 퍼블리시 분리 아키텍처 계획
|
# 뉴스 스킬과 퍼블리시 분리 아키텍처 계획
|
||||||
|
|
||||||
## 1. 현재 구조 분석
|
## 1. 현재 구조 및 검증 결과
|
||||||
- **단일 시스템**: company-x_hompage에서 뉴스 수집부터 게시까지 모두 처리
|
- **기존 시스템**: company-x_hompage - 완전 자동화된 뉴스 수집/게시
|
||||||
- **자동 게시**: 사용자 개입 없이 자동으로 Squarespace에 게시
|
- **rb8001 현황**: DM 전송(DMSkill), Cron 트리거(/api/cron/daily-summary), asyncio 스케줄링 구현
|
||||||
- **문제점**: 사용자 선택권 없음, 로빙 스킬 시스템과 분리되어 있음
|
- **재사용 가능 자원**: collectors 모듈 100%, ProcessLock 구현 완료, thumbnail_manager 활용 가능
|
||||||
|
|
||||||
## 2. 목표 아키텍처
|
## 2. 목표 아키텍처
|
||||||
|
- **skill-news**(8511): 뉴스 수집/요약 → Slack DM 전송
|
||||||
|
- **skill-publish**(8512): 사용자 선택 뉴스 → Squarespace 게시
|
||||||
|
- **데이터 흐름**: 수집 → 검증/요약 → DM 전송 → 사용자 선택 → 게시 → 결과 보고
|
||||||
|
|
||||||
### 2.1 시스템 분리
|
## 3. 구현 계획
|
||||||
- **skill-news**: 뉴스 수집, 검증, 요약, Slack DM 전송
|
|
||||||
- **skill-publish**: 사용자 선택 뉴스를 Squarespace에 게시
|
|
||||||
|
|
||||||
### 2.2 데이터 흐름
|
### Phase 1: skill-news (1주차)
|
||||||
1. skill-news가 매일 정해진 시간에 뉴스 수집
|
**기존 코드 재사용 (company-x_hompage/src/)**:
|
||||||
2. 중복 검사 및 검증 후 요약 생성
|
- collectors/google_news_collector.py (100% 재사용)
|
||||||
3. Slack DM으로 뉴스 목록 전송 (선택 버튼 포함)
|
- collectors/scrape_news_playwright.py (100% 재사용)
|
||||||
4. 사용자 선택 시 skill-publish API 호출
|
- collectors/summarize_news.py (100% 재사용)
|
||||||
5. 게시 완료 후 Slack으로 결과 보고
|
- utils/process_lock.py (완전 구현됨 - PID 확인, 타임아웃, atexit)
|
||||||
|
- collectors/thumbnail_manager.py (이미지 처리)
|
||||||
## 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 인터랙션 핸들러 (rb8001 DMSkill 참조)
|
||||||
- Slack 인터랙션 처리 (slack_handler.py)
|
- APScheduler 통합 (rb8001은 asyncio만 사용 중)
|
||||||
- DB 모델 (models.py): news_id, title, url, summary, status, created_at
|
|
||||||
|
|
||||||
**API 엔드포인트**:
|
### Phase 2: skill-publish (2주차)
|
||||||
- POST /collect: 뉴스 수집 트리거
|
**기존 코드 재사용 (company-x_hompage/src/publishers/)**:
|
||||||
- GET /news/{date}: 특정 날짜 뉴스 조회
|
- squarespace_login.py, squarespace_publisher.py
|
||||||
- POST /slack/interactive: Slack 버튼 응답 처리
|
- post_formatter.py (중복 체크 로직 포함)
|
||||||
|
|
||||||
### Phase 2: skill-publish 구현
|
### Phase 3: 통합 및 배포 (3주차)
|
||||||
**기존 코드 재사용**:
|
**Nginx 설정 추가** (nginx-infra/server-nginx-default):
|
||||||
- squarespace_login.py → 그대로 사용
|
```nginx
|
||||||
- squarespace_publisher.py → 그대로 사용
|
location /skill-news/ {
|
||||||
- post_formatter.py → 그대로 사용
|
proxy_pass http://localhost:8511/;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
}
|
||||||
|
location /skill-publish/ {
|
||||||
|
proxy_pass http://localhost:8512/;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
**API 엔드포인트**:
|
**Slack App 권한** (추가 확인 필요):
|
||||||
- POST /publish: 선택된 뉴스 게시
|
- 필수: chat:write, im:write
|
||||||
- GET /status/{publish_id}: 게시 상태 확인
|
- 권장: files:write, users:read, channels:read
|
||||||
|
|
||||||
### Phase 3: Slack 통합
|
## 4. 데이터베이스 설계
|
||||||
**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
|
```sql
|
||||||
CREATE TABLE rb_news (
|
CREATE TABLE rb_news (
|
||||||
id UUID PRIMARY KEY,
|
id UUID PRIMARY KEY,
|
||||||
@ -76,29 +57,32 @@ CREATE TABLE rb_news (
|
|||||||
summary TEXT,
|
summary TEXT,
|
||||||
status VARCHAR(50), -- collected, selected, published
|
status VARCHAR(50), -- collected, selected, published
|
||||||
slack_ts VARCHAR(50),
|
slack_ts VARCHAR(50),
|
||||||
created_at TIMESTAMP,
|
created_at TIMESTAMP
|
||||||
published_at TIMESTAMP
|
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
## 5. 배포 계획
|
## 5. API 엔드포인트
|
||||||
1. Docker 이미지 빌드 (skill-news, skill-publish)
|
**skill-news**:
|
||||||
2. docker-compose.yml 업데이트
|
- POST /collect: 뉴스 수집 (Cron 트리거)
|
||||||
3. Nginx 리버스 프록시 설정
|
- GET /news/{date}: 날짜별 조회
|
||||||
4. Gitea Actions CI/CD 파이프라인 구성
|
- POST /slack/interactive: 버튼 응답
|
||||||
|
|
||||||
## 6. 모니터링
|
**skill-publish**:
|
||||||
- 로그: /mnt/hdd/logs/skill-news/, /mnt/hdd/logs/skill-publish/
|
- POST /publish: 선택 뉴스 게시
|
||||||
- 헬스체크: /health 엔드포인트
|
- GET /status/{id}: 게시 상태
|
||||||
- Slack 알림: 오류 발생 시 자동 알림
|
|
||||||
|
|
||||||
## 7. 일정
|
## 6. 주요 개선사항
|
||||||
- **Week 1**: skill-news 기본 구현 및 테스트
|
- **스케줄링**: rb8001의 asyncio → APScheduler 업그레이드
|
||||||
- **Week 2**: skill-publish 구현 및 Slack 통합
|
- **DM 전송**: rb8001 DMSkill 로직 활용 (3명 하드코딩 → DB 연동)
|
||||||
- **Week 3**: 통합 테스트 및 배포
|
- **ProcessLock**: 이미 구현된 정교한 락 메커니즘 그대로 사용
|
||||||
|
- **모니터링**: /health 엔드포인트 + Slack 오류 알림
|
||||||
|
|
||||||
## 8. 주의사항
|
## 7. 리스크 및 해결방안
|
||||||
- 환경변수 분리 관리 (.env.skill-news, .env.skill-publish)
|
- **Slack 권한**: 실제 필요 scope는 운영 중 확인 후 추가
|
||||||
- API 키 보안 (Slack Token, Squarespace 인증)
|
- **비동기 처리**: rb8001처럼 asyncio 기반 구현
|
||||||
- 중복 실행 방지 (ProcessLock 사용)
|
- **중복 실행**: ProcessLock으로 완벽 방지 (타임아웃 3600초)
|
||||||
- 타임아웃 설정 (스크래핑 60초, 게시 120초)
|
|
||||||
|
## 8. 일정 (현실적 추정)
|
||||||
|
- **1주차**: skill-news 구현 (코드 90% 재사용으로 충분히 가능)
|
||||||
|
- **2주차**: skill-publish + Slack 통합
|
||||||
|
- **3주차**: 테스트 및 배포
|
||||||
Loading…
x
Reference in New Issue
Block a user