- collect_news.mjs: 네이버 뉴스 검색 다중 질의(상호·원장·의료진·주제어, 429 백오프) + 언론보도 게시판 자동 발견/clinic.json newsBoard. 관련성 = 제목·요약에 병원 이름(v2 §8). 제목·매체·날짜·원문 링크만 저장. news_outlets.mjs 는 build_news.py 매체 표 이식 - gate: BANNED_NEWS_TITLE(전후 사진·비교, 후기, 변신)·NEGATIVE_NEWS(규제·사건, "무사고" 통과)·checkNewsItems → check.mjs·test.mjs(19/19) - 워커 news 단계(youtube 뒤, images 앞), --news-board/--no-news, status.report.news - 뷰 news.json: 렛미인 "변신" 기사 41건 규칙으로 제외(excludedByGate 에 목록). 회귀 1,105건(수작업 1,096, 제목 일치 1,033), 원진 1,049건 - launchd 폴러 설치(haewon 지시): PATH 에 프레임워크 python3, bootstrap/bootout 안내 - 함정: JS \W 는 한글을 지움(제목 중복 판정 붕괴), 워드프레스 article:published_time 은 게시판 생성일, 네이버 질의당 1,000건 - v3 문서 §1·§2·§3·§5·§6 갱신, 템플릿 재내보내기 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| launchd | ||
| poll.mjs | ||
| README.md | ||
| run.mjs | ||
서포터즈 자동 빌드 워커
병원 홈페이지 URL 하나로 근거 수집 → 팩트 시트·의료진 초안 → 첫 배치 기획 → 글 생성(GPT-4.1, 게이트·근거 대조) → Astro 빌드·발행 게이트 → Vercel 미리보기(noindex) 까지 돈다. 사람 게이트(의학 검토·게시 승인)는 자동화하지 않는다.
node workers/supporters-build/run.mjs --clinic <id> --url <https://...> [--name 상호] [--logo file.svg] [--youtube 채널] [--deploy] [--build-id <uuid>] [--max-cost-usd 10]
# 단계: evidence → data → discover(채널 발견·엔티티 검증) → youtube(로고·파비콘·채널 집계) → news(뉴스룸: 네이버 뉴스 + 언론보도 게시판) → images(의료법 기준 이미지) → inputs → briefs → generate → build → deploy
node workers/supporters-build/poll.mjs [--loop 300] [--no-deploy] # supporter_builds 큐(status=queued)를 집어 run.mjs 실행
흐름
- 랜딩
/discovery의 URL 신청(DiscoveryLeadModal) →discovery_leads+supporter_builds(queued) 행. poll.mjs가 queued 행을 집어(running 으로 조건부 갱신)run.mjs를 돌린다. 단계마다supporter_builds갱신.- 완료되면
preview_url이 기록되고,/discovery/:id또는/supporters/:id의 "병원 확인 항목" 패널에 미리보기 링크와 입력 폼이 뜬다. - 병원이 입력하면
supporter_inputs에 쌓인다. 재빌드:run.mjs --from data --from-supabase --deploy --build-id <id>(apply_inputs 가 데이터·frontmatter 에 반영).
실행 위치 (권장)
| 단계 | 어디서 | haewon 이 할 일 |
|---|---|---|
| 지금 (파일럿, 월 수 건) | haewon 의 Mac 에서 poll.mjs 를 launchd 로 5분마다. launchd/ 폴더의 plist 를 설치하면 된다 |
설치 명령 한 번. Mac 이 켜져 있어야 돈다 |
| 정착 (월 수십 건, 무인) | Trigger.dev 클라우드. poll.mjs 와 같은 코드를 태스크로 올린다. 타임아웃 없음, 재시도·로그 내장, 무료 구간(월 1,500 run)이면 충분 |
가입(GitHub 계정), 프로젝트 만들고 API 키 1개 전달. 코드·배포는 Claude 가 한다 |
VPS(서버 직접 운영)와 Vercel Functions(최대 800초)는 권하지 않는다. 전자는 관리 부담, 후자는 빌드가 시간 안에 끝나지 않는다.
필요한 것
.env:VITE_SUPABASE_URL,SUPABASE_SERVICE_ROLE_KEY,OPENAI_API_KEY,YOUTUBE_API_KEY,NAVER_CLIENT_ID/NAVER_CLIENT_SECRET(뉴스룸)vercelCLI 로그인 (배포 시). 병원당 프로젝트supporters-<id>를 만든다templates/supporters-astro/(supporters 에서npm run export:template)
단가
글 생성 상한은 실행당 $10 (--max-cost-usd, haewon 결정 2026-09-07). 실측: 편당 $0.05~0.19, 첫 배치 5~6편이면 $0.3~1.
두 번째 병원에서 배운 것 (원진성형외과, 2026-09-07)
- 비브라우저 User-Agent 를 403 으로 막는다 → 브라우저 UA + 식별 문자열.
- 경로 끝 슬래시를 붙이면 404 (뷰성형외과는 반대로 슬래시로 301) → 슬래시를 강제하지 않고 404 면 반대 형태 재시도.
- 페이지 유형 분류가 URL 경로 어휘(system/precautions 등)에 기대면 다른 병원에서 못 잡는다 → 제목·본문 키워드 분류를 보강할 것.