Paperless-ngx: จัดเก็บเอกสารพร้อม OCR ภาษาไทยด้วย Docker

ติดตั้ง Paperless-ngx ด้วย Docker Compose เป็นคลังเอกสารที่ OCR ภาษาไทยและอังกฤษด้วย tha+eng นำเข้าจากโฟลเดอร์ consume ใช้งานผ่าน HTTPS และสำรองด้วย exporter

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 11 นาที

แชร์FacebookXLINELinkedIn
Paperless-ngx — Paperless-ngx: จัดเก็บเอกสารพร้อม OCR ภาษาไทยด้วย Docker
Paperless-ngx: จัดเก็บเอกสารพร้อม OCR ภาษาไทยด้วย Docker

คำตอบสั้น ๆ: ติดตั้ง Paperless-ngx ด้วย Docker Compose เป็นคลังเอกสารที่ OCR ภาษาไทยและอังกฤษด้วย tha+eng นำเข้าจากโฟลเดอร์ consume ใช้งานผ่าน HTTPS และสำรองด้วย exporter

คู่มือนี้อธิบาย Paperless-ngx ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Paperless-ngx คือระบบจัดการเอกสารแบบโอเพนซอร์สที่เปลี่ยนกองกระดาษและไฟล์ PDF ให้ค้นหาได้ ทุกไฟล์ที่สแกนหรืออัปโหลดเข้ามาจะผ่าน OCR ด้วย Tesseract เพื่ออ่านข้อความ แล้วจัดเก็บพร้อมแท็ก ผู้ติดต่อ (Correspondent) และชนิดเอกสาร ระบบเรียนรู้จากการจัดหมวดของคุณและแนะนำหมวดให้เอกสารใหม่อัตโนมัติ เหมาะกับงานบัญชี สัญญา ใบแจ้งหนี้ และเอกสารราชการที่ต้องค้นย้อนหลังบ่อย

เมื่อทำตามคู่มือนี้จบ คุณจะมี Paperless-ngx รุ่น 3 ที่รันด้วย Docker Compose คู่กับ PostgreSQL และ Valkey (ตัวเก็บคิวงานที่ใช้แทน Redis ได้) อ่านภาษาไทยและอังกฤษในเอกสารเดียวกันด้วย tha+eng นำเข้าไฟล์อัตโนมัติจากโฟลเดอร์ consume ใช้งานผ่าน HTTPS และสำรองข้อมูลด้วย document_exporter

สิ่งที่ต้องเตรียม (Paperless-ngx)

  • Cloud VPS ที่ใช้ Ubuntu 24.04 พร้อม Docker Engine และ Compose plugin ขนาดเริ่มต้นราว 2 vCPU / RAM 4 GB เพราะ OCR ใช้ CPU สูง เป็นค่าประมาณ ปรับตามจำนวนหน้าที่สแกนต่อวัน
  • ดิสก์เผื่ออย่างน้อยสองเท่าของไฟล์ต้นฉบับ เพราะระบบเก็บทั้งต้นฉบับและไฟล์ PDF/A ที่ฝังข้อความ OCR
  • ซับโดเมน เช่น docs.example.com และ Nginx Proxy Manager พร้อมเครือข่าย proxy
  • เครื่องสแกนที่บันทึกไฟล์ไปยัง SFTP หรือโฟลเดอร์แชร์ได้ (ไม่บังคับ แต่ทำให้นำเข้าอัตโนมัติ)
แผนภาพเครื่องสแกนส่งไฟล์เข้าโฟลเดอร์ consume ผู้ใช้อัปโหลดผ่าน HTTPS แล้ว Paperless-ngx ทำ OCR เก็บลง PostgreSQL และโฟลเดอร์ media
ไฟล์เข้าได้ทั้งจากโฟลเดอร์ consume อีเมล และการอัปโหลดผ่านเว็บ ทุกทางผ่าน OCR ก่อนเข้าคลัง

ขั้นตอนที่ 1: สร้างโฟลเดอร์และค่าลับ

sudo install -d -o $USER /opt/docs
cd /opt/docs
mkdir -p consume export
cat > .env <<EOF
PAPERLESS_DBPASS=$(openssl rand -hex 24)
PAPERLESS_SECRET_KEY=$(openssl rand -hex 48)
EOF
chmod 600 .env
id -u; id -g

PAPERLESS_SECRET_KEY เป็นค่าบังคับ ระบบไม่ยอมเริ่มถ้าไม่ได้ตั้ง และไม่ควรเปลี่ยนภายหลังเพราะ session และ token จะใช้ไม่ได้ จดค่า UID/GID ที่ได้จากสองคำสั่งสุดท้าย (มักเป็น 1000) ไว้ใช้ในขั้นตอนถัดไป

ขั้นตอนที่ 2: เขียน compose.yaml พร้อมตั้ง OCR ภาษาไทย

services:
  broker:
    image: docker.io/valkey/valkey:9-alpine
    restart: unless-stopped
    volumes:
      - ./redisdata:/data

  db:
    image: postgres:17-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: ${PAPERLESS_DBPASS}
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  paperless:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    container_name: paperless
    restart: unless-stopped
    depends_on:
      - db
      - broker
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBENGINE: postgresql
      PAPERLESS_DBHOST: db
      PAPERLESS_DBPASS: ${PAPERLESS_DBPASS}
      PAPERLESS_SECRET_KEY: ${PAPERLESS_SECRET_KEY}
      PAPERLESS_URL: https://docs.example.com
      PAPERLESS_TIME_ZONE: Asia/Bangkok
      PAPERLESS_OCR_LANGUAGES: tha
      PAPERLESS_OCR_LANGUAGE: tha+eng
      USERMAP_UID: 1000
      USERMAP_GID: 1000
    volumes:
      - ./data:/usr/src/paperless/data
      - ./media:/usr/src/paperless/media
      - ./export:/usr/src/paperless/export
      - ./consume:/usr/src/paperless/consume
    networks:
      - default
      - proxy

networks:
  proxy:
    external: true
  • PAPERLESS_OCR_LANGUAGES: tha สั่งให้ติดตั้งข้อมูลภาษาไทยของ Tesseract ตอนเริ่มคอนเทนเนอร์ เพราะ image ของ Paperless-ngx มีมาให้เฉพาะอังกฤษ เยอรมัน อิตาลี สเปน และฝรั่งเศส
  • PAPERLESS_OCR_LANGUAGE: tha+eng ให้ OCR ใช้ทั้งสองภาษา เหมาะกับเอกสารไทยที่มีชื่อบริษัทหรือตัวเลขภาษาอังกฤษปน แต่จะใช้ CPU มากกว่าภาษาเดียว
  • PAPERLESS_URL ต้องตรงกับ URL จริงและไม่มี / ปิดท้าย ไม่เช่นนั้นจะล็อกอินไม่ได้เพราะการตรวจ CSRF
  • USERMAP_UID/USERMAP_GID ใช้ค่าจากขั้นตอนที่ 1 เพื่อให้ผู้ใช้บนโฮสต์เขียนไฟล์ลงโฟลเดอร์ consume ได้
docker compose up -d
docker compose logs -f paperless

การเริ่มครั้งแรกจะติดตั้งภาษาไทยและสร้างฐานข้อมูล ใช้เวลาหลายนาที เครื่องต้องออกอินเทอร์เน็ตได้

ขั้นตอนที่ 3: เปิด HTTPS และสร้างผู้ดูแล Paperless-ngx

ใน Nginx Proxy Manager เพิ่ม Proxy Host กรอก Domain Names docs.example.com, Forward Hostname paperless, Forward Port 8000 เปิด Websockets Support เพื่อให้แถบสถานะการนำเข้าอัปเดตแบบเรียลไทม์ เปิด Block Common Exploits และขอใบรับรองพร้อม Force SSL

เปิด https://docs.example.com ครั้งแรก ระบบจะให้สร้างบัญชี superuser ใช้ชื่อและรหัสผ่านที่แข็งแรง บัญชีนี้เข้าถึงเอกสารทุกฉบับ จึงควรสร้างบัญชีทั่วไปสำหรับใช้งานประจำวันที่ Administration → Users & Groups แล้วกำหนดสิทธิ์ตามแผนก

ขั้นตอนที่ 4: นำเข้าเอกสารทางโฟลเดอร์ consume

ไฟล์ PDF หรือรูปภาพที่วางใน /opt/docs/consume จะถูก Paperless-ngx นำเข้า ทำ OCR และย้ายเข้าคลังอัตโนมัติ ทดสอบด้วยไฟล์สแกนภาษาไทยหนึ่งไฟล์

cp ~/scan/invoice-2026-10.pdf /opt/docs/consume/
docker compose logs --tail 20 paperless

ให้เครื่องสแกนส่งไฟล์เข้าโฟลเดอร์นี้ผ่านผู้ใช้ SFTP ที่เข้าได้เฉพาะโฟลเดอร์ตามคู่มือ สร้างผู้ใช้ SFTP แบบ chroot หรือแชร์แบบ SMB ถ้าโฟลเดอร์ consume อยู่บน network share ให้เพิ่ม PAPERLESS_CONSUMER_POLLING_INTERVAL: 30 เพราะการแจ้งเตือนไฟล์ใหม่ของระบบไฟล์ใช้กับ NFS หรือ SMB ไม่ได้ทุกกรณี ส่วนอีเมลที่มีไฟล์แนบตั้งให้นำเข้าได้ที่เมนู Mail

ลำดับการนำเข้าเอกสารของ Paperless-ngx ตั้งแต่ตรวจพบไฟล์ OCR ภาษาไทย สร้าง PDF/A จัดหมวดอัตโนมัติ จนค้นหาได้
ไฟล์ต้นฉบับถูกย้ายออกจาก consume เมื่อนำเข้าสำเร็จ ดูความคืบหน้าได้ในหน้ารายการงาน

ขั้นตอนที่ 5: จัดหมวดเอกสารให้ค้นหาง่าย

เปิดเอกสารที่นำเข้าแล้ว แท็บ Details ใช้กำหนด Title, Date created, Correspondent, Document type และ Tags ส่วนแท็บ Content แสดงข้อความที่ OCR อ่านได้ ตรวจว่าภาษาไทยอ่านถูกต้องก่อนนำเข้าเอกสารจำนวนมาก

ภาพจำลองหน้าเอกสารใน Paperless-ngx แท็บ Details กำหนด Title, Correspondent, Document type และ Tags ของใบแจ้งหนี้
จัดหมวดเอกสารแรก ๆ ให้ถูกต้อง ระบบจะเรียนรู้และแนะนำหมวดให้เอกสารใหม่ (ภาพจำลอง)
  • สร้าง Correspondents ตามคู่ค้า เช่น ผู้ให้บริการไฟฟ้า หรือลูกค้ารายใหญ่ และ Document types เช่น ใบแจ้งหนี้ ใบเสร็จ สัญญา
  • ตั้ง Matching algorithm เป็น Auto แล้ว Paperless-ngx จะเรียนรู้จากเอกสารที่คุณจัดหมวดแล้วและแนะนำเองเมื่อมีเอกสารใหม่
  • ใช้ Workflows กำหนดกฎ เช่น ไฟล์จากโฟลเดอร์ consume ใส่แท็ก "รอตรวจ" อัตโนมัติ

การค้นหาคำภาษาไทยที่เขียนติดกันอาจไม่แม่นเท่าภาษาอังกฤษ ควรใช้แท็ก ชนิดเอกสาร และผู้ติดต่อช่วยกรองเสมอ

ขั้นตอนที่ 6: สำรองข้อมูลและอัปเดต

document_exporter ส่งออกเอกสารต้นฉบับ ไฟล์ที่ผ่าน OCR และข้อมูลหมวดทั้งหมดในรูปแบบที่นำกลับเข้าด้วย document_importer ได้ แม้ย้ายไปเครื่องใหม่หรือรุ่นใหม่

cd /opt/docs
docker compose exec -T paperless document_exporter ../export
sudo tar czf /var/backups/docs-export-$(date +%F).tar.gz export .env

ใช้ตัวเลือก -T เมื่อรันจาก cron เพื่อไม่ให้ขึ้น error เรื่อง TTY ส่งไฟล์ออกนอกเครื่องแบบเข้ารหัสด้วย restic เพราะเป็นเอกสารภายในทั้งหมด อัปเดตด้วย docker compose pull && docker compose up -d หลังสำรองข้อมูล และอ่าน release notes ก่อนขึ้นเวอร์ชันหลักใหม่เสมอ เพราะรุ่น 3 มีการเปลี่ยนแปลงที่ไม่เข้ากับรุ่นเดิมหลายจุด

ปัญหาที่พบบ่อยเกี่ยวกับ Paperless-ngx

OCR อ่านภาษาไทยออกมาเป็นอักษรเพี้ยนหรือว่างเปล่า?

ตรวจว่าตั้งทั้ง PAPERLESS_OCR_LANGUAGES: tha และ PAPERLESS_OCR_LANGUAGE: tha+eng แล้วรัน docker compose up -d เอกสารที่นำเข้าก่อนแก้ค่าต้องสั่ง OCR ใหม่โดยเลือกเอกสารในหน้า Documents แล้วใช้คำสั่ง Reprocess คุณภาพไฟล์สแกนก็สำคัญ ควรสแกนอย่างน้อย 300 dpi และไม่เอียง

ล็อกอินแล้วขึ้น CSRF verification failed หรือ 403?

ค่า PAPERLESS_URL ไม่ตรงกับ URL ที่เปิดอยู่ ต้องเป็น https://docs.example.com ตรงทุกตัวอักษร ไม่มี / ปิดท้ายและไม่มี path ต่อท้าย แก้แล้วรัน docker compose up -d

วางไฟล์ในโฟลเดอร์ consume แล้วไม่ถูกนำเข้า?

ดูล็อกด้วย docker compose logs -f paperless สาเหตุที่พบบ่อยคือสิทธิ์ไฟล์ไม่ตรงกับ USERMAP_UID, โฟลเดอร์อยู่บน network share แต่ไม่ได้ตั้ง polling หรือชนิดไฟล์ไม่รองรับ ถ้าไฟล์ซ้ำกับเอกสารที่มีอยู่แล้ว ระบบจะไม่นำเข้าซ้ำและแจ้งในหน้ารายการงาน

OCR ช้ามากจนเครื่องทำงานหนักทั้งวัน?

ลดจำนวนงานพร้อมกันด้วย PAPERLESS_TASK_WORKERS: 1 และ PAPERLESS_THREADS_PER_WORKER: 2 บนเครื่องเล็ก หรือเพิ่ม vCPU ถ้ามีเอกสารเข้ามาต่อเนื่อง การใช้ภาษาเดียวแทน tha+eng ก็เร็วขึ้นแต่แม่นยำลดลงกับเอกสารที่ปนสองภาษา ตัวเลือกทั้งหมดดูได้ใน Paperless-ngx Configuration และซอร์สโค้ดที่ GitHub ของโครงการ

ผลคำสั่ง docker compose ps ของ Paperless-ngx และการรัน document_exporter ส่งออกเอกสารไปโฟลเดอร์ export
exporter เขียนไฟล์ลงโฟลเดอร์ export บนโฮสต์ นำไปบีบอัดและส่งออกนอกเครื่องต่อ

ต้องการเซิร์ฟเวอร์ที่มีพื้นที่และ CPU พอสำหรับคลังเอกสารขององค์กร ดู Cloud VPS App Plus หรือ ติดต่อทีมงาน THAI DATA CLOUD เพื่อช่วยประเมินขนาดเครื่องและวางระบบสำรองข้อมูล

อ่านเพิ่มเติมเกี่ยวกับ Paperless-ngx

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน