f4eef9e6e0
신규 워커 app/workers/inbox_ingest.py (337줄):
- 5분 APScheduler cron (mailplus_archive 와 분리 — INBOX root archive vs DocumentServer/Ingest folder)
- UID SEARCH SINCE 14일 (UNSEEN 단독 의존 X, 사용자가 MailPlus UI 에서 먼저 읽어도 누락 회피)
- Message-ID 정규화 또는 imap:{folder}:{uidvalidity}:{uid} fallback → source_external_id always non-null
- ON CONFLICT DO NOTHING (DB unique 진실원장)
- 신규 row 만 BODY parse: snippet + HTML stripping + attachment metadata (binary 저장 X)
- enqueue_stage(doc.id, classify) 로 기존 classify pipeline 진입
- HC.io heartbeat (옵션, INBOX_INGEST_HC_URL)
- parse 실패 분기: row 생성 전 (logger.error + HC fail) / 후 (email_metadata.parse_error 기록)
env (credentials.env.example):
- INBOX_INGEST_ENABLED=false (기본 dormant, 사용자가 alias/folder 셋업 후 true)
- INBOX_INGEST_FOLDER=DocumentServer/Ingest
- INBOX_INGEST_DAYS=14
- INBOX_INGEST_HC_URL=
main.py:
- inbox_ingest_run import + scheduler.add_job interval 5m
email_ingest 정책 (사용자 라운드 2026-05-12):
- 직접 events row 생성 X
- 이메일은 universal inbox item, source_channel=email memo 로 저장
- classify_worker 가 ai_event_kind 채움 (별 PR 의 4B robustness fix 선결)
- 사용자 1-click promote 만이 events row 생성 path
plan: ~/.claude/plans/document-enchanted-candy.md
73 lines
2.8 KiB
Bash
73 lines
2.8 KiB
Bash
# ═══════════════════════════════════════════════════
|
|
# hyungi_Document_Server — 인증 정보 템플릿
|
|
# 실제 값을 채워서 credentials.env로 저장
|
|
# ═══════════════════════════════════════════════════
|
|
|
|
# ─── PostgreSQL ───
|
|
POSTGRES_HOST=localhost
|
|
POSTGRES_PORT=5432
|
|
POSTGRES_DB=pkm
|
|
POSTGRES_USER=pkm
|
|
POSTGRES_PASSWORD=
|
|
|
|
# ─── AI: Mac mini MLX (Tailscale 경유, Qwen3.5 기본 모델) ───
|
|
MLX_ENDPOINT=http://100.76.254.116:8800/v1/chat/completions
|
|
MLX_MODEL=mlx-community/Qwen3.5-35B-A3B-4bit
|
|
|
|
# ─── AI: Claude API (종량제, 복잡한 분석 전용) ───
|
|
CLAUDE_API_KEY=
|
|
|
|
# ─── AI Gateway (같은 Docker 네트워크) ───
|
|
AI_GATEWAY_ENDPOINT=http://ai-gateway:8080
|
|
|
|
# ─── NAS (NFS 마운트) ───
|
|
NAS_NFS_PATH=/mnt/nas/Document_Server
|
|
NAS_DOMAIN=ds1525.hyungi.net
|
|
NAS_TAILSCALE_IP=100.101.79.37
|
|
NAS_PORT=15001
|
|
|
|
# ─── Synology MailPlus (이메일 수집 + SMTP 알림) ───
|
|
MAILPLUS_HOST=mailplus.hyungi.net
|
|
MAILPLUS_PORT=993
|
|
MAILPLUS_SMTP_PORT=465
|
|
MAILPLUS_USER=hyungi
|
|
MAILPLUS_PASS=
|
|
# PR-4 inbox@hyungi.net IMAP ingest (DocumentServer/Ingest 폴더 → memo).
|
|
# enable 시 INBOX_INGEST_ENABLED=true. 폴더는 alias 수신 메일이 자동 이동되는 곳.
|
|
INBOX_INGEST_ENABLED=false
|
|
INBOX_INGEST_FOLDER=DocumentServer/Ingest
|
|
INBOX_INGEST_DAYS=14
|
|
INBOX_INGEST_HC_URL=
|
|
|
|
|
|
# ─── Synology Calendar (CalDAV, 태스크 관리) ───
|
|
CALDAV_URL=https://ds1525.hyungi.net/caldav/
|
|
CALDAV_USER=hyungi
|
|
CALDAV_PASS=
|
|
|
|
# ─── kordoc 마이크로서비스 ───
|
|
KORDOC_ENDPOINT=http://kordoc-service:3100
|
|
|
|
# ─── 인증 (JWT + TOTP) ───
|
|
JWT_SECRET=
|
|
TOTP_SECRET=
|
|
|
|
# ─── 뉴스 수집: NYT API ───
|
|
NYT_API_KEY=
|
|
|
|
# ─── 국가법령정보센터 (법령 모니터링) ───
|
|
LAW_OC=
|
|
|
|
# ─── Phase 3.5 B2: verifier numeric_conflict promote 실험 ───
|
|
# 0=off (기본, critical/minor 둘 다 medium), 1=on (critical → strong, minor 는 medium 유지).
|
|
# ⚠ env 변경 후 process restart 필수 (docker compose restart fastapi) — _SEVERITY_MAP 가 import time 평가됨.
|
|
# B3 FP 검증 (true FP < 20%) 통과 후만 production 적용.
|
|
VERIFIER_NUMERIC_PROMOTE=0
|
|
|
|
# ─── Phase 3.5 fix2: eval runner shared secret ───
|
|
# /ask 엔드포인트의 X-Source=eval / X-Eval-Case-Id 헤더 신뢰 검증 토큰.
|
|
# 비어있거나 클라이언트 X-Eval-Token 와 불일치 시 eval 헤더 거부 (warning log + source='document_server' 강등).
|
|
# 충분히 긴 random secret 권장 (예: openssl rand -hex 32).
|
|
# scripts/run_eval_ask.py runner 가 동일 값을 X-Eval-Token 헤더로 전송해야 eval telemetry 적재됨.
|
|
EVAL_RUNNER_TOKEN=
|