คำตอบสั้น ๆ: ติดตั้ง 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 หรือโฟลเดอร์แชร์ได้ (ไม่บังคับ แต่ทำให้นำเข้าอัตโนมัติ)
ขั้นตอนที่ 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 จริงและไม่มี/ปิดท้าย ไม่เช่นนั้นจะล็อกอินไม่ได้เพราะการตรวจ CSRFUSERMAP_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 แล้วกำหนดสิทธิ์ตามแผนก