diff --git a/CHECK_POINT.md b/CHECK_POINT.md index 4d11799..5b68464 100644 --- a/CHECK_POINT.md +++ b/CHECK_POINT.md @@ -1,209 +1,121 @@ # web-backend CHECK_POINT -> NAS Docker 11 컨테이너(9 백엔드 + frontend + deployer). Synology Celeron J4025 (2C 2.0GHz) 18GB. -> 2026-05-18 작성 — uvicorn CPU 폭주 진단 결과 정리. - -## 🔴 즉시 (오늘, 총 1시간 5분) - -### 1. 09:00 cron 5분 스태거링 ⭐ 가장 큰 효과 - -**파일**: `agent-office/app/scheduler.py:72-76` -```python -# 변경 전 — 09:00 동시 실행 (CPU 폭주 원인 #1) -scheduler.add_job(_run_insta_trends_collect, "cron", hour=9, minute=0) -scheduler.add_job(_run_lotto_schedule, "cron", day_of_week="mon", hour=9, minute=0) -scheduler.add_job(_run_youtube_research, "cron", hour=9, minute=0) - -# 변경 후 — 5분 스태거링 -scheduler.add_job(_run_insta_trends_collect, "cron", hour=9, minute=0, id="insta_trends") -scheduler.add_job(_run_lotto_schedule, "cron", day_of_week="mon", hour=9, minute=5, id="lotto_curate") -scheduler.add_job(_run_youtube_research, "cron", hour=9, minute=10, id="youtube_research") -``` - -**파일**: `realestate-lab/app/main.py:51` -```python -# 변경 전 -scheduler.add_job(scheduled_collect, "cron", hour=9, minute=0, id="collect") - -# 변경 후 -scheduler.add_job(scheduled_collect, "cron", hour=9, minute=15, id="collect") -``` - -- [x] agent-office scheduler.py 수정 (2026-05-18) -- [x] realestate-lab main.py 수정 (2026-05-18) -- [ ] git commit + push (Gitea Webhook 자동 빌드) +> NAS Docker (Synology Celeron J4025 2C 2.0GHz, 18GB). 16+ 컨테이너(14 서비스 + Redis + frontend + deployer). +> 2026-06-12 갱신 — 5/18 CPU 진단·NAS↔Windows 분산부터 6/12 음악 파이프라인 신뢰성까지 반영. +> 운영 세부(DB·스케줄러·env·함정)는 `memory/service_.md`가 authoritative. 이 파일은 **무엇이 끝났고 다음에 뭘 하나**의 보드. --- -### 2. insta-lab Playwright Semaphore(1) ⭐ +## ✅ 완료 타임라인 (5/18 → 6/12) -**파일**: `insta-lab/app/main.py` (모듈 레벨 추가) -```python -import asyncio +### 5/18~22 — CPU 진단 + NAS↔Windows 분산 + 로또 자율화 +- **CPU 폭주 즉시 5건**: 09:00 cron 5분 스태거링(insta/lotto/youtube/realestate) · lotto Monte Carlo 08:30 이동 · insta Playwright Semaphore(1) · healthcheck 60s · uvicorn `--workers 1` · realestate 수집 병렬화 +- **Redis 분산** (박재오 7결정): Redis 컨테이너 신설(7-alpine 256MB AOF) · insta/music/video-lab을 `queue:*-render` push 게이트웨이로 전환(렌더는 Windows web-ai 워커) · internal webhook + nginx 3-layer 차단 · stock webai_cache TTLCache +- **video-lab 신설** (18801) — Windows video-render의 NAS 짝 (sora/veo/kling/seedance) +- **로또 능동 시그널 v1** — lotto_signals/baselines, z-score, urgent/digest 텔레그램, cron 4종 +- **weight-evolver 자율 학습 v2** — weight_trials/auto_picks, 주간 generate→apply→evaluate 루프 -# 모듈 레벨에 한 번만 선언 -RENDER_SEMAPHORE = asyncio.Semaphore(1) # Chromium 동시 실행 1개로 제한 +### 5/25~26 — tarot/saju 분리·신설 + UI +- **tarot-lab 분리** (18250) — agent-office에서 독립, Claude 3-card +- **saju-lab 신설** (18300) — saju-web TS→Python 포팅, lunar↔solar 내장, 궁합 포함 +- **saju UI v1 + v2 리디자인** + fortune_scores/lucky/monthly_flow 추가 +- image-lab public gateway + `/media/image/` 정적 서빙 · tarot max_tokens 2800 truncation fix -# 카드 렌더 백그라운드 함수에 감싸기 -async def _bg_render(task_id: str, slate_id: int): - async with RENDER_SEMAPHORE: - await card_renderer.render_slate(slate_id, ...) -``` +### 5/28 — 공유 로그 인프라 +- **`_shared/access_log` 공용 모듈** (lotto/stock/music/insta/realestate 5종) — ring buffer + middleware + `/logs/recent` +- agent-office `/agents/{id}/logs`가 서비스 로그 merge · 매일 03:00 agent_logs 90일 retention -- [x] card_renderer.render_slate를 Semaphore(1)로 감쌈 (2026-05-18, lazy init) -- [ ] 동시 2개 요청 테스트 (curl 동시 2회 → 순차 처리되는지 확인) +### 5/31 — 자율 인텔리전스 2종 (스마트에이전트 1·2번) +- **로또 자가학습 백테스트·캘리브레이션 v3** — backtest_runs/winner_calibration, forward 가상구매 3전략, ε-게이팅 lift 학습, 일요회고 cron. 역대 캘리브레이션 백필 1197/1197 (6/11) +- **주식 보유종목 인텔리전스** — holdings_signals, market_events/news_issues/portfolio_health, decide_action 매트릭스, EOD(16:50)+브리핑(08:30) cron + +### 6/01~06 — 보안 + 인스타 카드뉴스 +- nginx CVE 대응 (CVE-2026-42945 · CVE-2026-9256 → 1.30.2) +- **인스타 카드뉴스 품질 고도화 v2** + zip 패키지(10 PNG + caption.txt) + 글자수 가이드 + +### 6/11 — 자율 발급 + 오버사이트 (스마트에이전트 3번) +- **인스타 자율 카드 발급** — 4신호 선별(selection.py) + Claude Haiku 카드가치 판단 + 승인 게이트 + 발행 상태머신. 텔레그램 issue_approve/reject/regen 콜백. **autonomous_issue 기본 OFF** +- **에이전트 횡단 오버사이트(백엔드)** — `GET /api/agent-office/activity` 통합 피드 + 필터(agent_id/type/status/days). main `2c2828c` 배포 +- CLAUDE.md 카탈로그 슬림화(966→484, 서비스별 메모리 분담) · packs jti SQLite 영속화 · lotto deep CuratorError fallthrough fix + +### 6/12 — 음악 파이프라인 신뢰성·복구 (직전 작업) +- **자동 재시도**: orchestrator step 3회 backoff 재시도(publish 제외 — 업로드 비멱등) +- **수동 재개**: `POST /api/music/pipeline/{id}/retry` — 실패 step 판별·재개, retrying 레이스 가드, publish+업로드완료 시 409 +- **실패 알림**: agent-office youtube_publisher가 신규 failed 감지 → 텔레그램 `⚠️실패` + `[🔄재시도]` 인라인 버튼 → music-lab retry 프록시 +- 커밋·push·자동배포 완료 (main = origin/main) + +> **스마트에이전트 3종 전부 가동**: stock(보유종목) · insta(자율발급) · lotto(진화). CEO 오버사이트(통합 활동 피드) 백엔드 완료. --- -### 3. healthcheck interval 60s +## 🔴 즉시 — 진행 중 / 대기 -**파일**: `docker-compose.yml` (모든 9 컨테이너) -```yaml -# 변경 전 -healthcheck: - interval: 30s +### 1. agent oversight 프론트 NAS 배포 ← 현재 트랙 +- web-ui `ActivityTimeline`(AgentOffice 우측 기본 패널) main 머지 완료(`d0bf5fd`), 로컬 빌드 검증 완료 +- **남은 것**: `npm run release:nas` (Vite 빌드 → Z: robocopy). ⚠️ **Z: 드라이브 미마운트** — `\\gahusb.synology.me\docker`를 Z:로 연결 후 실행 (`.env.local`의 `NAS_FRONTEND_DEST_WIN=Z:\webpage\frontend\`) -# 변경 후 -healthcheck: - interval: 60s -``` - -- [x] docker-compose.yml 10개 healthcheck 일괄 변경 (9 백엔드 + frontend, 2026-05-18) -- [ ] `docker compose up -d` 재기동 -- [ ] `docker stats` 로 CPU 5% 정도 감소 확인 +### 2. 운영 검증 (분산·자율 학습) +- [ ] Redis 분산 E2E (NAS push → Windows 워커 → webhook 전체 흐름) +- [ ] lotto weight-evolver 주간 사이클(월 generate+apply → 토 evaluate) 정상 동작 + evolution report 텔레그램(토 22:15) --- -### 4. uvicorn --workers 1 명시 +## 🟡 미완성 큰 기능 -**모든 Dockerfile CMD**: -```dockerfile -CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "1"] -``` - -영향 9 파일 (모두 2026-05-18 적용): -- [x] lotto/Dockerfile -- [x] stock/Dockerfile -- [x] music-lab/Dockerfile -- [x] insta-lab/Dockerfile -- [x] realestate-lab/Dockerfile -- [x] agent-office/Dockerfile -- [x] personal/Dockerfile -- [x] packs-lab/Dockerfile -- [x] travel-proxy/Dockerfile - -→ `docker compose build --no-cache` 후 재기동. +### Video Studio 프론트 `/studio` — 백엔드 완료, UI 미구현 +- **백엔드 완료·배포**: image-lab(NAS 18802) ✅ + image-render(Windows web-ai) ✅ + video-lab(기존) ✅ (`plans/2026-05-23-video-studio-backend.md` 전부) +- **빠진 것**: web-ui React Flow 노드 캔버스(ImageGenNode → ImageToVideoNode). 백엔드 plan이 "프론트는 Plan 2"로 미뤘으나 Plan 2 미생성 +- spec: `docs/superpowers/specs/2026-05-23-video-studio-node-canvas-design.md` (untracked — 커밋 필요) +- 목적: 무신사·우리카드 AI 영상 공모전 실전 제작 도구 --- -### 5. lotto Monte Carlo 08:05 → 08:30 +## 🟡 후속 (직전 작업 범위 밖) -**파일**: `lotto/app/main.py:86` -```python -# 변경 전 — stock 08:00과 5분 차이로 겹침 -scheduler.add_job(_run_simulation_job, "cron", hour="0,4,8,12,16,20", minute=5) - -# 변경 후 — 25분 분리 -scheduler.add_job(_run_simulation_job, "cron", hour="0,4,8,12,16,20", minute=30) -``` - -- [x] lotto/app/main.py 수정 (2026-05-18) +### music 파이프라인 stuck 감지 +- 6/12 신뢰성 작업이 명시적으로 남긴 갭: `*_running` hang · `*_pending` 방치 · retrying 중 컨테이너 재시작 시 stuck(현 retry 가드가 state=failed라 재retry 불가) +- 상세: `memory/service_music.md` "파이프라인 신뢰성/복구 — 범위 밖" --- -## 🟡 중기 (1~2주) +## 🟢 백로그 아이디어 -### 6. Chromium Browser Pool 재설계 (insta-lab) ✅ 2026-05-18 -- 매번 launch X → 1개 인스턴스 재사용 -- 카드 10장 렌더 시간 30% 단축 기대 -- [x] `card_renderer.py` 내부에 모듈 레벨 `_PLAYWRIGHT`/`_BROWSER` + `init_browser`/`shutdown_browser` 함수 (별도 모듈 분리 안 함, 같은 파일에 인접 배치) -- [x] `_render_slate_locked` 본체에서 `_get_browser()` 재사용 (crashed 시 lazy 재초기화) -- [x] `main.py` startup hook에서 `init_browser()`, shutdown hook에서 `shutdown_browser()` +- **Redis 큐 통합 모니터링** — agent-office에 `queue:*-render`/`queue:paused` 길이·상태 패널 (NAS↔Windows 작업 흐름 가시화) +- **weight-evolver 성과 대시보드** — auto_picks 적중 추이 + weight_base 진화 그래프 (자율 학습 실효성 검증) +- **lotto-signals 패턴 확장** — adaptive baseline + z-score + urgent 텔레그램을 stock(이상치)·realestate(경쟁률 급변)에 재사용 +- **nginx internal 차단 표준화** — insta/music/video/image 3-layer 차단을 공통 include로 추출 +- **agent-office 레거시 정리** — tarot_readings 테이블 잔존(tarot-lab 분리 후), seed "blog" 죽은 에이전트 -### 7. stock 뉴스 스크랩 비동기화 — ⚠️ 보류 2026-05-18 -- **재진단**: stock은 `BackgroundScheduler` 사용 중 → main loop 블로킹 없음 (이미 별도 thread) -- `fetch_market_news`의 4개 동기 `requests.get`은 network I/O wait라 CPU 거의 사용 안 함 -- `to_thread`로 wrap해도 BackgroundScheduler 환경에서 사실상 의미 없음 -- 진짜 효과를 보려면 AsyncIOScheduler 전환 + scraper.py 4개 fetch를 `aiohttp` 병렬로 — **큰 리팩토링 vs 효과 불명확** -- [ ] 박재오 판단: 큰 리팩토링 진행 여부 - -### 8. realestate 수집 병렬화 ✅ 2026-05-18 -- **파일**: `realestate-lab/app/main.py:scheduled_collect` -- `collect_all()` + `delete_old_completed_announcements()` 병렬 -- BackgroundScheduler 환경이라 `asyncio.gather` 대신 `ThreadPoolExecutor(max_workers=2)` 사용 (효과 동일) -- 매칭은 순차 유지 (DB 일관성) -- [x] ThreadPoolExecutor 적용 - -### 9. lotto Monte Carlo 시뮬레이션 빈도 검토 -- 현재 6회/일 (00·04·08·12·16·20) -- 실제 필요 빈도 박재오 결정 — 3회/일(아침·점심·저녁)로 줄이면 CPU 50% 감소 -- [ ] 박재오 의사결정 후 cron 변경 - ---- - -## 🟢 장기 (1개월+) - -### 10. 무거운 작업 Windows AI 서버로 이전 ✅ 이미 적용 상태 (2026-05-18 확인) -- **확인 결과**: NAS `.env`가 이미 `LLM_PROVIDER=claude` + `OLLAMA_URL=http://192.168.45.59:11435`로 설정됨 -- 실 운영은 Anthropic Claude (원격 API) — NAS Celeron에서 LLM 추론 안 함 -- Ollama fallback 사용 시에도 Windows AI 서버로 통일 -- stock 외 다른 컨테이너에 ollama/qwen 호출 코드 없음 -- 결론: 코드/설정 변경 불필요 - -### 11. 컨테이너 리소스 제한 — ❌ 진행 금지 (박재오 명시 2026-05-18) -- J4025 2C 환경에서 cpus 0.5 제한은 오히려 throughput 손해 -- 향후 작업자 무심코 도입하지 말 것 - -### 12. NAS 업그레이드 검토 — ⏸️ 보류 (박재오 명시 2026-05-18) -- 현재: Celeron J4025 (2C 2.0GHz) -- 대안: Ryzen N5105 (4C 2.0GHz) NAS — 4코어로 병렬성 2배 -- 자금·우선순위 결정 대기 - ---- - -## ✅ 최근 완료 (참고) - -- 2026-05-15: insta-lab 신설 (포트 18700, Jinja2 + Playwright + Claude Sonnet) -- 2026-05-16: insta-lab Playwright 1080×1350 PNG 렌더 완성 -- 2026-05-17: agent-office random idle 제거, ADMIN_API_KEY 강화 (stock) -- 2026-05-17: insta-lab minimal theme + design_importer 추가 -- 2026-05-17: blog-lab 트랙 완전 폐기 (docker-compose에 없음, 위키 정정 완료) -- 2026-05-18: 🔴 즉시 5건 일괄 적용 — 09:00 cron 스태거링(insta/lotto/youtube/realestate), lotto Monte Carlo 08:30, insta-lab Semaphore(1), healthcheck 60s, uvicorn --workers 1 명시 (사용자 push + NAS deployer 재기동 대기) -- 2026-05-18: 🟡 중기 2건 적용 — #6 insta-lab Chromium Browser Pool (lifecycle hook), #8 realestate ThreadPoolExecutor 병렬 (collect/delete). #7 stock async는 BackgroundScheduler 사용 중이라 재진단 후 보류 (효과 미미). #9 Monte Carlo 빈도는 박재오 결정 대기. -- 2026-05-18: 🟢 장기 진단·결정 — #10은 이미 적용 상태 확인 (LLM_PROVIDER=claude, OLLAMA_URL=Windows AI). #11 컨테이너 리소스 제한 박재오 진행 금지. #12 NAS 업그레이드 보류. web-ai V1(:8000)+V2(:8001) 4개 process 종료 — NAS API polling 부담 즉시 감소. +### 보류 유지 (박재오 판단 대기) +- stock 뉴스 스크랩 비동기화 — BackgroundScheduler I/O wait라 CPU 미미, 큰 리팩토링 vs 효과 불명확 +- lotto Monte Carlo 빈도(6→3회/일) — CPU 50%↓ vs 자율 학습 정확도 trade-off +- 컨테이너 리소스 제한 — ❌ 박재오 금지(J4025 2C throughput 손해) · NAS 업그레이드 ⏸️ 보류(Redis 분산으로 우선순위↓) --- ## 🔧 진단 커맨드 (NAS bash) ```bash -# 실시간 CPU 사용 (상위 15) -top -b -n 1 | head -25 - -# 프로세스별 CPU 정렬 -ps aux --sort=-%cpu | head -15 - -# uvicorn·chromium·python 프로세스만 -ps aux | grep -E "uvicorn|chromium|python" | grep -v grep - -# 스케줄러 실행 로그 (최근 50) +top -b -n 1 | head -25 # CPU 상위 +docker stats --no-stream # 컨테이너별 CPU/메모리 +docker exec redis redis-cli PING # Redis 헬스 +docker exec redis redis-cli KEYS 'queue:*' # 큐 키 목록 +docker exec redis redis-cli LLEN queue:insta-render # 큐 길이 docker logs agent-office 2>&1 | grep -E "APScheduler|executing" | tail -50 - -# insta-lab Chromium 프로세스 개수 -docker exec insta-lab ps aux | grep chromium | wc -l - -# 컨테이너별 CPU/메모리 실시간 -docker stats --no-stream +docker exec insta-lab ps aux | grep chromium | wc -l # (분할 후 0이어야 정상) ``` --- ## 📚 참고 -- 진단 풀 보고서: `C:\Users\jaeoh\Documents\Obsidian Vault\raw\2026-05-18-NAS-uvicorn-CPU-진단-개선안.md` -- 위키 페이지: [[사업-개인-웹-플랫폼]] (CPU 부하 진단 섹션 + 컨테이너 표) -- docker-compose.yml: 본 디렉토리 루트 +- 메모리 인덱스: `memory/MEMORY.md` (14 서비스 × `service_.md` authoritative) +- Windows 워커 짝: web-ai 레포 (insta/music/video/image-render) +- spec/plan: `docs/superpowers/specs|plans/` +- docker-compose.yml: 루트 ## 변경 이력 -- 2026-05-18: 페이지 신설. 즉시 5건 + 중기 4건 + 장기 3건. 진단 커맨드. +- 2026-05-18: 페이지 신설. CPU 진단 즉시 5건 + 7결정 분산 가이드. +- 2026-05-22: 분산·자율화 구현 반영. Redis 분할·lotto 능동시그널·weight-evolver. +- 2026-06-12: **5/25~6/12 전체 작업 반영** — tarot/saju 분리·신설, _shared 로그, lotto v3 백테스트, stock 보유종목 인텔, nginx CVE, insta 카드뉴스 v2 + 자율발급, 에이전트 오버사이트, music 파이프라인 신뢰성. 미완성 큰 기능(Video Studio 프론트) + 후속(music stuck 감지) + 백로그 재편. 현재 트랙(oversight 프론트 배포) 명시.