o2o-infinith-demo/workers/supporters-build/README.md
Haewon Kam ee8c06f53b feat(supporters): haewon 결정 반영 — 채널 인기 전체 탭 제거, 단가 상한 $10 기본, 큐 폴러(poll.mjs)+launchd, /supporters/:id 페이지, URL 신청→빌드 큐, 수집기 UA·슬래시 수정, 기획 목록 일반화(원진 6편)
WIP: 원진성형외과 회귀는 글 생성 단계에서 네트워크 끊김(fetch failed)으로 중단. 다음 세션에 --from generate 로 재실행.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 18:54:01 +09:00

2.9 KiB

서포터즈 자동 빌드 워커

병원 홈페이지 URL 하나로 근거 수집 → 팩트 시트·의료진 초안 → 첫 배치 기획 → 글 생성(GPT-4.1, 게이트·근거 대조) → Astro 빌드·발행 게이트 → Vercel 미리보기(noindex) 까지 돈다. 사람 게이트(의학 검토·게시 승인)는 자동화하지 않는다.

node workers/supporters-build/run.mjs --clinic <id> --url <https://...> [--name 상호] [--deploy] [--build-id <uuid>] [--max-cost-usd 10]
node workers/supporters-build/poll.mjs [--loop 300] [--no-deploy]      # supporter_builds 큐(status=queued)를 집어 run.mjs 실행

흐름

  1. 랜딩 /discovery 의 URL 신청(DiscoveryLeadModal) → discovery_leads + supporter_builds(queued) 행.
  2. poll.mjs 가 queued 행을 집어(running 으로 조건부 갱신) run.mjs 를 돌린다. 단계마다 supporter_builds 갱신.
  3. 완료되면 preview_url 이 기록되고, /discovery/:id 또는 /supporters/:id 의 "병원 확인 항목" 패널에 미리보기 링크와 입력 폼이 뜬다.
  4. 병원이 입력하면 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
  • vercel CLI 로그인 (배포 시). 병원당 프로젝트 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 등)에 기대면 다른 병원에서 못 잡는다 → 제목·본문 키워드 분류를 보강할 것.