วิธีติดตั้ง Paperless-ngx บน VPS ด้วย Docker Compose
เรียนรู้วิธีติดตั้ง Paperless-ngx บน VPS ผ่าน Docker Compose ตั้งแต่การตั้งค่า Postgres, PAPERLESS_URL, การกำหนดโฟลเดอร์ consume, การตั้งค่า OCR ไปจนถึงการทำ HTTPS และสำรองข้อมูล
สิ่งที่คุณกำลังสร้าง
การติดตั้ง Paperless-ngx บน VPS จะเปลี่ยนโฟลเดอร์เอกสารที่สแกนให้กลายเป็นคลังข้อมูลที่ค้นหาได้ คุณเพียงแค่วางไฟล์ PDF ลงในไดเรกทอรีที่กำหนดไว้ เซิร์ฟเวอร์จะทำการรัน OCR (การรู้จำอักขระด้วยแสง) เพื่อดึงข้อความ คาดการณ์วันที่และผู้ติดต่อ แล้วจัดเก็บเอกสารนั้นให้โดยอัตโนมัติ การติดตั้งนี้ใช้ไฟล์ Docker Compose เพียงไฟล์เดียวซึ่งประกอบด้วย 4 บริการ หลังจากนั้นจะเป็นขั้นตอนการตั้งค่าทั้งหมด ซึ่งคู่มือนี้จะเน้นไปที่ส่วนดังกล่าวเป็นหลักเนื่องจากเป็นจุดที่มักเกิดปัญหาในการติดตั้ง สิ่งที่ระบบนี้ไม่ใช่คือคลังรูปภาพ เพราะ OCR และการคาดการณ์ผู้ติดต่อไม่มีประโยชน์กับโฟลเดอร์รูปภาพ JPEG ดังนั้นควรเก็บไฟล์เหล่านั้นไว้ใน เซิร์ฟเวอร์รูปภาพที่ออกแบบมาเพื่อการนี้โดยเฉพาะ และใช้ Paperless สำหรับเอกสารเท่านั้น ในทำนองเดียวกันกับวิดีโอ: คอลเลกชันภาพยนตร์ที่ริปมาควรเก็บไว้ในเซิร์ฟเวอร์สื่อ ซึ่งมีเครื่องมืออย่าง Jellyfin ที่ปรับแต่งหน้าตาให้เหมือนร้านเช่าวิดีโอยุค 90 จะช่วยให้การเลือกชมเป็นเรื่องสนุกมากกว่าการค้นหา
Paperless-ngx เป็นโครงการแยก (fork) ที่ได้รับการดูแลโดยชุมชนจากโครงการ Paperless ดั้งเดิม ซอฟต์แวร์นี้ใช้งานได้ฟรี เป็นแบบ self-hosted และจัดเก็บเอกสารของคุณเป็นไฟล์ปกติบนดิสก์ คุณจึงไม่มีวันถูกล็อกออกจากคลังข้อมูลของตนเอง การรันบน VPS แทนที่จะเป็นเครื่องที่บ้านหมายความว่าคุณสามารถเข้าถึงเอกสารที่สแกนได้จากทุกที่โดยไม่ต้องเปิดพอร์ตบนเราเตอร์ที่บ้าน และยังใช้งานร่วมกับ Nextcloud ส่วนตัวสำหรับไฟล์ที่ไม่ใช่เอกสารกระดาษ ได้เป็นอย่างดี ตรรกะเดียวกันนี้ยังครอบคลุมถึงคอมพิวเตอร์เดสก์ท็อปที่คุณต่อเครื่องสแกนไว้ เนื่องจาก การใช้ RustDesk relay บน VPS ของคุณเอง จะช่วยให้คุณควบคุมเครื่องนั้นจากที่อื่นได้โดยไม่ต้องเปิดช่องโหว่บนเราเตอร์เช่นกัน
สิ่งที่ stack นี้ทำงานจริง
ไฟล์ compose อย่างเป็นทางการจะเริ่มการทำงานของคอนเทนเนอร์ 4 ตัว การเข้าใจหน้าที่ของแต่ละตัวจะช่วยให้การอ่าน log ทำได้ง่ายขึ้น
webserver: อิมเมจ paperless-ngx โดยตรง ทำหน้าที่รันเว็บอินเทอร์เฟซ, API, ตัว consumer ที่คอยเฝ้าดูโฟลเดอร์ input ของคุณ และ Celery task worker ที่ทำหน้าที่ OCRdb: PostgreSQL ทำหน้าที่เก็บข้อมูล metadata, แท็ก, ผู้ติดต่อ และตารางดัชนีสำหรับการค้นหาแบบ full-text โดยไม่ได้เก็บไฟล์ PDF ของคุณไว้broker: Valkey ซึ่งเป็นที่เก็บข้อมูลแบบ key-value ที่รองรับ Redis ทำหน้าที่เป็นคิวงานระหว่างโพรเซสเว็บและตัว workergotenbergและtika: เป็นส่วนเสริมที่มีเฉพาะในไฟล์ compose รูปแบบ-tikaเท่านั้น ทำหน้าที่แปลงเอกสาร Office (.docx,.xlsx,.odt) ให้เป็น PDF เพื่อให้ paperless สามารถทำดัชนีได้
ณ เดือนตุลาคม 2026 ไฟล์ compose ของ postgres ได้กำหนดเวอร์ชัน docker.io/library/postgres:18 และ docker.io/valkey/valkey:9-alpine ไว้ตายตัว และดึงแอปพลิเคชันมาจาก ghcr.io/paperless-ngx/paperless-ngx:latest
ข้อกำหนดเบื้องต้น
- Ubuntu 24.04 KVM VPS ที่มีสิทธิ์ sudo และติดตั้ง Docker พร้อมปลั๊กอิน Compose เรียบร้อยแล้ว หากคุณยังไม่คุ้นเคยกับส่วนนี้ ให้เริ่มจาก พื้นฐาน Docker Compose สำหรับ VPS แล้วจึงกลับมาดำเนินการต่อ
- ชื่อโดเมนที่มี A record ชี้มายัง VPS ของคุณ Paperless จะไม่ยอมให้ลงชื่อเข้าใช้ผ่าน HTTPS หากชื่อโฮสต์ไม่ตรงกับที่ตั้งค่าไว้ ดังนั้นเรื่องนี้จึงมีความสำคัญมากกว่าที่คุณคาดคิด
- หน่วยความจำคือข้อจำกัดหลัก PostgreSQL, Valkey, เว็บเซิร์ฟเวอร์ Granian และตัวประมวลผล Tesseract OCR ที่ทำงานพร้อมกันทั้งหมดสามารถทำงานได้ใน 2 GB สำหรับการใช้งานทั่วไป แต่ควรจัดสรรไว้ 4 GB หากคุณวางแผนจะนำเข้าเอกสารที่สแกนไว้จำนวนมาก เนื่องจากกระบวนการ OCR บนไฟล์ PDF ขนาดใหญ่หลายหน้าจะทำให้เกิดการใช้หน่วยความจำพุ่งสูงขึ้น ซึ่งอาจส่งผลให้ตัวประมวลผลถูก kernel สั่งยุติการทำงานด้วยกลไก out-of-memory killer
- พื้นที่จัดเก็บข้อมูล: เอกสารของคุณจะถูกจัดเก็บไว้สองชุด คือไฟล์ต้นฉบับและไฟล์ PDF ที่ผ่านการทำ OCR แล้ว ดังนั้นควรเผื่อพื้นที่ไว้ประมาณสองเท่าของขนาดไฟล์ที่สแกนทั้งหมด
รับไฟล์ compose อย่างเป็นทางการ
มีตัวติดตั้งแบบโต้ตอบให้ใช้งาน:
bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)"ตัวติดตั้งจะถามคำถามและเขียนไฟล์ให้คุณ การทำด้วยตนเองนั้นใช้เพียง 4 คำสั่งและช่วยให้คุณทราบตำแหน่งของทุกไฟล์ ซึ่งเป็นสิ่งที่คุณต้องการบนเซิร์ฟเวอร์ที่คุณต้องดูแลรักษา
mkdir -p ~/paperless && cd ~/paperless
curl -fsSL -o docker-compose.yml https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.postgres.yml
curl -fsSL -o docker-compose.env https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.env
curl -fsSL -o .env https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/.envไฟล์รุ่นต่างๆ อยู่ในไดเรกทอรีเดียวกัน ได้แก่ docker-compose.sqlite.yml, docker-compose.mariadb.yml และเวอร์ชัน -tika ของแต่ละไฟล์ ให้เลือก postgres สำหรับการติดตั้งใหม่ SQLite สามารถใช้งานได้ดีสำหรับเอกสารจำนวนไม่กี่ร้อยฉบับ แต่ดัชนีการค้นหาแบบเต็มรูปแบบ (full-text search) จะทำงานช้าลงเร็วกว่า PostgreSQL มาก
ไฟล์ .env บรรจุข้อความหนึ่งบรรทัดคือ COMPOSE_PROJECT_NAME=paperless ชื่อดังกล่าวจะกลายเป็นคำนำหน้า (prefix) ของคอนเทนเนอร์และโวลุ่มทุกรายการ ดังนั้นห้ามลบไฟล์นี้ทิ้งแล้วมาสงสัยว่าเหตุใด docker compose down -v จึงหาข้อมูลของคุณไม่พบ
กำหนดค่า docker-compose.env ก่อนการเริ่มทำงานครั้งแรก
การตั้งค่าสองรายการต่อไปนี้เป็นสิ่งจำเป็น คุณต้องสร้าง secret key ด้วยคำสั่งที่ระบุไว้ในเอกสารประกอบของโปรเจกต์:
python3 -c "import secrets; print(secrets.token_urlsafe(64))"จากนั้นให้แก้ไขไฟล์ docker-compose.env:
PAPERLESS_SECRET_KEY=<the long string you just generated>
PAPERLESS_URL=https://paperless.example.com
PAPERLESS_TIME_ZONE=Europe/Berlin
PAPERLESS_OCR_LANGUAGE=deu+eng
USERMAP_UID=1000
USERMAP_GID=1000PAPERLESS_SECRET_KEY มาพร้อมกับค่าเริ่มต้นคือ change-me ซึ่งใช้สำหรับลงนามใน session token โดยซอฟต์แวร์รุ่นปัจจุบันจะถือว่าค่า placeholder นี้ไม่ได้ถูกกำหนดไว้ ส่งผลให้ paperless ปฏิเสธที่จะเริ่มทำงานหากคีย์ดังกล่าวหายไป ว่างเปล่า หรือยังคงเป็น change-me ดังนั้น stack จะไม่สามารถทำงานได้จนกว่าคุณจะเปลี่ยนค่านี้ คุณควรตั้งค่านี้ก่อนการเริ่มทำงานครั้งแรก เนื่องจากการเปลี่ยนคีย์ในภายหลังจะทำให้ผู้ใช้ทุกคนถูกออกจากระบบ
PAPERLESS_URL เป็นการตั้งค่าที่จะช่วยประหยัดเวลาของคุณได้มาก เนื่องจาก paperless เป็นแอปพลิเคชันที่พัฒนาด้วย Django ซึ่งจะตรวจสอบทั้ง header Host และ origin ที่เบราว์เซอร์รายงานเมื่อมีการส่งฟอร์มเข้าสู่ระบบ หากคุณกำหนดค่า PAPERLESS_URL ระบบจะเพิ่มที่อยู่ของคุณลงใน ALLOWED_HOSTS, CORS_ALLOWED_HOSTS และ CSRF_TRUSTED_ORIGINS ให้โดยอัตโนมัติ หากคุณปล่อยว่างไว้และชี้โดเมนมาที่เซิร์ฟเวอร์ หน้าเข้าสู่ระบบอาจยังคงโหลดได้เนื่องจาก PAPERLESS_ALLOWED_HOSTS มีค่าเริ่มต้นเป็น * แต่การส่งข้อมูลผ่าน HTTPS จะล้มเหลวด้วยข้อผิดพลาด CSRF verification failed. Request aborted. เนื่องจากโดเมนของคุณไม่ใช่ origin ที่เชื่อถือได้ ให้ระบุค่าโดยไม่ต้องใส่เครื่องหมายทับปิดท้ายหรือ path ใดๆ
USERMAP_UID และ USERMAP_GID ใช้สำหรับกำหนดผู้ใช้ที่ container จะทำงานด้วย คุณควรตั้งค่าให้ตรงกับบัญชีผู้ใช้ของคุณ ซึ่งสามารถตรวจสอบได้ด้วยคำสั่ง id -u และ id -g หากค่าไม่ตรงกัน ไฟล์ที่คุณคัดลอกลงในโฟลเดอร์ consume จะไม่สามารถอ่านได้โดย consumer และ log จะแสดงข้อผิดพลาดเรื่องสิทธิ์การเข้าถึง (permission error) แทนที่จะเป็นการนำเข้าไฟล์ตามปกติ
เริ่มการทำงานของ stack และสร้างผู้ใช้คนแรก
docker compose pull
docker compose up -d
docker compose run --rm webserver createsuperuser
docker compose logs -f webservercreatesuperuser จะเรียกให้ระบุชื่อผู้ใช้ อีเมล และรหัสผ่าน ระบบไม่มีข้อมูลล็อกอินเริ่มต้น หากคุณข้ามขั้นตอนนี้ อินเทอร์เฟซบนเว็บจะให้ผู้ที่เปิดใช้งานคนแรกเป็นผู้สร้างบัญชี superuser ซึ่งอาจไม่ใช่คุณหากพอร์ต 8000 ยังเปิดรับการเชื่อมต่อจากอินเทอร์เน็ต ดังนั้นควรสร้างบัญชีผ่าน shell ทันที โปรดรอจนกว่า log จะแสดงข้อความว่าเซิร์ฟเวอร์กำลังฟังการเชื่อมต่อที่พอร์ต 8000 ก่อนที่จะเข้าใช้งานผ่านเบราว์เซอร์ การเริ่มทำงานครั้งแรกจะมีการรัน database migrations ซึ่งอาจใช้เวลาประมาณ 1 ถึง 2 นาที
ตรวจสอบการทำงานในเครื่องก่อนที่จะเชื่อมต่อกับโดเมน:
curl -I http://127.0.0.1:8000หาก 302 เปลี่ยนเส้นทางไปยัง /accounts/login/ แสดงว่า stack ทำงานได้ตามปกติ
การติดตั้ง HTTPS ไว้เบื้องหน้า
ไฟล์ compose มาตรฐานจะเผยแพร่ 8000:8000 ซึ่งผูกเข้ากับทุกอินเทอร์เฟซบนเครือข่าย หากใช้งานบน VPS สาธารณะ ระบบจะให้บริการคลังเอกสารทั้งหมดของคุณผ่าน HTTP แบบปกติแก่ทุกคนที่พบที่อยู่ดังกล่าว ให้แก้ไขบรรทัดพอร์ตเพื่อผูกเข้ากับ loopback เท่านั้น:
ports:
- "127.0.0.1:8000:8000"จากนั้นให้ทำ TLS (transport layer security) termination ที่ reverse proxy แล้วส่งต่อคำขอไปยัง 127.0.0.1:8000 หากนี่เป็นแอปเดียวบนเซิร์ฟเวอร์ คุณสามารถใช้ proxy ใดก็ได้ที่มีไคลเอ็นต์ ACME (automatic certificate management environment) หากคุณกำลังรันคอนเทนเนอร์หลายตัวภายใต้การตั้งค่าใบรับรองชุดเดียวกัน ให้ปฏิบัติตาม รูปแบบการใช้งาน Traefik reverse proxy สำหรับแอป Docker Compose หลายตัว และเชื่อมต่อบริการ webserver เข้ากับเครือข่ายของ proxy โดยไม่ต้องเผยแพร่พอร์ตใดๆ ออกมาเลย
ไม่ว่าคุณจะใช้ proxy ใดก็ตาม การตรวจสอบ origin ของแบบฟอร์มล็อกอินคือจุดที่การตั้งค่า HTTPS มักจะเกิดปัญหา Paperless จะเพิกเฉยต่อ X-Forwarded-Proto เว้นแต่คุณจะตั้งค่า PAPERLESS_PROXY_SSL_HEADER ซึ่งโดยปกติจะปิดไว้ ทำให้ Django มองว่าทุกคำขอที่ผ่าน proxy มาเป็น HTTP ธรรมดา และ origin https:// ที่เบราว์เซอร์ของคุณส่งมาจะผ่านการตรวจสอบก็ต่อเมื่อถูกระบุไว้ในรายการที่เชื่อถือได้เท่านั้น การตั้งค่า PAPERLESS_URL ให้ตรงกับที่อยู่ https:// ที่คุณพิมพ์ในเบราว์เซอร์คือสิ่งที่เพิ่มที่อยู่นั้นเข้าไปในรายการดังกล่าว หากไม่มีการตั้งค่านี้ คุณจะพบข้อผิดพลาด CSRF verification failed. Request aborted. บนหน้าที่ดูเหมือนจะทำงานได้ปกติ
นอกจากนี้ ให้เพิ่มขีดจำกัดขนาดการอัปโหลดของ proxy ด้วย การสแกนเอกสารขนาด 40 MB ผ่าน proxy ที่จำกัดขนาด body ไว้ที่ 1 MB จะถูกปฏิเสธก่อนที่ paperless จะได้รับข้อมูล และเบราว์เซอร์จะรายงานความล้มเหลวในการอัปโหลดแบบทั่วไป
การทำงานของไดเรกทอรี consume
ไฟล์ compose จะทำการ bind-mount ./consume จากไดเรกทอรี compose เข้าไปในคอนเทนเนอร์ ไฟล์ใดก็ตามที่คุณวางไว้ในนั้นจะถูกนำเข้าและลบออกจากโฟลเดอร์ดังกล่าว เนื่องจากไฟล์นั้นได้ถูกย้ายไปอยู่ใน media volume ภายใต้การจัดการของ paperless แล้ว
cp ~/scan-2026-07-14.pdf ~/paperless/consume/
docker compose logs -f webserverคุณควรเห็น consumer ตรวจพบชื่อไฟล์ เริ่มกระบวนการ OCR และจบด้วยบรรทัดรายงานว่าได้เพิ่มเอกสารเรียบร้อยแล้ว วงจรทั้งหมดนี้ใช้เวลาเพียงไม่กี่วินาทีสำหรับการสแกนหนึ่งหน้า และอาจใช้เวลาหนึ่งนาทีหรือมากกว่านั้นสำหรับเอกสารที่มีความยาว
การตั้งค่าสองรายการจะเปลี่ยนวิธีการค้นหาไฟล์ PAPERLESS_CONSUMER_RECURSIVE=true ทำให้ paperless ค้นหาในโฟลเดอร์ย่อยได้ และ PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=true จะเปลี่ยนชื่อโฟลเดอร์ย่อยแต่ละชื่อให้เป็นแท็ก ดังนั้นการวางไฟล์ลงใน consume/invoices/2026/ จะเป็นการติดแท็ก invoices และ 2026 ให้กับไฟล์นั้น นี่คือระบบจัดเก็บเอกสารที่ประหยัดที่สุดที่คุณจะสามารถสร้างได้
การตรวจจับเป็นอีกส่วนหนึ่งที่สำคัญ โดยปกติแล้ว PAPERLESS_CONSUMER_POLLING_INTERVAL จะถูกตั้งค่าเป็น 0 ซึ่งหมายความว่า paperless จะใช้การแจ้งเตือนจากระบบไฟล์โดยตรง (native filesystem notifications) ซึ่งจะทำงานทันที อย่างไรก็ตาม การแจ้งเตือนเหล่านี้ไม่มีความน่าเชื่อถือบนระบบไฟล์เครือข่าย หากโฟลเดอร์ consume ของคุณเป็น NFS หรือ SMB share เพื่อให้เครื่องสแกนเนอร์ในเครือข่ายเขียนไฟล์ลงไปได้ ไฟล์อาจค้างอยู่ที่นั่นโดยไม่ถูกตรวจพบ วิธีแก้ไขคือการกำหนดค่าช่วงเวลาเป็นจำนวนวินาทีที่เป็นบวก เพื่อให้ paperless ทำการสแกนโฟลเดอร์แทนการรอการแจ้งเตือน
ภาษาสำหรับ OCR และค่าใช้จ่ายที่เกี่ยวข้อง
PAPERLESS_OCR_LANGUAGE รับค่าเป็นรหัสภาษา Tesseract แบบ 3 ตัวอักษร โดยมีค่าเริ่มต้นเป็น eng คุณสามารถรวมหลายภาษาเข้าด้วยกันได้โดยใช้เครื่องหมายบวก ดังตัวอย่าง deu+eng ทั้งนี้ Tesseract จะประมวลผลทุกภาษาที่ระบุในทุกหน้าของเอกสาร ดังนั้นการเพิ่มภาษาจะส่งผลให้ใช้เวลา CPU ในการสแกนแต่ละครั้งเพิ่มขึ้น สำหรับ VPS ที่ใช้ vCPU ร่วมกับผู้อื่น อาจส่งผลให้เวลาในการสแกนต่างกันตั้งแต่ 10 วินาทีไปจนถึง 1 นาที จึงควรระบุเฉพาะภาษาที่ใช้ในเอกสารของคุณจริงๆ เท่านั้น
อิมเมจนี้มาพร้อมกับภาษาอังกฤษ เยอรมัน อิตาลี สเปน และฝรั่งเศส หากต้องการใช้ภาษาอื่น ให้เพิ่มชื่อภาษาลงใน PAPERLESS_OCR_LANGUAGES โดยคั่นด้วยช่องว่าง เช่น PAPERLESS_OCR_LANGUAGES=tur ces แล้วทำการรีสตาร์ท คอนเทนเนอร์จะดาวน์โหลดชุดข้อมูลภาษาของ Tesseract ในระหว่างการเริ่มต้นระบบ ดังนั้นการบูตครั้งแรกหลังจากทำการเปลี่ยนแปลงนี้จะใช้เวลานานกว่าปกติ
การสำรองข้อมูลฐานข้อมูลและสื่อ
การคัดลอก Docker volumes ในขณะที่ PostgreSQL กำลังทำงานอยู่อาจทำให้ได้ข้อมูลสำรองที่ไม่สามารถกู้คืนได้ Paperless มีเครื่องมือส่งออกข้อมูล (exporter) ในตัว ซึ่งจะเขียนเอกสารพร้อมกับไฟล์ JSON manifest ที่เก็บ metadata ทั้งหมดลงใน bind mount ที่ ./export:
docker compose exec -T webserver document_exporter ../export --delete --no-progress-bar--delete จะลบไฟล์ที่ส่งออกไปแล้วซึ่งไม่ตรงกับเอกสารปัจจุบัน เพื่อให้โฟลเดอร์นี้เป็นภาพสะท้อนของฐานข้อมูลจริงแทนที่จะขยายขนาดขึ้นเรื่อยๆ --no-progress-bar ช่วยให้ผลลัพธ์สะอาดตาเมื่อรันผ่าน cron และ -T ป้องกันไม่ให้ Compose ร้องขอ terminal ซึ่ง cron ไม่มีให้
การกู้คืนข้อมูลทำได้โดยใช้ document_importer กับโฟลเดอร์เดิมบน stack ใหม่ ดังนั้นไดเรกทอรีที่ส่งออกข้อมูลจึงเป็นสิ่งเดียวที่คุณต้องเก็บรักษาไว้ให้ปลอดภัย ส่งข้อมูลนี้ออกนอกเซิร์ฟเวอร์ตามกำหนดเวลาด้วย การสำรองข้อมูลแบบเข้ารหัสและลดความซ้ำซ้อนด้วย restic จาก VPS ของคุณ และควรสั่งรันการส่งออกข้อมูลก่อน เพื่อให้มั่นใจว่า restic จะไม่สำรองไฟล์ที่เขียนค้างไว้
ตรวจสอบความถูกต้องของการสำรองข้อมูลโดยดูว่า export/manifest.json มีอยู่จริง และจำนวนไฟล์ตรงกับจำนวนเอกสารในหน้าอินเทอร์เฟซ การสำรองข้อมูลที่คุณไม่เคยตรวจสอบรายการไฟล์ถือว่าไม่ใช่การสำรองข้อมูล และการสำรองข้อมูลรายคืนที่ล้มเหลวโดยเงียบๆ นั้นแย่ยิ่งกว่า ดังนั้นควรตั้งค่าให้ cron job ส่งสถานะการทำงาน (exit status) ไปยัง เซิร์ฟเวอร์ ntfy ของคุณเอง เพื่อให้คุณทราบปัญหาในสัปดาห์ที่มันเกิดข้อผิดพลาด แทนที่จะมารู้ตัวในวันที่คุณจำเป็นต้องกู้คืนข้อมูลจริงๆ
FAQ
ทำไมทุกหน้าถึงแสดงข้อผิดพลาด "Bad Request (400)" หลังจากชี้โดเมนมาที่นี่?
หากใช้ไฟล์ตั้งต้นจะไม่เกิดปัญหานี้ เนื่องจาก PAPERLESS_ALLOWED_HOSTS มีค่าเริ่มต้นเป็น * หากพบ 400 พร้อมข้อความ DisallowedHost ใน log ของคอนเทนเนอร์ แสดงว่า PAPERLESS_ALLOWED_HOSTS ถูกตั้งค่าเป็นรายการที่ไม่มีโดเมนของคุณรวมอยู่ด้วย ให้ตั้งค่า PAPERLESS_URL=https://paperless.example.com ใน docker-compose.env โดยไม่ต้องใส่เครื่องหมาย slash ปิดท้าย แล้ว paperless จะเพิ่ม hostname นั้นเข้าไปในรายการ หรือจะลบบรรทัด PAPERLESS_ALLOWED_HOSTS ออกก็ได้ จากนั้นให้รัน docker compose up -d เพื่อสร้างคอนเทนเนอร์ขึ้นใหม่ การแก้ไขไฟล์ env เพียงอย่างเดียวไม่มีผล เนื่องจากคอนเทนเนอร์ที่กำลังทำงานอยู่จะยังคงใช้ environment เดิมที่เริ่มทำงานครั้งแรก
ผมวางไฟล์ PDF ลงในโฟลเดอร์ consume แล้วไม่มีอะไรเกิดขึ้น เกิดอะไรขึ้น?
ให้ตรวจสอบ docker compose logs webserver ก่อน หากพบข้อผิดพลาดเรื่องสิทธิ์การเข้าถึง (permission error) แสดงว่า USERMAP_UID และ USERMAP_GID ไม่ตรงกับบัญชีผู้ใช้ที่เป็นเจ้าของไฟล์ ให้แก้ไขค่าดังกล่าวแล้วสร้างคอนเทนเนอร์ใหม่ หากไม่มีบรรทัด log ใดปรากฏขึ้นเลย แสดงว่าเหตุการณ์ของไฟล์ไม่ถูกส่งมา ซึ่งมักเกิดขึ้นบน network share เนื่องจากระบบแจ้งเตือนไฟล์ในระดับ native ไม่เสถียรในสภาพแวดล้อมดังกล่าว ให้ตั้งค่า PAPERLESS_CONSUMER_POLLING_INTERVAL เป็นค่าอย่างเช่น 30 แล้ว paperless จะสแกนโฟลเดอร์ทุกๆ 30 วินาทีแทน
ผมสามารถรัน paperless-ngx ด้วย SQLite แทน PostgreSQL ได้หรือไม่?
ได้ docker-compose.sqlite.yml รองรับการใช้งานและใช้หน่วยความจำน้อยกว่า ซึ่งเหมาะกับ VPS ขนาดเล็ก ข้อแลกเปลี่ยนจะปรากฏขึ้นเมื่อคลังเอกสารของคุณขยายใหญ่ขึ้น โดยการค้นหาข้อความแบบเต็ม (full-text search) และการแก้ไขแท็กจำนวนมากจะช้าลงอย่างเห็นได้ชัดเมื่อมีเอกสารหลักพันฉบับ การย้ายฐานข้อมูลในภายหลังต้องใช้วิธี export และ import ดังนั้นหากคาดว่าคลังเอกสารจะขยายตัวต่อไปเรื่อยๆ ให้เลือกใช้ PostgreSQL ตั้งแต่ตอนนี้
คลังเอกสารที่สแกนต้องใช้พื้นที่ดิสก์เท่าใด?
โดยประมาณคือสองเท่าของขนาดไฟล์ต้นฉบับ paperless จะเก็บไฟล์ต้นฉบับไว้โดยไม่มีการแก้ไข และจัดเก็บไฟล์ PDF ที่ผ่านการ OCR แล้วอีกชุดหนึ่งซึ่งมีเลเยอร์ข้อความที่ค้นหาได้ รวมถึงภาพตัวอย่างขนาดเล็ก (thumbnails) การสแกนเอกสารที่เป็นข้อความล้วนขนาด 200 KB จะใช้พื้นที่น้อย แต่การสแกนสัญญาฉบับยาวแบบสีขนาด 30 MB จะใช้พื้นที่จัดเก็บประมาณ 60 MB หากคุณเก็บไดเรกทอรี export ไว้ในดิสก์เดียวกันด้วย คลังเอกสารชุดเดียวกันก็จะถูกเก็บไว้บนดิสก์ถึงสามเท่า
ผมจำเป็นต้องใช้คอนเทนเนอร์ Tika และ Gotenberg หรือไม่?
จำเป็นเฉพาะในกรณีที่คุณต้องการให้ไฟล์ Word, Excel หรือ OpenDocument ถูกทำดัชนีร่วมกับไฟล์ PDF ของคุณเท่านั้น คอนเทนเนอร์เหล่านี้จะแปลงไฟล์รูปแบบดังกล่าวเป็น PDF เพื่อให้ paperless สามารถทำ OCR และค้นหาได้ นอกจากนี้ยังเป็นการเพิ่มจำนวนคอนเทนเนอร์ที่ต้องรันและใช้หน่วยความจำเพิ่มขึ้นอีกหลายร้อยเมกะไบต์ ดังนั้นหากเอกสารทั้งหมดที่คุณจัดเก็บเป็น PDF หรือรูปภาพอยู่แล้ว ก็สามารถข้ามการติดตั้งส่วนนี้ไปได้หากใช้เซิร์ฟเวอร์ขนาดเล็ก