15개 정본 문서에서 날짜별 변경이력, 인시던트 기록, 폐기된 구현 상세를 history/ 디렉토리로 분리. 정본은 현재 상태만 기술하는 백서 형태로 정리. 각 정본에 history 위키링크 추가. 분리된 history 파일 12건: - apisix git push 500, k3s postgresql migration, apisix→traefik 전환 - netbis DDoS 공격, gitea 이전/분리, usb 2.5g hang + NFS hard mount - supabase→patroni, apisix etcd 통합/분리, anomaly-detect 재설계 - patroni failover incident, zlambda nixos migration, ops-agents setup Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.8 KiB
2.8 KiB
date, topic, areas, tags
| date | topic | areas | tags | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 2026-04-08 | anomaly-detect 3차 재설계 과정 (gemma → cohort → agentic Grok-4) |
|
|
anomaly-detect 시스템의 3번의 설계 반복과 최종 agentic 구조 확정 과정.
1차 구현 (2026-04-08 초반) — gemma4:e4b + stats 파이프라인
per-IP 통계 게이트(count/4xx/5xx/499/distinct paths) → 후보 N개 → ollama gemma4:e4b(Q4_K_M, 8.0B) yes/no 분류. Python이 축을 정의하고 LLM은 판정만 수행하는 구조.
2차 구현 (같은 날) — cohort 탐지 추가
_cohort_path_candidates, _cohort_ua_candidates 등 집단 축 탐지 로직 추가. 여전히 "Python이 탐지, LLM이 분류"라는 본질적 한계 동일.
코드 리뷰 수정 2회
초기 리뷰 (커밋 d5310f0)
- LAPI POST 실패 시 dedup 선기록 버그 수정
- XFF CSV 파싱 버그 수정 (
extract_client_ip()헬퍼) - 사설망/Tailscale 필터 개선 (
ipaddress.ip_address().is_private) - dedup.json 원자적 쓰기 (
tempfile+os.replace)
2차 리뷰 (커밋 b0e3c68) — High 5건 / Medium 4건
- H1:
events_count프로토콜 오용 → sample 10건을 events에 풀어서 넣기 - H2:
limit=20000raw 로그 pull →| stats by (remote_addr)서버측 집계 - H4: prompt injection via path →
json.dumps+ 경고 삽입 - H5:
num_predict=80한국어 truncation → 256 - M1~M4, M7: start_at/stop_at, 파일 핸들 누수, ratio에 499 포함, set cap, housekeeping
남은 설계 이슈
- H3: 분산 봇넷 대비 게이트 사각지대 (per-IP 게이트의 한계)
3차 재설계 — agentic 구조 (최종)
사용자 원래 의도 "시계열 DB를 AI에 연결하면 AI가 알아서 찾는다"에 부합하도록 전면 재설계. OpenRouter x-ai/grok-4-fast에 tool 2개(logsql_query, ban_ips)만 노출하는 agentic 구조.
모델 벤치마크 결과
| 모델 | 턴 | 비용 | 결과 |
|---|---|---|---|
| x-ai/grok-4-fast | 4 | $0.0036 | 정답 |
| qwen/qwen3-235b-a22b-2507 | 7 | $0.0012 | 정답 |
| google/gemini-2.0-flash-001 | 10(max) | $0.0026 | 결론 없음 |
| deepseek/deepseek-chat-v3.1 | 10(max) | $0.0127 | 결론 없음 |
E2E 검증
- VictoriaLogs에 270 rows 주입, Grok-4-fast 5턴에 31개 공격 IP 정확 식별, 정상 IP 0건 ban
- DRY_RUN=0 활성화, 실운영 개시
전임자 폐기
ddos-detect(Go, jp1 crowdsec 컨테이너, 60s 폴링, Claude CLI sonnet 호출) — 60s 폴링 + 동기 Claude CLI 구조 한계로 폐기- 제거 항목:
ddos-detect.service, Go 바이너리+소스,ddos-detect.sh,extract_behavior.py,ddos-logs/
참조
infra/anomaly-detect.md— 현재 agentic 구조- Gitea:
kaffa/anomaly-detect,kaffa/ddos-detect(보존)