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.4"
services:
  broker:
    image: redis:6.0
    restart: always
    volumes:
      - /volume1/docker/paperless-redis:/data         # <-- Update

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    restart: always
    depends_on:
      - 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}_{correspondent}-{title}"


  gotenberg:
    image: gotenberg/gotenberg:7.4
    restart: always
    command:
      - "gotenberg"
      - "--chromium-disable-routes=true"

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

volumes:
  data:
  media:
  redisdata:

ใช้ 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 หรือจะลบทั้ง 2 แถวนี้ออกไปเลยก็ได้ แล้วค่อยเข้าไปเปลี่ยนภายในเมนู Admin (default: admin/admin)ตั้งค่าให้เรียบร้อย

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

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



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

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

    volumes:
      - /volume1/docker/paperless-redis:/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 นอกจากนี้จะมีอีก 4 folder ย่อยใน paperless-ngx อีกด้วย หน้าตาก็จะได้ประมาณนี้

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

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

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

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

1656669568427.jpg

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

SSH แล้วติดตั้งโปรแกรมตามขั้นตอนปกติ (วิธีติดตั้งเหมือน pi-hole)

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
          • สร้าง Tag หรือ Document type แล้วลองตั้ง Matching algorithm ให้เป็น Auto หรือจะใช้ regex ต่าง ๆ แบบทำเองก็ได้

          image.png


          • หากใช้ Matching algorithm เป็น Auto ให้ทำการ tag เอกสารด้วยตัวเองเท่าที่จะทำได้ แยกเอกสารประเภทต่าง ๆ เช่น พวกใบเสร็จธนาคาร ก็ tag ว่า Bank ให้มีตัวอย่างจำนวนหนึ่ง แต่เยอะ ๆ ก็ยิ่งดี เพื่อเป็นตัวอย่างให้ neural network เอาไปศึกษาและจัดกลุ่มให้อัตโนมัติในอนาคต รายละเอียดไปอ่านที่ Automatic matching 
          • ค่าเดิมของเอกสารที่เข้าไปจะถูก rename เป็นตัวเลขทั้งหมด แต่จาก env PAPERLESS_FILENAME_FORMAT ได้ถูกตั้งค่าให้ใหม่แล้วเป็น correspondent/YY-MM_correspondent-ชื่อไฟล์เดิม หรือให้เข้าใจง่าย ๆ ดังนี้
          media
          │
          └─── none
          │    │   2022-06_none-ชื่อไฟล์เดิม
          │
          └─── Bank
          │    │   2022-06_Bank-ชื่อไฟล์เดิม
          │
          └─── Tag
               │   2022-06_Tag-ชื่อไฟล์เดิม
          

          โดย none คือไฟล์ที่ยังไม่ได้รับการ tag

          • การค้นหาเอกสารก็ทำได้ง่าย ๆ โดยพิมพ์คำที่ต้องการค้นหาลงไปในช่อง search เลย เพราะเอกสารถูก OCR เก็บไว้หมดแล้ว ดังนั้นมันสามารถค้นไปได้ถึงคำในตัวเอกสาร ช่วยประหยัดเวลาชีวิตไปมาก (เหมือนเดิมคือภาษาไทยไม่ค่อยแม่นยำ หาได้บ้างไม่ได้บ้าง รอพัฒนาต่อไป)
          • คำค้นหาสามารถบันทึกเก็บไว้ได้โดยดูที่ปุ่ม View ด้านขวาบน
          • โปรแกรมนี้สามารถเพิ่ม User เพื่อเข้ามาใช้ร่วมกันได้ และมี Feature เชื่อมเมล รวมถึงอื่น ๆ อีกมากมาย ให้ลองงมดูที่เอกสาร ในส่วน Source ท้ายบทความ

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



          Source:
          https://github.com/paperless-ngx/paperless-ngx
          https://paperless-ngx.readthedocs.io/en/latest/advanced_usage.html#automatic-matching