2단계에서 저장한 sources/partial 을 운영자가 볼 수 있게 한다. 운영자 목적은 **진단**이라
상태를 접지 않는다 — blocked(IP 회전으로 자동 회복)와 env_blocked(사람이 환경·설정을 고쳐야 함)를
뭉뚱그리면 회복될 일에 매달리거나 손봐야 할 설정을 방치하게 된다.
API
- /v1/lps/products, /v1/lps/products/{code}/history 둘 다 sources·partial 을 싣는다.
- 이력은 **시점마다** 싣는다. 최신 상태를 과거 시점의 몰별 표 옆에 붙이면 '그때도 막혔던 것처럼'
보여 오해를 부른다 — 그래서 ProductItem 이 아니라 PricePoint 에 담았다.
화면
- lib/sourceState.ts: 상태별 라벨·색·설명·confirmed 를 한곳에. 미지의 상태가 와도 화면이 깨지지
않는다(값 그대로 표시 + '모름' 취급). 색은 전부 @theme 토큰 참조(raw hex 금지).
- 상품 목록: partial 이면 '일부 확인 못함' 배지 + 툴팁에 어느 몰인지.
- 몰별 비교 카드 위: 몰별 상태·수집 건수·실패 사유 원문(툴팁). 가격표에 없는 몰이 **왜** 없는지를
여기서 답한다 — by_mall 은 가격이 있는 몰만 담으므로 그 답이 여기밖에 없다.
검증: ASGI 직접 호출로 두 엔드포인트 응답 확인(한글 사유 포함), tsc 오류 없음.
테스트 3건 추가(목록 노출 / 시점별 상태가 각각 다르게 / 컬럼 추가 이전 옛 행 호환).
전체 292 passed. 진행 상황은 docs/result-states.md 4절.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| Dockerfile | ||
| index.html | ||
| nginx.conf | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| tsconfig.tsbuildinfo | ||
| vite.config.ts | ||
LPS 관리자 페이지
LPS(인터넷 최저가 검색)의 운영 지표를 보고 필수 액션(수동 재검색·DEAD 재큐)을 수행하는
React 관리자 페이지입니다. 서버 동작 설정은 여기서 바꾸지 않습니다 — 설정 소스는 서버의
config.<env>.toml 하나(2026-07-13 협의).
실행 (개발)
npm install
npm run dev # http://localhost:5174 — /v1·/healthz 는 vite 프록시로 :9600 에 전달(CORS 불필요)
LPS API 를 먼저 띄워두세요: cd ../lps && ./run_local_server.sh.
다른 호스트의 API 를 보려면 VITE_LPS_URL=http://<host>:9600 npm run dev 또는
앱의 설정 페이지에서 API 주소를 지정합니다(guard 켜진 prod 는 API 키도 입력 — X-API-Key 자동 첨부).
페이지
| 페이지 | 내용 | 데이터 |
|---|---|---|
| 대시보드 | 큐/차단/비용/DB풀 스탯 타일 + 임계 배너 + 큐 추이(5초 폴링) | GET /v1/lps/ops |
| 작업 큐 | 목록(상태·검색 필터)·상세(결과/원가/오류)·DEAD 재큐 | /v1/lps/jobs, /jobs/{id}/requeue |
| 상품·가격 | 가격 추이 3선(네이버·쿠팡·최종)·몰별 최저가·검증 링크·지금 다시 검색 | /v1/lps/products, /products/{code}/history, POST /search |
| 크롤 상태 | IP 세션 종료사유 도넛·요청 수 분포(+차단 시작 기준선 = 예산 튜닝 뷰)·차단 이력 | /v1/lps/stats/ip-sessions, /stats/bot |
| 비용 | 시간별 원가 스택(AI vs 프록시)·건당 평균·평균 소요 | /v1/lps/stats/cost |
| 테스트 검색 | 임의 상품을 실제 파이프라인에 흘려 셀렉터·프록시·AI 매칭 점검 — 진행 스텝퍼·파이프라인 퍼널·소스별·검색 원가·매칭 상품 | POST /search + GET /jobs/{id} 폴링 |
테스트 검색은 실제 크롤이라 프록시 비용이 발생하고 결과가 비용 통계에 집계됩니다. 워커가 떠 있어야 동작합니다(없으면 대기에서 멈춤). 상품코드는
TEST-<시각>자동 생성 — 작업 큐의 "테스트만" 필터로 걸러볼 수 있고, negodata 는 UUID 코드만 매핑하므로 연동에 영향이 없습니다.
스택·규칙
- Vite + React + TS + Tailwind v4 + recharts + @tanstack/react-query + react-router (negodata 프론트와 동일 계열, 경량)
- 색 토큰은 숫자 스케일(
src/index.css@theme). 차트 시리즈 색은 엔터티 고정 — 네이버#008a43(적록색약 분리 검증 통과 톤) · 쿠팡#f0455b· 최종#4f46e5. 순서·색 재배정 금지. - 빌드:
npm run build(tsc 포함) →dist/