Paperless-ngx ใช้ดูแลจัดการเอกสาร
เป็นโปรแกรมที่ไว้ช่วยจัดการเอกสารต่าง ๆ ให้เป็นระเบียบ รองรับ multi user ในการเข้ามาใช้ร่วมกัน แต่ไม่มีของใครของมันนะ โดยโปรแกรมเองมี OCR ข้อความในเอกสารได้หลายภาษา รวมภาษาไทยด้วย ช่วยให้ค้นหาสิ่งที่ต้องการได้ง่ายขึ้น คือมีรายละเอียดอื่น ๆ เยอะมากลองไปงมดูได้ใน https://github.com/paperless-ngx/paperless-ngx หรือลองดู demo จากในนั้นก็ได้
อย่าคาดหวังมากกับ OCR ภาษาไทย จากที่ลองคือแค่พอใช้ได้
ไฟล์ 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}-{created_day}_{document_type}-{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 ตั้งค่าให้เรียบร้อย
หากมีการแก้ใข 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-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 ในขั้นตอนติดตั้ง
หลังจากนั้น 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
- หลังจากปิดแล้วให้กดที่ปุ่ม
Editเพื่อเข้าไปด้านใน และกดที่Advance Settingsโดยส่วนนี้จะเป็นส่วนที่ใช้จัดการ env ซึ่งหากต้องการปรับแต่ง config ต่าง ๆ ของ paperless-ngx ก็สามารถทำได้ในนี้ เช่นเปลี่ยนPAPERLESS_URLให้เป็น Reverse Proxy
- ทำการลบ
PAPERLESS_ADMIN_USERและPAPERLESS_ADMIN_PASSWORDออกโดยกดให้ highlight ขึ้นและกดปุ่มDeleteด้านบน - เมื่อเสร็จเรียบร้อยแล้วให้ทำการ
Saveและออกมา - เลือก webserver และกด
Start
ใช้งานเบื้องต้น
- ทำการอัพโหลดเอกสารเข้าไปไม่ต้องเยอะมาก โดยเอกสารที่อัพโหลดเข้าไปจะถูก rename ทั้งหมด ตามค่าที่ตั้งไว้ใน env ในขั้นตอนติดตั้ง และจะถูก OCR ตามภาษาที่ตั้งไว้ โดยผมตั้งไว้ให้แล้วที่ Thai + English
- สร้าง tag หรือ document type แล้วลองตั้ง
Matching algorithmให้เป็น Auto หรือจะใช้ regex ต่าง ๆ แบบทำเองก็ได้
- หากใช้
Matching algorithmเป็น Auto ให้ทำการ tag เอกสารด้วยตัวเองเท่าที่จะทำได้ แยกเอกสารประเภทต่าง ๆ เช่น พวกใบเสร็จธนาคาร ก็ tag ว่าBankให้มีตัวอย่างจำนวนหนึ่ง แต่เยอะ ๆ ก็ยิ่งดี เพื่อเป็นตัวอย่างให้ neural network เอาไปศึกษาและจัดกลุ่มให้อัตโนมัติในอนาคต รายละเอียดไปอ่านที่ Automatic matching - การค้นหาเอกสารก็ทำได้ง่าย ๆ โดยพิมพ์คำที่ต้องการค้นหาลงไปในช่อง 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/index.html




