# hyungi_Document_Server Self-hosted 개인 지식관리(PKM) + 다국 뉴스 비교 분석 웹 애플리케이션. > 모델 이름·엔드포인트·머신 정보는 운영 상태에 따라 변하므로 README 에 박지 않습니다. > 운영 단일 진실 소스(SSOT): `~/.claude/projects/-Users-hyungiahn/memory/infra_inventory.md`. > 모델/엔드포인트/포트/SSH 어디서든 README 와 inventory 가 충돌하면 **inventory 가 정답**입니다. ## 기술 스택 - **백엔드**: FastAPI + SQLAlchemy 2.0 async, APScheduler cron - **DB**: PostgreSQL 16 + pgvector + pg_trgm (단일 `pkm` DB) - **프론트엔드**: SvelteKit 5 (runes mode) + Tailwind CSS 4 - **문서 파싱**: kordoc 마이크로서비스 (HWP/HWPX/PDF → Markdown), LibreOffice headless (오피스), marker (PDF → markdown Phase 1B) - **AI 파이프라인** (역할별, 자세한 모델 매핑은 inventory): - 분류/요약 본체: Mac mini MLX 26B (primary) - Triage / fallback / chat: GPU Ollama 4B - Embedding: GPU Ollama `bge-m3` (1024d) - Reranker: GPU TEI 컨테이너 `bge-reranker-v2-m3` - OCR: docker compose `ocr-service` (Surya OCR GPU) - STT: Mac mini MLX Whisper large-v3 - Premium (수동 trigger): Anthropic Claude (`require_explicit_trigger`) - **인증**: JWT (access) + HttpOnly cookie (refresh) + TOTP 2FA - **인프라**: Docker Compose, Caddy (HTTP only, 앞단 home-caddy 가 HTTPS 종료), Synology NAS NFS ## 주요 기능 - **문서 자동 분류/태그/요약** — Triage(4B) → Deep summary(26B) tier 분리, 백로그 guard / 텍스트 슬라이스 / inconsistency 감지 - **하이브리드 검색** — pgvector 벡터 + pg_trgm 전문검색 + reranker (bge-reranker-v2-m3) + Ask pipeline (HyDE / evidence_service) - **다국어 OCR** — Surya OCR GPU (한/영/일/중/독/불 등), NFC/NFD 경로 정규화 - **음성/영상 전사** — MLX Whisper large-v3, `/audio` `/video` 라우트 + direct play - **법령 변경 모니터링** — `law_monitor` cron, freshness decay (365일 반감기) - **이메일 자동 수집** — MailPlus IMAP, NFS 저장 - **Phase 4 Global Digest** — 매일 04:00 KST 7일 rolling 뉴스 country×topic 2-level 비교 (`/digest`) - **야간 뉴스 브리핑** — 매일 05:10 KST KST 자정~05:00 5시간 윈도우, topic×country 비교 분석 1페이지 카드 (`/news`) - **자료실 (Library)** — 카테고리 facet 분류 + AI 제안 1-click 승인 - **메모/이벤트/공부** — 5초 행동 기록 메모, 일정/할 일/회고 events 도메인, 가스기사 학습 워크스페이스 (274 개념 + 2,100 기출) - **마크다운 canonical layer** — extracted_images NAS 저장 + `document_images` 메타 + 단기 토큰 인증 (`?token=`) ## Quick Start ```bash git clone https://git.hyungi.net/hyungi/hyungi_document_server.git cd hyungi_document_server # 인증 정보 (DB 비밀번호, JWT secret, Claude API key 등) cp credentials.env.example credentials.env $EDITOR credentials.env # AI 모델 / 엔드포인트 / 경로 $EDITOR config.yaml # inventory 참조하면서 채움 $EDITOR .env # POSTGRES_PASSWORD, MAC_MINI_HOST, NAS_NFS_PATH 등 docker compose up -d --build ``` 운영 도메인 (GPU 서버 배포 기준): `https://document.hyungi.net` API 문서: `https://document.hyungi.net/docs` ## 디렉토리 구조 ``` ├── app/ FastAPI 백엔드 │ ├── api/ 라우터 (documents, search, briefing, digest, memos, events, study, …) │ ├── workers/ APScheduler / queue (briefing_worker, digest_worker, classify_worker, …) │ ├── services/ 도메인 로직 (briefing/, digest/, search/, clustering_common, …) │ ├── ai/client.py AIClient (call_triage / call_primary / call_fallback, parse_json_response) │ ├── prompts/ *.txt 프롬프트 (분류, 요약, briefing_comparative, digest_topic, …) │ ├── policy/ AI envelope + prompt_render │ └── models/ SQLAlchemy ORM ├── frontend/ SvelteKit 5 (runes mode) + Tailwind │ └── src/routes/ /news (아침 브리핑) /library /memos /audio /video /study /digest /ask … ├── services/ │ ├── kordoc/ HWP/HWPX/PDF 파싱 (Node.js) │ ├── ocr/ Surya OCR GPU 서비스 (FastAPI) │ └── marker/ PDF → markdown Phase 1B ├── migrations/ 255+ SQL migrations (schema_migrations 추적) ├── docs/ 설계 문서 └── tests/ pytest ``` `gpu-server/` 폴더는 v1 잔재로 deprecated (현재 AI Gateway 는 `~/home-gateway/` 별 repo). ## 인프라 구성 (운영 기준) | 머신 | 역할 | |---|---| | **GPU 서버** (메인) | Docker Compose (fastapi, frontend, postgres pkm, kordoc, ocr-service, marker-service, reranker(TEI), caddy), Ollama (`bge-m3`, 4B chat), home-gateway 별 compose | | **Mac mini** | MLX 26B primary 추론 + MLX Whisper STT (HTTP 추론 endpoint only, ingress 역할 0) | | **Synology NAS** | 파일 원본 (`/volume4/Document_Server/PKM/`), Synology Office/Drive/Calendar/MailPlus, NFS export → GPU | | **VPS-2** (OVH) | 메일 relay (`relay.hyungi.net:587` SASL+TLS+DKIM+LE), Gitea bare mirror, Secondary MX | 상세 IP / 모델 / 컨테이너 / drift / verify 명령은 `infra_inventory.md` 참조. ## 운영 변경 정책 1. inventory 먼저 갱신 2. `config.yaml` / `credentials.env` 갱신 3. deploy (commit → push Gitea → GPU `git pull && docker compose up -d --build`) 4. verify (smoke endpoints, postgres count, 모니터링) 순서를 어기면 drift. drift 발견 시 `infra_inventory.md` 의 Drift Log 에 등록 후 정정. ## 문서 - [아키텍처](docs/architecture.md) — DB 스키마, AI 전략, UI 설계 - [배포 가이드](docs/deploy.md) — Docker Compose 배포 - [개발 단계](docs/development-stages.md) — Phase 별 roadmap (Phase 4 Global Digest / 야간 브리핑 등 신규 phase 는 inventory + plan 파일 우선)