From 32c79740f8e156a1c5cbb9ac516fa6bac1d2f765 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Wed, 15 Apr 2026 14:21:08 +0900 Subject: [PATCH] =?UTF-8?q?fix(kordoc):=20=ED=8C=8C=EC=9D=BC=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=9C=ED=95=9C=20=EC=82=AD=EC=A0=9C,=20Docker?= =?UTF-8?q?=20=EB=A9=94=EB=AA=A8=EB=A6=AC=20=EC=83=81=ED=95=9C=204GiB=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 25MB 파일 크기 제한은 텍스트 PDF(18MB 성공)까지 차단하는 문제. 실제 원인은 이미지 스캔 PDF의 in-memory 파싱 시 메모리 폭발. - extract_worker: 25MB 파일 크기 제한 삭제 - docker-compose: kordoc-service mem_limit 4g + memswap_limit 4g - 텍스트 PDF → 크기 무관 정상 파싱 - 이미지 PDF → 4GiB 초과 시 Docker OOM-kill → 재시작 → 3회 실패 후 failed Co-Authored-By: Claude Opus 4.6 (1M context) --- app/workers/extract_worker.py | 12 ++---------- docker-compose.yml | 2 ++ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/app/workers/extract_worker.py b/app/workers/extract_worker.py index f4be88f..45eda91 100644 --- a/app/workers/extract_worker.py +++ b/app/workers/extract_worker.py @@ -55,17 +55,9 @@ async def process(document_id: int, session: AsyncSession) -> None: return # kordoc 파싱 (HWP/HWPX/PDF) + # OOM 방지는 docker-compose.yml의 kordoc-service mem_limit으로 통제. + # 파일 크기 제한 없음 — 텍스트 PDF는 크기와 무관하게 파싱 가능. if fmt in KORDOC_FORMATS: - # 25MB 초과 파일은 kordoc in-memory 파싱 시 OOM 크래시 위험 → 스킵 - KORDOC_SIZE_LIMIT = 25 * 1024 * 1024 - if (doc.file_size or 0) > KORDOC_SIZE_LIMIT: - size_mb = (doc.file_size or 0) / (1024 * 1024) - doc.extracted_text = "" - doc.extracted_at = datetime.now(timezone.utc) - doc.extractor_version = f"skip_oversize_{size_mb:.0f}mb" - logger.warning(f"[kordoc] {doc.file_path} ({size_mb:.1f}MB) — 25MB 초과, kordoc OOM 방지로 스킵") - return - # 컨테이너 내부 경로: /documents/{file_path} container_path = f"/documents/{doc.file_path}" # 대형 PDF 대응: 10MB당 60초, 최소 60초 최대 300초 diff --git a/docker-compose.yml b/docker-compose.yml index 36f0bd1..918187c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,6 +23,8 @@ services: - "3100:3100" volumes: - ${NAS_NFS_PATH:-/mnt/nas/Document_Server}:/documents:ro + mem_limit: 4g + memswap_limit: 4g healthcheck: test: ["CMD", "node", "-e", "fetch('http://localhost:3100/health').then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))"] interval: 10s