From cefc3119c00f7ec1ff322cb00836551f71c21778 Mon Sep 17 00:00:00 2001 From: gahusb Date: Sat, 16 May 2026 00:53:58 +0900 Subject: [PATCH] docs(claude-md): replace blog-lab references with insta-lab --- CLAUDE.md | 95 +++++++++++++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 52 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index a95c1be..ae06300 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,7 +7,7 @@ ## 1. 프로젝트 개요 Synology NAS 기반의 개인 웹 플랫폼 백엔드 모노레포. -- **서비스**: lotto-lab, stock, travel-proxy, music-lab, blog-lab, realestate-lab, agent-office, personal, packs-lab, deployer (10개) +- **서비스**: lotto-lab, stock, travel-proxy, music-lab, insta-lab, realestate-lab, agent-office, personal, packs-lab, deployer (10개) - **프론트엔드**: 별도 레포 (React + Vite SPA), 빌드 산출물만 NAS에 배포 - **인프라**: Docker Compose (10컨테이너) + Nginx(리버스 프록시) + Gitea Webhook 자동 배포 @@ -56,7 +56,7 @@ Synology NAS 기반의 개인 웹 플랫폼 백엔드 모노레포. | `lotto` | 18000 | 로또 데이터 수집·분석·추천 API | | `stock` | 18500 | 주식 뉴스·AI 분석·KIS API 연동 | | `music-lab` | 18600 | AI 음악 생성·라이브러리 관리 API | -| `blog-lab` | 18700 | 블로그 마케팅 수익화 API | +| `insta-lab` | 18700 | 인스타 카드 피드 자동 생성 (뉴스→키워드→10페이지 카드) | | `realestate-lab` | 18800 | 부동산 청약 자동 수집·매칭 API | | `agent-office` | 18900 | AI 에이전트 오피스 (실시간 WebSocket + 텔레그램 연동) | | `packs-lab` | 18950 | NAS 자료 다운로드 자동화 (DSM 공유 링크 + 5GB 업로드, Vercel SaaS와 HMAC 통신) | @@ -77,7 +77,7 @@ Synology NAS 기반의 개인 웹 플랫폼 백엔드 모노레포. | `/api/trade/` | `stock:8000` | KIS 실계좌 API | | `/api/portfolio` | `stock:8000` | trailing slash 유무 모두 매칭 | | `/api/music/` | `music-lab:8000` | AI 음악 생성·라이브러리 API | -| `/api/blog-marketing/` | `blog-lab:8000` | 블로그 마케팅 수익화 API | +| `/api/insta/` | `insta-lab:8000` | 인스타 카드 자동 생성 API | | `/api/realestate/` | `realestate-lab:8000` | 부동산 청약 API | | `/api/todos` | `personal:8000` | 투두 API | | `/api/blog/` | `personal:8000` | 블로그 API | @@ -135,7 +135,7 @@ docker compose up -d | Lotto Backend | http://localhost:18000 | | Travel API | http://localhost:19000 | | Stock Lab | http://localhost:18500 | -| Blog Lab | http://localhost:18700 | +| Insta Lab | http://localhost:18700 | | Realestate Lab | http://localhost:18800 | | Packs Lab | http://localhost:18950 | @@ -454,61 +454,51 @@ docker compose up -d | PUT | `/api/travel/albums/{album}/region` | 앨범 지역 변경 (region_map_extra 수정) | | PUT | `/api/travel/regions/{region_id}` | 커스텀 지역 이름/좌표 수정 (지도 핀 표시용) | -### blog-lab (blog-lab/) -- 블로그 마케팅 수익화 서비스 (키워드 분석 → AI 글 생성 → 마케팅 강화 → 품질 리뷰 → 포스팅 → 수익 추적) -- AI 엔진: Claude API (Anthropic, `claude-sonnet-4-20250514`) -- 웹 검색: Naver Search API (블로그 + 쇼핑) + 상위 블로그 본문 크롤링 -- DB: `/app/data/blog_marketing.db` -- 파일 구조: `main.py`, `db.py`, `config.py`, `naver_search.py`, `content_generator.py`, `marketer.py`, `quality_reviewer.py`, `web_crawler.py` +### insta-lab (insta-lab/) +- 인스타그램 카드 피드 자동 생성 — 뉴스 모니터링 → 키워드 추출 → 10페이지 카드 카피 + PNG 렌더 → 텔레그램 푸시 → 사용자 수동 업로드 +- DB: `/app/data/insta.db` (news_articles, trending_keywords, card_slates, card_assets, generation_tasks, prompt_templates) +- 카드 사이즈: 1080×1350 (인스타 4:5 세로) +- 카드 렌더: Jinja2 템플릿 → Playwright headless Chromium 스크린샷 +- 파일 구조: `app/main.py`, `config.py`, `db.py`, `news_collector.py`, `keyword_extractor.py`, `card_writer.py`, `card_renderer.py`, `templates/default/card.html.j2` -**파이프라인**: 리서치(+크롤링) → 작가(초안) → 마케터(링크 삽입) → 평가자(6기준 60점) -**상태 흐름**: `draft` → `marketed` → `reviewed` → `published` +**환경변수** +- `NAVER_CLIENT_ID` / `NAVER_CLIENT_SECRET`: 네이버 검색 API +- `ANTHROPIC_API_KEY`: Claude API (Haiku=키워드 정제, Sonnet=카드 카피) +- `ANTHROPIC_MODEL_HAIKU` / `ANTHROPIC_MODEL_SONNET`: 모델명 오버라이드 +- `INSTA_DATA_PATH`: SQLite + 카드 PNG 저장 경로 (기본 `/app/data`) +- `CARD_TEMPLATE_DIR`: HTML 템플릿 디렉토리 (기본 `/app/app/templates`) +- `NEWS_PER_CATEGORY` / `KEYWORDS_PER_CATEGORY`: 수집·추출 limit 튜닝 -**blog_marketing.db 테이블** +**카테고리 시드 키워드** +- 기본 economy / psychology / celebrity 3종 (config.DEFAULT_CATEGORY_SEEDS) +- `prompt_templates.name='category_seeds'`에 JSON으로 오버라이드 가능 -| 테이블 | 설명 | -|--------|------| -| `keyword_analyses` | 키워드 분석 결과 (네이버 검색 데이터 + 경쟁도/기회 점수 + 크롤링 본문) | -| `blog_posts` | 블로그 글 (draft → marketed → reviewed → published) | -| `brand_links` | 브랜드커넥트 제휴 링크 (post_id/keyword_id FK) | -| `commissions` | 포스트별 월간 클릭/구매/수익 | -| `generation_tasks` | 비동기 작업 상태 (research/generate/market/review) | -| `prompt_templates` | AI 프롬프트 템플릿 (DB 저장, 코드 배포 없이 수정 가능) | +**카드 슬레이트 (`card_slates`)** +- status: `draft` → `rendered` → `sent` (또는 `failed`) +- cover_copy / body_copies (8개) / cta_copy / suggested_caption / hashtags JSON 컬럼 +- accent_color는 카테고리별 기본값 (economy=#0F62FE, psychology=#A66CFF, celebrity=#FF5C8A) -**blog-lab API 목록** +**스케줄러 job (agent-office)** +- 09:30 매일 — `_run_insta_schedule` (insta_pipeline) → 뉴스 수집 → 키워드 추출 → 텔레그램 후보 푸시 +- `agent_config.custom_config.auto_select=True`이면 카테고리당 1위 키워드 자동 슬레이트 생성·발송 + +**insta-lab API 목록** | 메서드 | 경로 | 설명 | |--------|------|------| -| GET | `/api/blog-marketing/status` | 서비스 상태 (API 키 설정 현황) | -| POST | `/api/blog-marketing/research` | 키워드 분석 시작 (+ 상위 블로그 크롤링) | -| GET | `/api/blog-marketing/research/history` | 분석 이력 조회 | -| GET | `/api/blog-marketing/research/{id}` | 분석 상세 조회 | -| DELETE | `/api/blog-marketing/research/{id}` | 분석 삭제 | -| GET | `/api/blog-marketing/task/{task_id}` | 작업 상태 폴링 | -| POST | `/api/blog-marketing/generate` | 작가 단계: AI 글 생성 (크롤링 참고 + 링크 반영) | -| POST | `/api/blog-marketing/market/{post_id}` | 마케터 단계: 전환율 강화 + 링크 삽입 | -| POST | `/api/blog-marketing/review/{post_id}` | 평가자 단계: 품질 리뷰 (6기준 × 10점, 42/60 통과) | -| POST | `/api/blog-marketing/regenerate/{post_id}` | 피드백 기반 재생성 | -| POST | `/api/blog-marketing/links` | 브랜드커넥트 링크 등록 | -| GET | `/api/blog-marketing/links` | 링크 조회 (post_id, keyword_id 필터) | -| PUT | `/api/blog-marketing/links/{id}` | 링크 수정 | -| DELETE | `/api/blog-marketing/links/{id}` | 링크 삭제 | -| GET | `/api/blog-marketing/posts` | 포스트 목록 (status 필터) | -| GET | `/api/blog-marketing/posts/{id}` | 포스트 상세 | -| PUT | `/api/blog-marketing/posts/{id}` | 포스트 수정 | -| DELETE | `/api/blog-marketing/posts/{id}` | 포스트 삭제 | -| POST | `/api/blog-marketing/posts/{id}/publish` | 발행 (네이버 URL 등록) | -| GET | `/api/blog-marketing/commissions` | 수익 내역 조회 | -| POST | `/api/blog-marketing/commissions` | 수익 기록 추가 | -| PUT | `/api/blog-marketing/commissions/{id}` | 수익 기록 수정 | -| DELETE | `/api/blog-marketing/commissions/{id}` | 수익 기록 삭제 | -| GET | `/api/blog-marketing/dashboard` | 대시보드 집계 | - -**환경변수** -- `ANTHROPIC_API_KEY`: Claude API 키 (미설정 시 AI 생성 비활성화) -- `NAVER_CLIENT_ID`: 네이버 검색 API 클라이언트 ID -- `NAVER_CLIENT_SECRET`: 네이버 검색 API 시크릿 -- `BLOG_DATA_PATH`: SQLite DB 저장 경로 (기본 `./data/blog`) +| GET | `/api/insta/status` | 서비스 상태 (NAVER/ANTHROPIC 키 여부) | +| POST | `/api/insta/news/collect` | 뉴스 수집 트리거 (BackgroundTask) | +| GET | `/api/insta/news/articles` | 수집 기사 목록 (category, days) | +| POST | `/api/insta/keywords/extract` | 키워드 추출 트리거 (BackgroundTask) | +| GET | `/api/insta/keywords` | 트렌딩 키워드 목록 (category, used) | +| POST | `/api/insta/slates` | 슬레이트 생성 (keyword, category) | +| GET | `/api/insta/slates` | 슬레이트 목록 | +| GET | `/api/insta/slates/{id}` | 슬레이트 상세 + 자산 | +| POST | `/api/insta/slates/{id}/render` | 카드 렌더 재시도 | +| GET | `/api/insta/slates/{id}/assets/{page}` | 카드 PNG 다운로드 (1~10) | +| DELETE | `/api/insta/slates/{id}` | 슬레이트 삭제 (자산 파일 포함) | +| GET | `/api/insta/tasks/{task_id}` | BackgroundTask 상태 폴링 | +| GET/PUT | `/api/insta/templates/prompts/{name}` | 프롬프트 템플릿 CRUD | ### agent-office (agent-office/) - AI 에이전트 가상 오피스 — 2D 픽셀아트 사무실에서 에이전트가 실제 작업 수행 @@ -701,3 +691,4 @@ docker compose up -d - **Windows AI 서버 IP**: `192.168.45.59` — 공유기 DHCP 고정 예약으로 고정. Tailscale은 Synology에서 TCP 불가(userspace 모드)라 로컬 IP 사용 - **현재가 조회**: 네이버 모바일 API → HTML 파싱 폴백, 3분 TTL 캐시 (`price_fetcher.py`) - **시뮬레이션 교체 방식**: `best_picks`는 교체형 — 새 시뮬레이션 실행 시 `is_active=0`으로 비활성화 후 신규 입력 +- **insta-lab Playwright**: NAS에서 chromium 빌드는 가능하지만 +500MB 이미지. 메모리 부족 시 카드 렌더 실패 가능 — 한 번에 1슬레이트만 렌더하도록 직렬화됨