
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 기술의 발전과 함께 이 시스템도 계속 개선될 것입니다. 종이 없는 환경을 구축하고 싶다면, 지금이 바로 시작할 때입니다.

