Skip to main content

Paperless-ngx ใช้ดูแลจัดการเอกสาร

เป็นโปรแกรมที่ไว้ช่วยจัดการเอกสารต่าง ๆ ให้เป็นระเบียบ รองรับ multi user ในการเข้ามาใช้ร่วมกัน แต่ไม่มีของใครของมันนะ โดยโปรแกรมเองมี OCR ข้อความในเอกสารได้หลายภาษา รวมภาษาไทยด้วย ช่วยให้ค้นหาสิ่งที่ต้องการได้ง่ายขึ้น คือมีรายละเอียดอื่น ๆ เยอะมากลองไปงมดูได้ใน https://github.com/paperless-ngx/paperless-ngx หรือลองดู demo จากในนั้นก็ได้

อย่าคาดหวังมากกับ OCR ภาษาไทย จากที่ลองคือแค่พอใช้ได้

documents-wchrome-dark.png

ไฟล์ docker-compose ด้านล่างนี้ ผ่านการลองถูกลองผิดมาเยอะพอสมควร และได้ทำการรวม env ที่น่าจะสำคัญทำมาให้หมดแล้ว ไม่ต้องสร้างไฟล์แยกแบบตัวติดตั้งต้นฉบับ และได้แก้ระบบ folder เรียงไฟล์ให้ใหม่ เผื่อโปรแกรมนี้ระเบิดจะได้ค้นไฟล์ง่าย ๆ ในภายหลัง

ขั้นตอนติดตั้ง

จัดเตรียมไฟล์

save code ด้านล่างไปทำไฟล์ docker-compose.yaml

# docker-compose file for running paperless from the docker container registry.
# This file contains everything paperless needs to run.
# Paperless supports amd64, arm and arm64 hardware.
# All compose files of paperless configure paperless in the following way:
#
# - Paperless is (re)started on system boot, if it was running before shutdown.
# - Docker volumes for storing data are managed by Docker.
# - Folders for importing and exporting files are created in the same directory
#   as this file and mounted to the correct folders inside the container.
# - Paperless listens on port 8000.
#
# SQLite is used as the database. The SQLite file is stored in the data volume.
#
# In addition to that, this docker-compose file adds the following optional
# configurations:
#
# - Apache Tika and Gotenberg servers are started with paperless and paperless
#   is configured to use these services. These provide support for consuming
#   Office documents (Word, Excel, Power Point and their LibreOffice counter-
#   parts.
#
# For more extensive installation and update instructions, refer to the
# documentation.

version: "3.6"
services:
  broker:
    image: redis
    restart: always
    volumes:
      - /volume1/docker/paperless-ngx/redis:/data         # <-- Update
  db:
    image: docker.io/library/postgres:13
    container_name: paperless-ngx-db
    restart: always
    volumes:
      - /volume1/docker/paperless-ngx/db:/var/lib/postgresql/data         # <-- Update
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: paperless
      
  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    restart: always
    depends_on:
      - db 
      - broker
      - gotenberg
      - tika
    ports:
      - 8010:8000         # <-- Update
    healthcheck:
      test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8010"]         # <-- Update
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - /volume1/docker/paperless-ngx/data:/usr/src/paperless/data         # <-- Update
      - /volume1/docker/paperless-ngx/media:/usr/src/paperless/media         # <-- Update
      - /volume1/docker/paperless-ngx/export:/usr/src/paperless/export         # <-- Update
      - /volume1/docker/paperless-ngx/consume:/usr/src/paperless/consume         # <-- Update
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998
      USERMAP_UID: 1035         # <-- Update
      USERMAP_GID: 100         # <-- Update
      PAPERLESS_SECRET_KEY: fdsfdsfdszcbvcngikh         # <-- Update
      PAPERLESS_URL: https://paperless.yourname.synology.com         # <-- Update
      PAPERLESS_TIME_ZONE: Asia/Bangkok
      PAPERLESS_OCR_LANGUAGES: tha
      PAPERLESS_OCR_LANGUAGE: tha+eng
      PAPERLESS_ADMIN_USER: admin         # <-- Update
      PAPERLESS_ADMIN_PASSWORD: admin         # <-- Update
      PAPERLESS_FILENAME_FORMAT: "{correspondent}/{created_year}-{created_month}-{created_day}_{document_type}-{title}"


  gotenberg:
    image: gotenberg/gotenberg:7.8
    restart: always
    command:
      - "gotenberg"
      - "--chromium-disable-routes=true"
      - "--chromium-allow-list=file:///tmp/.*"      

  tika:
    image: ghcr.io/paperless-ngx/tika:latest
    restart: always

ใช้ notepad หรืออะไรก็ได้เปิดไฟล์ docker-compose.yaml ขึ้นมา เน้นดูตรงส่วนของ comment ในไฟล์ แก้ให้ตรงกับที่ใช้


    ports:
      - 8010:8000         # <-- Update
    healthcheck:
      test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8010"]         # <-- Update

port ที่ใช้เชื่อมต่อ default และ container port ค่าเริ่มต้นตั้งมาที่ 8000 ในตัวอย่างต้ั้งไว้ที่ 8010 ส่วนของ healthcheck ก็ตั้ง port ให้ตรงกัน ถ้าไปใช้ port อื่น


      USERMAP_UID: 1035         # <-- Update
      USERMAP_GID: 100         # <-- Update

PUID และ PGID ตั้งให้ตรงกับ ID ของเราเพื่อกันไม่ให้เกิดปัญหาเกี่ยวกับ permission ของ docker หาได้จาก วิธีหา UID และ GID เพื่อใช้ติดตั้งโปรแกรมใน Docker


      PAPERLESS_SECRET_KEY: fdsfdsfdszcbvcngikh         # <-- Update
      PAPERLESS_URL: https://paperless.yourname.synology.me         # <-- Update

PAPERLESS_SECRET_KEY สิ่งที่ช่วยให้เราโดน hack ได้ยากขึ้นถ้าเปิด paperless ให้เข้าใช้ได้จาก internet วิธีทำคือ พิมพ์อักษรอะไรก็ได้ไปมั่ว ๆ ยิ่งยาวยิ่งดี (เฉพาะตัวอักษรและตัวเลขไม่รวมเครื่องหมาย)

PAPERLESS_URL เช่นเดียวกับด้านบนเพื่อความปลอดภัย ตั้งให้ตรงกับ URL ที่เราจะใช้ ถ้าไม่ได้ใช้ reverse proxy ควรตั้งให้เป็น DDNS หรือ IP และ Port ที่ใช้งาน เช่น

ถ้า Reverse Proxy URL ของคุณคือ yourname.synology.me และต้องการเข้าผ่านทางซับโดเมน paperless ก็ใส่เป็น https://paperless.yourname.synology.me

ถ้าไม่ใช้ reverse proxy หรือ DDNS คือไม่ต้องการให้เชื่อมต่อได้จาก internet ก็ใส่แค่ ip และ port ของ NAS พอ เช่น http://192.168.10:8010

ระวังเรื่อง HTTP, HTTPS ใส่ให้ถูกต้องเดี๋ยวจะเข้าไม่ได้ รวมถึงเรื่อง forward port ด้วย ถ้าไม่ได้ใช้ reverse proxy

การตั้งค่าในส่วนนี้มีความวุ่นวายพอสมควรและซับซ้อน เพราะมี env หลายตัวให้ตั้งค่า ถ้าต้องการทำนอกเหนือจากนี้ให้ไปดูเอกสารเต็มที่ https://paperless-ngx.readthedocs.io/en/latest/configuration.html#hosting-security


      PAPERLESS_ADMIN_USER: admin         # <-- Update
      PAPERLESS_ADMIN_PASSWORD: admin         # <-- Update

สร้าง Username และ Password ในการเข้าสู่ระบบสำหรับ Admin ตั้งค่าให้เรียบร้อย

หากมีการแก้ใข Username หรือ Password ผ่านระบบ Admin ภายใน Paperless-ngx แล้วยังมี env 2 ค่านี้อยู่  ทุกครั้งที่ run docker ใหม่ ระบบจะถูกรีเซตกลับมาเป็นค่านี้ทุกครั้ง ดังนั้นถ้าไม่ต้องการให้ Username หรือ Password มีการเปลี่ยนแปลง แนะนำให้ลบ 2 ค่านี้ก่อนเริ่มทำงาน docker ใหม่ ในส่วนที่ใช้จัดการ env ของ synology docker


      PAPERLESS_FILENAME_FORMAT: "{correspondent}/{created_year}-{created_month}-{created_day}_{document_type}-{title}"

ส่วนนี้จะเป็นรูปแบบในการจัดเรียงไฟล์ใน folder กรณีที่จำเป็นต้องไปค้นโดยไม่ผ่านโปรแกรมโดยค่า default ที่ทำไว้ให้ใหม่จะมีรูปแบบนี้

media (root folder)
│
└─── none(correspondent)
│    │   2022-06-01_none(tag)-ชื่อไฟล์เดิม
│    │   2022-06-02_Bank-ชื่อไฟล์เดิม
│
└─── name A
│    │   2022-06-01_none(tag)-ชื่อไฟล์เดิม
│    │   2022-06-02_Bank-ชื่อไฟล์เดิม
│
└─── name B
│    │   2022-06-01_none(tag)-ชื่อไฟล์เดิม
│    │   2022-06-02_Bank-ชื่อไฟล์เดิม

รูปแบบ folder จะได้ไม่ซับซ้อนเกินไป เผื่อเวลามาค้นห้าจะได้เข้าไปที่คนที่ต้องการหาและค้นจากแค่ document type ได้

รายละเอียดเพิ่มเติมเกี่ยวกับการจัดการชื่อและ folder ไฟล์ดูเพิ่มเติมได้จากที่นี่ https://paperless-ngx.readthedocs.io/en/latest/advanced_usage.html#advanced-file-name-handling

แก้เสร็จหมดแล้วให้เซฟไฟล์


จัดเตรียม folder ติดตั้ง

ย้อนกลับไปดูไฟล์ docker-compose.yaml อีกครั้ง ในส่วนของ volume

    volumes:
      - /volume1/docker/paperless-ngx/redis:/data         # <-- Update
    volumes:
      - /volume1/docker/paperless-ngx/db:/var/lib/postgresql/data         # <-- Update

และ

    volumes:
      - /volume1/docker/paperless-ngx/data:/usr/src/paperless/data         # <-- Update
      - /volume1/docker/paperless-ngx/media:/usr/src/paperless/media         # <-- Update
      - /volume1/docker/paperless-ngx/export:/usr/src/paperless/export         # <-- Update
      - /volume1/docker/paperless-ngx/consume:/usr/src/paperless/consume         # <-- Update

จะเห็นได้ว่าเราจะต้องมีการสร้าง 2 folder ย่อยใน docker นอกจากนี้จะมีอีก 46 folder ย่อยใน paperless-ngx อีกด้วย หน้าตาก็จะได้ประมาณนี้

docker
│
└─── paperless-ngx
│    │   docker-compose.yaml
│    │
│    └─── data
│    │
│    └─── media
│    │
│    └─── export
│    │
│    └─── consume
│    │
│    └─── redis
│    │
│    └─── db
│   
└─── paperless-redis

ถ้าต้องการใช้ชื่ออื่นก็แล้วแต่สะดวก แต่ย้อนกลับไปแก้ docker-compose.yaml ให้ถูกต้องด้วยด้วย

เข้าไปจัดการสร้าง folder ผ่าน File Station ใน DSM ให้เรียบร้อย

 ตัวอักษรเล็กใหญ่มีผล ตั้งให้ถูกต้อง ไม่งั้นจะไป error ในขั้นตอนติดตั้ง

1656669568427.jpg

หลังจากนั้น copy ไฟล์ docker-compose.yml ที่ทำไว้แล้วไปใส่ไว้ใน paperless-ngx

SSH แล้วติดตั้งโปรแกรมตามขั้นตอนปกติ

cd /volume1/docker/paperless-ngx
docker-compose up -d

หาก error ในขั้นตอนไหนให้ดูแจ้ง error แก้ไขให้เรียบร้อยแล้ว docker-compose up -d อีกรอบติดตั้งต่อได้เลย



ก่อนใช้งาน

ส่วนนี้สำหรับคนที่ยังจัดการเรื่อง Username และ Password ไม่เรียบร้อย หรือคิดจะเปลี่ยนและสร้างผู้ใช้ใหม่ โดยจะเป็นการป้องกันไม่ให้ User และ Password ถูกเขียนทับเมื่อ Restart หรือ Run webserver ขึ้นมาใหม่ แนะนำให้ทำ ถ้าไม่สนให้ข้ามไปส่วนใช้งานเบื้องต้นได้

  • หลังจากเข้าได้แล้วถ้ายังจัดการเรื่อง Username และ Password  ไม่เรียบร้อยให้เข้าไปที่เมนู Admin และจัดการให้เรียบร้อยก่อน
  • หลังจากเรียบร้อยแล้วให้เปิด DSM ขึ้นมาแล้วไปที่ Docker ค้นหา paperless ตัวที่เป็น webserver และทำการปิดก่อน ตามที่วงไว้ในรูป หรือเลือกแล้วไปที่ Action > Stop

image.png

  • หลังจากปิดแล้วให้กดที่ปุ่ม Edit เพื่อเข้าไปด้านใน และกดที่ Advance Settings โดยส่วนนี้จะเป็นส่วนที่ใช้จัดการ env ซึ่งหากต้องการปรับแต่ง config ต่าง ๆ ของ paperless-ngx ก็สามารถทำได้ในนี้ เช่นเปลี่ยน PAPERLESS_URL ให้เป็น Reverse Proxy

image.png

  • ทำการลบ PAPERLESS_ADMIN_USER และ PAPERLESS_ADMIN_PASSWORD ออกโดยกดให้ highlight ขึ้นและกดปุ่ม Delete ด้านบน
  • เมื่อเสร็จเรียบร้อยแล้วให้ทำการ Save และออกมา
  • เลือก webserver และกด Start



ใช้งานเบื้องต้น
  • ทำการอัพโหลดเอกสารเข้าไปไม่ต้องเยอะมาก โดยเอกสารที่อัพโหลดเข้าไปจะถูก rename ทั้งหมด ตามค่าที่ตั้งไว้ใน env ในขั้นตอนติดตั้ง และจะถูก OCR ตามภาษาที่ตั้งไว้ โดยผมตั้งไว้ให้แล้วที่ Thai + English
  • สร้าง document type หรือ tag แล้วลองตั้ง Matching algorithm ให้เป็น Auto หรือจะใช้ regex ต่าง ๆ แบบทำเองก็ได้

image.png

  document type จะไปขึ้นที่ชื่อไฟล์ด้วยเพราะเราตั้งไว้ ส่วน tag จะทำไม่ได้ ดังนั้นการตั้ง document type จะสำคัญกว่า

  • หากใช้ Matching algorithm เป็น Auto ให้ทำการตั้งประเภท document type และ tag เอกสารด้วยตัวเองเท่าที่จะทำได้ แยกเอกสารประเภทต่าง ๆ เช่น พวกใบเสร็จธนาคาร ก็ตั้งประเภท document type ว่า Bank ให้มีตัวอย่างจำนวนหนึ่ง แต่เยอะ ๆ ก็ยิ่งดี เพื่อเป็นตัวอย่างให้ neural network เอาไปศึกษาและจัดกลุ่มให้อัตโนมัติในอนาคต รายละเอียดไปอ่านที่ Automatic matching
  • ตัวอย่างประเภท document type ที่แนะนำเช่น ธนาคาร, ใบเสร็จ, ภาษี, ประกัน
  • การค้นหาเอกสารก็ทำได้ง่าย ๆ โดยพิมพ์คำที่ต้องการค้นหาลงไปในช่อง search เลย เพราะเอกสารถูก OCR เก็บไว้หมดแล้ว ดังนั้นมันสามารถค้นไปได้ถึงคำในตัวเอกสาร ช่วยประหยัดเวลาชีวิตไปมาก (เหมือนเดิมคือภาษาไทยไม่ค่อยแม่นยำ หาได้บ้างไม่ได้บ้าง รอพัฒนาต่อไป)
  • คำค้นหาสามารถบันทึกเก็บไว้ได้โดยดูที่ปุ่ม View ด้านขวาบน
  • โปรแกรมนี้สามารถเพิ่ม User เพื่อเข้ามาใช้ร่วมกันได้ และมี Feature เชื่อมเมล รวมถึงอื่น ๆ อีกมากมาย ให้ลองงมดูที่เอกสาร ในส่วน Source ท้ายบทความ
  • หลังจากจัดเอกสารด้วยมือไปแล้วในระยะหนึ่งแนะนำให้ลองโยนเอกสารไปที่ folder consume ที่ทำไว้ ระบบจะเช็ค folder นี้เป็นระยะ ๆ แล้วดูดเอกสารไปเรียงให้เอง หรือถ้าใคร scan เอกสารบ่อย ๆ ก็ให้มันลง folder นี้ไปเลยก็ได้แล้วให้มันจัดให้เอง

หากเก็บเอกสารที่มีความลับ เพื่อความปลอดภัยใช้แค่ local พอ ไม่ควรผ่าน internet แล้วใช้ VPN เข้ามาแทน หรือจำเป็นต้องผ่าน internet ควรทำ Reverse Proxy นอกจากนี้ควรตั้งค่า Username และ Password ให้แข็งแรงพอ

Source:
https://github.com/paperless-ngx/paperless-ngx
https://paperless-ngx.readthedocs.io/en/latest/index.html