Docker,  Synology

Paperless-NGX AI (업데이트 버전)

Paperless 도커에서 한단계 더 진화한 AI 기능

문서를 디지털화하고 관리하는 것은 현대 업무 환경에서 필수가 되었습니다. 이번에는 Paperless-NGX에 AI 기능을 추가하여 문서 관리를 한 단계 더 발전시킨 설정을 소개합니다

Paperless-NGX란?

Paperless-NGX는 종이 문서를 스캔하고 디지털화하여 관리할 수 있는 오픈소스 문서 관리 시스템입니다. OCR(광학 문자 인식) 기술을 활용해 스캔한 문서를 검색 가능한 형태로 저장하고, 태그와 메타데이터로 체계적으로 정리할 수 있습니다.

AI 기능의 추가: 무엇이 달라졌나?

이번 업데이트의 핵심은 paperlessngx-ai 컨테이너의 추가입니다. 이 서비스는 OpenAI API를 활용하여 문서에 자동으로 태그를 지정하고, 문서의 내용을 분석하여 적절한 분류를 제안합니다.

AI 기능의 장점

자동 태그 지정의 편리함
문서를 업로드하면 AI가 내용을 분석하여 자동으로 관련 태그를 제안합니다. 수백 개의 문서를 일일이 분류하던 시간을 대폭 줄일 수 있습니다. 청구서, 계약서, 영수증 등 문서 유형을 자동으로 파악하고 적절한 카테고리에 배치합니다.

향상된 검색 기능
AI가 문서의 맥락을 이해하기 때문에, 단순 키워드 검색을 넘어 의미 기반 검색이 가능합니다. “지난해 전기 요금 관련 문서”처럼 자연어로 검색할 수 있는 기반이 마련됩니다.

미래 지향적 접근
AI를 활용한 문서 관리는 이제 선택이 아닌 필수가 되어가고 있습니다. 이런 방식이 앞으로 문서 관리의 표준이 될 것으로 예상됩니다.

Docker Compose 구성 분석

핵심 서비스 구성

이번 설정은 4개의 주요 서비스로 구성됩니다:

Redis (캐시 및 작업 큐)
세션 데이터와 작업 큐를 관리하는 인메모리 데이터베이스입니다. 512MB의 메모리 제한으로 효율적으로 운영되며, 비밀번호 인증을 통해 보안을 강화했습니다.

PostgreSQL (데이터베이스)
문서 메타데이터, 사용자 정보, 태그 등 모든 구조화된 데이터를 저장합니다. 1GB 메모리 할당으로 안정적인 데이터베이스 운영을 보장합니다.

Paperless-NGX (메인 애플리케이션)
문서 처리와 OCR의 핵심 서비스입니다. 6GB의 메모리를 할당하여 대용량 문서 처리가 가능하며, 다양한 볼륨 마운트를 통해 문서를 체계적으로 관리합니다.

Paperless-AI (새로운 AI 서비스)
OpenAI API를 활용한 자동 태그 지정 및 문서 분석 서비스입니다. Paperless-NGX와 연동되어 문서가 업로드되면 자동으로 분석을 시작합니다.

주목할 만한 설정

파일명 자동 정리

PAPERLESS_FILENAME_FORMAT: '{{ created_year }}/{{ correspondent }}/{{ document_type }}/{{ title }}'

이 설정은 문서를 연도별, 발신자별, 문서 유형별로 자동 분류하여 저장합니다. 나중에 파일을 직접 찾아야 할 때도 쉽게 찾을 수 있습니다.

AI 서비스 환경 변수
OpenAI API 키와 모델 설정을 통해 원하는 수준의 AI 분석을 구성할 수 있습니다. GPT-4를 사용하면 더 정확한 분석이 가능하지만, GPT-3.5-turbo로도 충분히 유용한 결과를 얻을 수 있습니다.

실제 사용 경험과 기대

종이 없는 환경의 실현

더 이상 서랍 가득한 서류 더미를 뒤적일 필요가 없습니다. 스캔만 하면 모든 문서가 디지털화되고, AI가 자동으로 정리해줍니다. 필요한 문서는 몇 초 만에 검색할 수 있습니다.

현재의 한계와 미래의 가능성

아직 AI 태그 지정이 100% 완벽하지는 않습니다. 특히 전문적인 기술 문서나 특수한 형식의 문서에서는 수동 보정이 필요할 수 있습니다. 하지만 다음과 같은 개선이 이루어진다면 더욱 강력한 도구가 될 것입니다:

  • 학습 기능: 사용자의 수정 내역을 학습하여 점점 더 정확한 태그 제안
  • 다국어 지원 강화: 한국어 문서 분석 정확도 향상
  • 문서 간 연관성 분석: 관련 문서를 자동으로 연결
  • 요약 기능: 긴 문서의 핵심 내용 자동 추출

시작하기

기본적인 구성은 이렇게 설정하였는데 개인의 맞게 변형하시면 좋겠습니다.

version: “3.9”

networks:

paper_net:

driver: bridge

services:

redis:

image: redis:8

command:

– /bin/sh

– -c

– redis-server –requirepass redispass

container_name: PaperlessNGX-REDIS

hostname: paper-redis

mem_limit: 512m

mem_reservation: 256m

cpu_shares: 768

security_opt:

– no-new-privileges:true

read_only: true

user:

healthcheck:

test: [“CMD-SHELL”, “redis-cli ping || exit 1”]

volumes:

– /volume1/docker/paperlessngx/redis:/data:rw

environment:

TZ: America/Chicago

restart: unless-stopped

networks:

– paper_net

db:

image: postgres:17

container_name: PaperlessNGX-DB

hostname: paper-db

mem_limit: 1g

cpu_shares: 768

security_opt:

– no-new-privileges:true

healthcheck:

test: [“CMD”, “pg_isready”, “-q”, “-d”, “paperless”, “-U”, “paperlessuser”]

timeout: 45s

interval: 10s

retries: 10

volumes:

– /volume1/docker/paperlessngx/db:/var/lib/postgresql/data:rw

environment:

POSTGRES_DB:

POSTGRES_USER:

POSTGRES_PASSWORD:

restart: unless-stopped

networks:

– paper_net

paperless:

image: ghcr.io/paperless-ngx/paperless-ngx:latest

container_name: PaperlessNGX

hostname: paperless-ngx

mem_limit: 6g

cpu_shares: 1024

security_opt:

– no-new-privileges:true

healthcheck:

test: [“CMD”, “curl”, “-fs”, “-S”, “–max-time”, “2”, “http://localhost:8000”]

interval: 30s

timeout: 10s

retries: 5

ports:

– 8777:8000

volumes:

– /volume2/docker/paperlessngx/data:/usr/src/paperless/data:rw

– /volume2/docker/paperlessngx/media:/usr/src/paperless/media:rw

– /volume2/docker/paperlessngx/export:/usr/src/paperless/export:rw

– /volume2/docker/paperlessngx/consume:/usr/src/paperless/consume:rw

– /volume2/docker/paperlessngx/trash:/usr/src/paperless/trash:rw

environment:

PAPERLESS_REDIS: redis://:redispass@paper-redis:6379

PAPERLESS_DBENGINE: postgresql

PAPERLESS_DBHOST: paper-db

PAPERLESS_DBNAME:

PAPERLESS_DBUSER:

PAPERLESS_DBPASS:

PAPERLESS_EMPTY_TRASH_DIR: ../trash

PAPERLESS_FILENAME_FORMAT: ‘{{ created_year }}/{{ correspondent }}/{{ document_type }}/{{ title }}’

PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD: 6

PAPERLESS_TASK_WORKERS: 1

USERMAP_UID:

USERMAP_GID:

PAPERLESS_TIME_ZONE:

PAPERLESS_ADMIN_USER:

PAPERLESS_ADMIN_PASSWORD:

PAPERLESS_URL: http://192.168.1.3:8777

PAPERLESS_CSRF_TRUSTED_ORIGINS:

PAPERLESS_OCR_LANGUAGE: eng

restart: unless-stopped

depends_on:

db:

condition: service_healthy

redis:

condition: service_healthy

networks:

– paper_net

paperlessngx-ai:

image: clusterzx/paperless-ai

container_name: PaperlessNGX-AI

networks:

– paper_net

security_opt:

– no-new-privileges:true

user: “0:0”

ports:

– “3747:3000”

volumes:

– /volume1/docker/paperlessngxai:/app/data:rw

– /volume1/docker/paperlessngxai/logs:/app/logs:rw

– type: tmpfs

target: /root/.pm2

– type: tmpfs

target: /tmp

– type: tmpfs

target: /.pm2

healthcheck:

test: [“CMD-SHELL”, “curl -fsS http://127.0.0.1:3000/ || exit 1”]

interval: 15s

timeout: 5s

retries: 5

start_period: 120s

environment:

TZ: America/Chicago

PM2_HOME: /.pm2

HOME: /tmp

OPENAI_BASE_URL:

OPENAI_API_KEY:

INFERENCE_TEXT_MODEL:

PAPERLESS_API_URL: http://paperless:8000

PAPERLESS_API_TOKEN:

restart: unless-stopped

depends_on:

paperless:

condition: service_started

위의 Docker Compose 파일을 사용하려면 다음 환경 변수들을 설정해야 합니다:

  • 데이터베이스 관련: POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD
  • Paperless 관리자: PAPERLESS_ADMIN_USER, PAPERLESS_ADMIN_PASSWORD
  • 시스템 설정: USERMAP_UID, USERMAP_GID, PAPERLESS_TIME_ZONE
  • AI 서비스: OPENAI_API_KEY, OPENAI_BASE_URL, INFERENCE_TEXT_MODEL, PAPERLESS_API_TOKEN

모든 설정이 완료되면 docker-compose up -d 명령으로 서비스를 시작할 수 있습니다.

마무리

Paperless-NGX에 AI 기능을 추가하는 것은 단순한 기능 추가가 아닙니다. 문서 관리 방식 자체를 변화시키는 진화입니다. 자동화된 태그 지정은 시간을 절약하고, 더 나은 검색 경험은 생산성을 높입니다.

아직 완벽하지는 않지만, AI 기술의 발전과 함께 이 시스템도 계속 개선될 것입니다. 종이 없는 환경을 구축하고 싶다면, 지금이 바로 시작할 때입니다.