SSD Nodes Learn Hosting plans →
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-27

วิธีติดตั้ง Chaptarr บน VPS จัดการ Audiobook แทน Readarr

เรียนรู้วิธีติดตั้ง Chaptarr ผ่าน Docker Compose เพื่อจัดการ Audiobook และ Ebook แทน Readarr ที่ยุติการพัฒนาไปในปี 2025 พร้อมวิธีตั้งค่า PUID PGID และแก้ปัญหา Metadata

Chaptarr คืออะไร และเหตุใดผู้ใช้ Readarr จึงจำเป็นต้องใช้งาน

Chaptarr เป็น fork ของ Readarr ที่จัดการหนังสือเสียง (audiobooks) และหนังสืออิเล็กทรอนิกส์ (ebooks) ได้จากอินสแตนซ์เดียว โปรแกรมจะคอยตรวจสอบการปล่อยไฟล์ใหม่ ส่งคำสั่งไปยังไคลเอนต์ดาวน์โหลดของคุณ จากนั้นจะเปลี่ยนชื่อไฟล์และจัดเก็บเข้าสู่คลังข้อมูลของคุณ โดยตัวโปรแกรมเองไม่ได้ทำหน้าที่เล่นไฟล์ ดังนั้นคุณจึงต้องใช้งานร่วมกับโปรแกรมเล่นไฟล์ เช่น Audiobookshelf

Readarr ได้ยุติการพัฒนาไปเมื่อวันที่ 27 มิถุนายน 2025 โดยประกาศจากทีมงาน Servarr ระบุถึงสาเหตุว่า ข้อมูล metadata ของโครงการไม่สามารถใช้งานได้อีกต่อไป และความพยายามของชุมชนในการย้ายไปใช้ Open Library ก็หยุดชะงักลง ทำให้ repository ถูกเก็บถาวร ส่งผลให้คลังหนังสือและหนังสือเสียงขาดโปรแกรมจัดการที่มีการดูแลรักษา Chaptarr จึงเข้ามาทำหน้าที่นี้แทน โดยยังคงรูปแบบการใช้งานที่คุณคุ้นเคยจาก Sonarr และ Radarr (เช่น indexers, download clients, quality profiles, root folders) และเพิ่มความสามารถในการจัดการหนังสือเสียง ได้แก่ การจัดระเบียบโดยคำนึงถึงผู้บรรยาย (narrator), การรองรับหนังสือชื่อเดียวกันที่มีหลายฉบับ, การรองรับไฟล์ M4B และ MP3 แบบแบ่งบท รวมถึงการแปลงไฟล์ MP3 เป็น M4B

คู่มือนี้ใช้ image tag chaptarr/chaptarr:0.9.925 ซึ่งเป็นรุ่นล่าสุด ณ วันที่ 9 สิงหาคม 2026 ทั้งนี้ Chaptarr ยังคงสถานะเป็นซอฟต์แวร์รุ่นทดสอบ (beta) โปรดอ่านส่วนการบำรุงรักษาที่อยู่ท้ายบทความก่อนที่คุณจะชี้โปรแกรมไปยังคลังข้อมูลที่คุณไม่สามารถหาไฟล์ทดแทนได้

สิ่งที่ต้องเตรียมก่อนเริ่มต้น

คุณต้องมี VPS ที่ติดตั้ง Docker และ Compose plugin รวมถึงมีพื้นที่ดิสก์เพียงพอสำหรับคลังข้อมูล หนังสือเสียงมีขนาดใหญ่ และการนำเข้าไฟล์ที่ไม่สามารถใช้ hardlinks ได้จะทำให้เกิดการสำเนาไฟล์ซ้ำชั่วคราว ซึ่งส่วน volume ด้านล่างจะอธิบายรายละเอียดในเรื่องนี้ หากยังไม่มี Docker บนเซิร์ฟเวอร์ ให้เริ่มจาก การติดตั้งและใช้งาน Docker บน VPS แล้วจึงกลับมาดำเนินการต่อ

ปัจจุบัน Chaptarr มีให้ใช้งานในรูปแบบ Docker image เท่านั้น ขณะนี้รุ่นสำหรับ Windows แบบ native กำลังอยู่ในระหว่างการพัฒนา และยังไม่มีแพ็กเกจสำหรับการแจกจ่ายทั่วไป โดยค่าเริ่มต้น container จะจัดเก็บฐานข้อมูลไว้ใน /config ในรูปแบบ SQLite และสามารถเชื่อมต่อกับเซิร์ฟเวอร์ PostgreSQL ภายนอกได้ผ่านตัวแปรสภาพแวดล้อม Chaptarr__Postgres__* หากคุณมีการใช้งานอยู่แล้ว สำหรับผู้ใช้คนเดียวบนเซิร์ฟเวอร์เครื่องเดียว SQLite เป็นตัวเลือกที่เหมาะสมที่สุด

บริการ Compose สำหรับ Chaptarr

บริการนี้จะถูกแทรกเข้าไปใน stack ที่มีอยู่เดิม โดยจะทำการล็อกเวอร์ชันด้วย tag ที่ปล่อยออกมา (released tag), เปิดใช้งาน web UI บน loopback เท่านั้น และเชื่อมต่อเข้ากับ network ที่โปรแกรมดาวน์โหลดของคุณใช้งานอยู่แล้ว

services:
  chaptarr:
    image: chaptarr/chaptarr:0.9.925
    container_name: chaptarr
    environment:
      - PUID=1000
      - PGID=1000
      - UMASK=002
      - TZ=Europe/Berlin
    volumes:
      - ./config:/config
      - /srv/media/audiobooks:/audiobooks
      - /srv/media/ebooks:/ebooks
      - /srv/media/downloads:/downloads
    ports:
      - 127.0.0.1:8789:8789
    restart: unless-stopped
    networks:
      - arr

networks:
  arr:
    external: true

บรรทัด external: true หมายถึง "network นี้มีอยู่แล้ว ให้เชื่อมต่อเข้าไป" ให้ใช้คำสั่งนี้เมื่อ Prowlarr และโปรแกรม torrent ของคุณมาจากโปรเจกต์ Compose คนละตัวกัน เพราะหากใช้ไฟล์ Compose แยกกัน ระบบจะสร้าง network ที่แยกส่วนกันขึ้นมาใหม่ ทำให้ Chaptarr ไม่สามารถค้นหา qbittorrent ผ่านชื่อ host ได้ คุณสามารถตรวจสอบชื่อ network จริงได้จาก docker network ls หาก stack ของคุณรวมอยู่ในไฟล์เดียวอยู่แล้ว ให้เพิ่มบริการ chaptarr: เข้าไปในไฟล์นั้นและลบบล็อก networks: ออกทั้งหมด โครงสร้างโดยรวมสามารถดูได้ที่ stack arr แบบเต็มภายใต้ Docker Compose และกฎการตั้งชื่อสามารถดูได้ที่ วิธีการ resolve ชื่อ network และบริการของ Compose

ให้สร้างไดเรกทอรีสำหรับเก็บ config ด้วยตนเอง จากนั้นจึงเริ่มการทำงาน

mkdir -p ./config
sudo chown 1000:1000 ./config
docker compose up -d
docker compose ps
docker compose logs -f chaptarr

docker compose ps ควรแสดงสถานะ container เป็น Up หาก container แสดงสถานะเป็น Restarting แสดงว่าการเริ่มทำงานล้มเหลวและระบบกำลังพยายามเริ่มใหม่ ซึ่งสาเหตุส่วนใหญ่มักเกิดจากไดเรกทอรี config หากแอปพลิเคชันเริ่มฟังที่พอร์ต 8789 แล้ว log จะหยุดเลื่อน

PUID, PGID และไดเรกทอรีที่ Docker สร้างขึ้นในฐานะ root

Chaptarr จะใช้ค่าเริ่มต้นเป็น PUID=99 และ PGID=100 หากคุณไม่ได้กำหนดค่าไว้ ค่าเหล่านี้เป็นค่ามาตรฐานของ unRAID แต่บน Ubuntu VPS ทั่วไป ค่าเหล่านี้จะไม่มีเจ้าของที่ใช้งานได้จริง ส่งผลให้ไฟล์ที่ถูกสร้างขึ้นมีเจ้าของที่คุณไม่สามารถเขียนทับได้ ให้ตรวจสอบหมายเลข UID และ GID ของคุณด้วยคำสั่ง id -u และ id -g แล้วนำค่าเหล่านั้นไปใส่ในไฟล์ตั้งค่า

คอนเทนเนอร์ทุกตัวที่เข้าถึงไฟล์ชุดเดียวกันจำเป็นต้องใช้คู่ UID/GID เดียวกัน ตัวอย่างเช่น โปรแกรมดาวน์โหลดเขียนไฟล์ลงใน /srv/media/downloads จากนั้น Chaptarr ย้ายไฟล์ไปยัง /srv/media/audiobooks และโปรแกรมเล่นไฟล์อ่านข้อมูลจากที่นั่น หากโปรแกรมดาวน์โหลดเขียนไฟล์ด้วยสิทธิ์ 1000:1000 แต่ Chaptarr ทำงานด้วยสิทธิ์ 99:100 การนำเข้าไฟล์จะล้มเหลวเนื่องจาก Chaptarr ไม่มีสิทธิ์ลบหรือย้ายไฟล์ที่ตนเองไม่ได้เป็นเจ้าของ การตั้งค่า UMASK=002 จะช่วยให้ไฟล์ใหม่สามารถเขียนได้โดยกลุ่ม (group-writable) ซึ่งเป็นสิ่งที่จำเป็นเมื่อคอนเทนเนอร์หลายตัวใช้กลุ่มสื่อบันทึกข้อมูลร่วมกัน การแมปสิทธิ์ทั้งหมดสามารถดูได้ที่ วิธีที่ PUID และ PGID แมปผู้ใช้ในคอนเทนเนอร์เข้ากับไฟล์บนโฮสต์

ไฟล์ README ได้เตือนถึงข้อผิดพลาดที่พบบ่อยซึ่งควรย้ำเตือนอีกครั้ง หาก ./config ยังไม่มีอยู่จริงในขณะที่คุณรันคำสั่ง docker compose up ตัว Docker จะสร้างไดเรกทอรีดังกล่าวให้คุณโดยมี root:root เป็นเจ้าของ จากนั้นคอนเทนเนอร์จะทำงานด้วย UID 1000 ซึ่งไม่มีสิทธิ์เขียนฐานข้อมูลของตนเอง ทำให้คอนเทนเนอร์หยุดทำงานและรีสตาร์ทวนไปเรื่อยๆ ให้ตรวจสอบด้วยคำสั่ง ls -ln ./config ซึ่งจะแสดงเจ้าของเป็นตัวเลขแทนชื่อ หากเห็นเลขศูนย์สองตัวแสดงว่า root เป็นเจ้าของไดเรกทอรีนั้น ให้แก้ไขด้วยคำสั่ง sudo chown -R 1000:1000 ./config แล้วจึงเริ่มคอนเทนเนอร์ใหม่อีกครั้ง

โครงสร้างด้านบนทำการ mount /audiobooks, /ebooks และ /downloads เป็น bind แยกกัน ซึ่งตรงกับคำสั่ง run ของโปรเจกต์เอง แม้จะอ่านง่ายแต่มีข้อเสียที่สำคัญคือ hardlinks จะใช้งานไม่ได้

Hardlink คือชื่อเรียกที่สองของข้อมูลชุดเดียวกันบนดิสก์ มันไม่ใช้พื้นที่เพิ่มและทำงานได้ทันที ซึ่งเป็นเหตุผลที่ตระกูล arr เลือกใช้แทนการคัดลอกไฟล์ Hardlink จะทำงานได้ภายในระบบไฟล์ (filesystem) เดียวกันเท่านั้น ภายในคอนเทนเนอร์จุด mount ทั้งสามนี้แยกจากกัน เคอร์เนลจึงปฏิเสธการสร้างลิงก์แม้ว่า path บนโฮสต์จะอยู่บนดิสก์เดียวกันก็ตาม คุณสามารถทดสอบได้ด้วยตัวเอง

docker exec chaptarr sh -c 'touch /downloads/linktest && ln /downloads/linktest /audiobooks/linktest'

คำสั่งดังกล่าวจะล้มเหลวโดยมีข้อความแสดงข้อผิดพลาดลงท้ายด้วย Invalid cross-device link นั่นคือการที่เคอร์เนลปฏิเสธการสร้างลิงก์ข้ามจุด mount ซึ่งเป็นเหตุผลที่ Chaptarr ต้องเปลี่ยนไปใช้วิธีคัดลอกไฟล์แทน การคัดลอกนั้นถูกต้องแต่ช้ากว่า และจะทำให้ audiobook มีไฟล์ซ้ำกันสองชุดจนกว่าคุณจะลบ torrent ออก ซึ่งคุณคงไม่ทำในขณะที่ยังปล่อย seeding อยู่ ให้ลบ /srv/media/downloads/linktest ออกหลังจากนั้น

หากต้องการคงความสามารถในการทำ hardlinks ให้ mount ไดเรกทอรีหลักเพียงจุดเดียวแทน:

    volumes:
      - ./config:/config
      - /srv/media:/data

จากนั้นตั้งค่า root folders ภายใน Chaptarr ให้เป็น /data/audiobooks และ /data/ebooks และกำหนดให้ download client ใช้จุด mount /srv/media:/data เดียวกัน เพื่อให้ทั้งสองคอนเทนเนอร์เห็น path ที่เหมือนกันทุกประการ ตรวจสอบให้แน่ใจก่อนว่าฝั่งโฮสต์เป็นระบบไฟล์เดียวกัน: df -h /srv/media/downloads /srv/media/audiobooks ต้องแสดงค่าเดียวกันในคอลัมน์ Filesystem สำหรับทั้งสองจุด หากค่าต่างกันหมายความว่าอยู่คนละดิสก์กัน และไม่มีรูปแบบการ mount ใดที่สามารถทำ hardlink ข้ามดิสก์ได้ ข้อดีข้อเสียระหว่างวิธีนี้กับ named storage ได้อธิบายไว้ใน การเปรียบเทียบ bind mounts กับ named volumes สำหรับสื่อบันเทิง

การเข้าถึงเว็บ UI โดยไม่เปิดเผยสู่สาธารณะ

บรรทัดพอร์ตถูกเผยแพร่บน 127.0.0.1 ด้วยเหตุผลบางประการ ufw deny 8789 ไม่สามารถป้องกันพอร์ต Docker ที่ถูกเผยแพร่ได้ เนื่องจาก Docker เขียนกฎ NAT (network address translation) ของตนเองลงใน chain ที่ kernel ตรวจสอบก่อนกฎของ ufw ดังนั้น traffic จึงถูกส่งต่อไปก่อนที่กฎของคุณจะถูกนำมาพิจารณา พฤติกรรมนี้ทำให้ผู้ใช้งานเกิดความเข้าใจผิดอยู่เสมอ และมีการอธิบายไว้ใน เหตุใดพอร์ต Docker ที่เผยแพร่จึงเพิกเฉยต่อกฎ ufw ของคุณ การผูก (bind) ไว้กับ loopback จะช่วยหลีกเลี่ยงปัญหานี้ได้โดยสิ้นเชิง

เข้าถึง UI ผ่าน SSH tunnel จากเครื่องของคุณ:

ssh -N -L 8789:127.0.0.1:8789 you@your-server

ปล่อยให้คำสั่งนั้นทำงานอยู่แล้วเปิด http://127.0.0.1:8789 ในเบราว์เซอร์ของคุณ ตั้งค่าการยืนยันตัวตนในการใช้งานครั้งแรก หลังจากนั้นจึงค่อยพิจารณาใช้ reverse proxy พร้อม TLS (transport layer security) ไว้ด้านหน้า เมื่อคุณเริ่มทำ tunnel เข้าไปยังเครื่องมือเหล่านี้สามหรือสี่ตัวโดยมีรหัสผ่านแยกกันในแต่ละตัว คำตอบที่จัดการได้ง่ายกว่าคือการวาง proxy ไว้หลัง เซิร์ฟเวอร์ single sign-on ที่โฮสต์เอง เช่น Authentik เพื่อให้การล็อกอินเพียงครั้งเดียวครอบคลุมทุกแอปพลิเคชัน และการเพิกถอนสิทธิ์เพียงครั้งเดียวจะปิดการเข้าถึงทั้งหมดได้ทันที

การเชื่อมต่อ indexer และ download client

Chaptarr รองรับโปรโตคอลมาตรฐานของ arr สำหรับ indexer และ download client ดังนั้น Prowlarr จึงสามารถส่งข้อมูล indexer เข้าไปได้ในลักษณะเดียวกับที่ทำกับ Sonarr และสามารถเชื่อมต่อกับ torrent หรือ usenet client ทั่วไปได้โดยไม่ต้องมีการตั้งค่าพิเศษ

มีการตั้งค่าหนึ่งที่มักทำให้ผู้ใช้งานส่วนใหญ่เกิดปัญหา เมื่อ Chaptarr ถามหา host ของ download client ห้ามระบุเป็น localhost หรือ 127.0.0.1 เนื่องจากภายใน container ที่อยู่ดังกล่าวหมายถึงตัว container เอง Chaptarr จึงพยายามเชื่อมต่อกับพอร์ต 8080 ของตัวเองและแจ้งว่าไม่สามารถเชื่อมต่อได้ ให้ใช้ชื่อ container คือ qbittorrent ร่วมกับพอร์ต 8080 แทน ตรวจสอบให้แน่ใจว่า container ทั้งสองอยู่ใน network เดียวกันด้วยคำสั่ง docker network inspect arr ซึ่งจะแสดงรายการ container ทั้งหมดที่เชื่อมต่ออยู่โดยระบุชื่อ

หาก download client ของคุณทำงานผ่าน VPN container ด้วย network_mode: "service:gluetun" มันจะไม่มีชื่อเป็นของตัวเองบน network เนื่องจากใช้ network namespace ร่วมกับ Gluetun ให้ระบุที่อยู่เป็น gluetun บนพอร์ตที่ Gluetun เปิดไว้ การตั้งค่าดังกล่าวรวมถึงการกำหนดเส้นทางเครือข่ายที่เกี่ยวข้อง สามารถดูได้ที่ การกำหนดเส้นทาง download client ผ่าน Gluetun

การเปลี่ยนผ่านสู่ Chaptarr: ต้นทุนที่แท้จริงของการย้ายระบบ

Chaptarr ไม่รองรับแหล่งข้อมูล metadata ของ Readarr เนื่องจาก Chaptarr ทำการค้นหาชื่อเรื่อง ผู้แต่ง และฉบับพิมพ์ผ่านไปป์ไลน์ของตนเองโดยใช้ผู้ให้บริการหลายราย ดังนั้นตัวระบุ (identifiers) ที่ Readarr จัดเก็บไว้จึงไม่มีความหมายในระบบนี้ กระบวนการนี้ไม่มีการนำเข้าฐานข้อมูลและไม่มีเส้นทางการอัปเกรดแบบแทนที่ได้ทันที

สำหรับคลังข้อมูลที่มีอยู่ ไฟล์ต่างๆ จะยังคงปลอดภัย แต่การตั้งค่าจะไม่สามารถใช้งานร่วมกันได้ กระบวนการนี้จะไม่ส่งผลกระทบต่อไฟล์ที่อยู่บนดิสก์ คุณต้องเพิ่ม root folder แล้วสั่งนำเข้าคลังข้อมูล จากนั้น Chaptarr จะจับคู่ไฟล์ที่พบกับ metadata ของตนเอง สิ่งที่คุณต้องสร้างใหม่ด้วยตนเอง ได้แก่ quality profiles, รูปแบบการตั้งชื่อไฟล์, การตั้งค่า indexer และ client รวมถึงการแก้ไขทุกรายการที่ Chaptarr จับคู่ผิดพลาด หากคลังข้อมูลมีขนาดใหญ่ คุณจะต้องใช้เวลาตรวจสอบและแก้ไขด้วยตนเอง ดังนั้นควรเผื่อเวลาไว้หนึ่งช่วงเย็นแทนที่จะเป็นเพียงสิบนาที

โปรดดำเนินการตามลำดับนี้ หยุดการทำงานของคอนเทนเนอร์ Readarr แต่ให้เก็บ volume ของการตั้งค่าไว้ เพื่อให้คุณยังสามารถอ่านการตั้งค่าเดิมในขณะที่พิมพ์ข้อมูลใหม่ได้ ให้ชี้ Chaptarr ไปที่โฟลเดอร์ขนาดเล็กหนึ่งโฟลเดอร์ก่อนเพื่อตรวจสอบการจับคู่ข้อมูลก่อนที่จะนำเข้าทั้งหมด และให้ลบคอนเทนเนอร์เก่าออกก็ต่อเมื่อคุณพอใจกับผลลัพธ์แล้วเท่านั้น

มีรายละเอียดด้านความเป็นส่วนตัวที่ควรทราบก่อนที่คุณจะสแกนคลังข้อมูลทั้งหมด: การค้นหา metadata จะถูกส่งไปยัง api2.chaptarr.com ไฟล์ README ระบุว่าคำขอเหล่านั้นอาจมี ID ของผู้ให้บริการ, ข้อความที่ใช้ค้นหา, ประเภทสื่อ, แท็ก และชื่อไฟล์ แต่จะไม่มีการส่ง path เต็ม, ข้อมูลระบุตัวตนของผู้ใช้ และข้อมูลรับรอง (credentials) ออกไป ชื่อไฟล์จะถูกส่งออกจากเซิร์ฟเวอร์ของคุณ ซึ่งเป็นเรื่องปกติสำหรับบริการ metadata แต่คุณควรตัดสินใจเรื่องนี้ด้วยความเข้าใจอย่างถี่ถ้วน

ส่งไฟล์หนังสือเสียงไปยังโปรแกรมเล่นไฟล์

Chaptarr ทำหน้าที่จัดระเบียบไฟล์ ส่วนการเล่นไฟล์เป็นหน้าที่ของโปรแกรมอื่น โดยทั่วไปมักใช้ Audiobookshelf ร่วมด้วยเนื่องจากสามารถติดตามตำแหน่งการฟังของคุณข้ามอุปกรณ์และมีแอปพลิเคชันบนสมาร์ทโฟนรองรับ อิมเมจอย่างเป็นทางการคือ ghcr.io/advplyr/audiobookshelf:latest และตัวอย่างไฟล์ Compose ที่ระบุไว้ในเอกสารจะทำการเผยแพร่พอร์ต 13378 ของโฮสต์ไปยังพอร์ต 80 ของคอนเทนเนอร์

  audiobookshelf:
    image: ghcr.io/advplyr/audiobookshelf:latest
    container_name: audiobookshelf
    ports:
      - 127.0.0.1:13378:80
    volumes:
      - ./abs/config:/config
      - ./abs/metadata:/metadata
      - /srv/media/audiobooks:/audiobooks
    environment:
      - TZ=Europe/Berlin
    restart: unless-stopped

ให้ mount path ของโฮสต์ตำแหน่งเดียวกับที่ Chaptarr เขียนไฟล์ลงไป จากนั้นเพิ่ม /audiobooks เป็นคลังข้อมูล (library) ภายในหน้าเว็บ UI โดยรายการใหม่จะปรากฏขึ้นหลังจากการสแกนครั้งถัดไป

หากคุณใช้งาน Jellyfin อยู่แล้ว คุณสามารถเพิ่มโฟลเดอร์ดังกล่าวเป็นคลังข้อมูลในนั้นเพื่อเล่นไฟล์ได้ แม้ว่าความสามารถในการเล่นต่อจากจุดเดิมสำหรับไฟล์หนังสือเสียงที่มีความยาวต่อเนื่องไฟล์เดียวจะทำได้ไม่ดีเท่ากับเซิร์ฟเวอร์ที่ออกแบบมาเพื่อหนังสือเสียงโดยเฉพาะ การตั้งค่าในส่วนนั้นได้อธิบายไว้ใน การรัน Jellyfin เป็นมีเดียเซิร์ฟเวอร์บน VPS สำหรับในส่วนของหนังสืออิเล็กทรอนิกส์ ให้ส่งไฟล์ /srv/media/ebooks ไปยังแอปพลิเคชันสำหรับอ่านหนังสือ โดยงานของ Chaptarr จะสิ้นสุดลงทันทีที่ไฟล์ถูกตั้งชื่อและจัดเก็บเรียบร้อยแล้ว

ความเสี่ยงในการบำรุงรักษา: สิทธิ์การใช้งาน, รันไทม์ และแท็กที่มีการเปลี่ยนแปลงรวดเร็ว

Chaptarr ใช้สิทธิ์การใช้งานแบบ GPL-3.0 โดยมีลิขสิทธิ์เป็นของกลุ่มผู้ร่วมพัฒนา Chaptarr และบางส่วนมาจากทีมงาน Servarr ดังนั้นซอร์สโค้ดจึงยังคงเป็นแบบเปิด และทุกคนสามารถทำ fork ได้อีกครั้งหากผู้ดูแลโครงการนี้ยุติการพัฒนา โครงการนี้สร้างขึ้นบน .NET 10 ซึ่งเป็นรุ่นรันไทม์ที่รองรับระยะยาว (LTS) ณ เดือนสิงหาคม 2026 ซึ่งหมายความว่าฐานของระบบจะได้รับการสนับสนุนเป็นเวลาหลายปีแทนที่จะเป็นเพียงไม่กี่เดือน ข้อมูลทั้งสองประการนี้มีความสำคัญหากคุณกำลังประเมินว่าโครงการนี้จะยังคงมีอยู่หรือไม่ในปีหน้า

หมายเลขเวอร์ชันมีการเปลี่ยนแปลงอย่างรวดเร็ว โดยรุ่นต่างๆ จะถูกเผยแพร่ในรูปแบบ pre-release และเวอร์ชัน 0.9.925 ก็ถูกปล่อยออกมาในวันเดียวกับที่เขียนคู่มือนี้ คุณควรระบุแท็กที่แน่นอนไว้ การใช้ latest หมายความว่าการทำ docker compose pull โดยอัตโนมัติอาจทำให้คุณข้ามไปหลายเวอร์ชันภายในสัปดาห์เดียว และโครงการ fork ที่ยังใหม่เช่นนี้อาจมีการเปลี่ยนแปลง API ระหว่างรุ่น ซึ่งจะทำให้สคริปต์หรือแดชบอร์ดที่คุณเขียนไว้ใช้งานไม่ได้

โปรดสำรองข้อมูลก่อนการอัปเกรดทุกครั้ง และทำการอัปเกรดด้วยความตั้งใจ

docker compose stop chaptarr
sudo tar czf chaptarr-config-backup.tgz ./config
docker compose start chaptarr
docker compose pull chaptarr
docker compose up -d chaptarr

โครงการรายงานว่าไม่พบเหตุการณ์ข้อมูลสูญหายตลอดระยะเวลาประมาณหกเดือนและผู้ใช้มากกว่าหนึ่งหมื่นหนึ่งพันราย แต่ยังแนะนำให้สำรองข้อมูลและไม่ชี้โปรแกรมไปยัง library ที่ไม่สามารถยอมให้สูญหายได้ ควรถือคำแนะนำทั้งสองส่วนอย่างจริงจัง ให้คัดลอกไฟล์เก็บถาวรของ config ออกจากเซิร์ฟเวอร์ เพราะ backup ที่อยู่บนดิสก์เดียวกับข้อมูลที่ต้องปกป้องไม่ถือเป็น backup ไฟล์ tarball เดียวนั้นเพียงพอ เนื่องจาก Chaptarr เก็บ state ไว้ในไฟล์ SQLite เดียวใต้ /config ส่วนข้อมูลที่อยู่บน database server แยกต่างหากต้อง dump database ด้วย ซึ่งเป็นรูปแบบเดียวกับขั้นตอน backup เมื่อ โฮสต์ Chatwoot ด้วยตนเองบน VPS พร้อมข้อมูล Postgres และไฟล์ที่อัปโหลดแล้ว

รูปแบบความล้มเหลวและข้อความที่คุณจะพบ

คอนเทนเนอร์รีสตาร์ทวนซ้ำ docker compose ps จะแสดง Restarting ให้รันคำสั่ง ls -ln ./config หากในคอลัมน์เจ้าของไฟล์มีเลขศูนย์สองตัว แสดงว่า Docker สร้างไดเรกทอรีในฐานะ root และผู้ใช้ของคอนเทนเนอร์ไม่สามารถเขียนข้อมูลลงในฐานข้อมูลได้ ให้รันคำสั่ง sudo chown -R 1000:1000 ./config

การนำเข้าไฟล์ไม่เสร็จสิ้นและไฟล์ยังคงค้างอยู่ในโฟลเดอร์ดาวน์โหลด Chaptarr สามารถอ่านไฟล์จากโฟลเดอร์ดาวน์โหลดได้แต่ไม่สามารถเขียนไฟล์ลงในไลบรารี ให้เปรียบเทียบ ls -ln /srv/media/audiobooks กับ PUID และ PGID ของคุณ ไดเรกทอรีที่เป็นเจ้าของโดย UID อื่น หรือเป็นเจ้าของโดยกลุ่มของคุณแต่ไม่มีสิทธิ์เขียนสำหรับกลุ่ม จะทำให้การย้ายไฟล์ล้มเหลว การใช้ UMASK=002 จะช่วยป้องกันกรณีหลังสำหรับไฟล์ใหม่

การใช้งานดิสก์เพิ่มขึ้นเป็นสองเท่าหลังการนำเข้าแต่ละครั้ง เนื่องจากไม่มีการทำ hardlink ไฟล์จึงถูกคัดลอกแทน ให้รันการทดสอบ ln จากส่วน volumes หากพบข้อผิดพลาดที่ลงท้ายด้วย Invalid cross-device link แสดงว่ายืนยันปัญหาได้ และการแก้ไขคือการทำ single-parent mount

ไคลเอนต์ดาวน์โหลดไม่สามารถเชื่อมต่อได้ คุณระบุ localhost เป็นโฮสต์ ซึ่งภายในคอนเทนเนอร์นั้นหมายถึงตัว Chaptarr เอง ให้ใช้ชื่อคอนเทนเนอร์แทนและตรวจสอบว่า docker network inspect arr แสดงรายการคอนเทนเนอร์ทั้งสองตัวแล้ว

Compose ปฏิเสธที่จะเริ่มบริการ Bind for 127.0.0.1:8789 failed: port is already allocated หมายความว่ามีโปรเซสอื่นใช้งานพอร์ตนั้นอยู่ ให้ค้นหาโปรเซสดังกล่าวด้วย sudo ss -lntp | grep 8789

เบราว์เซอร์ไม่แสดงผลใดๆ หากพอร์ตถูกผูกไว้กับ 127.0.0.1 จะไม่มีช่องทางให้แล็ปท็อปของคุณเชื่อมต่อผ่านอินเทอร์เน็ตได้ ซึ่งเป็นพฤติกรรมที่ถูกต้องตามการตั้งค่า ให้เปิด SSH tunnel ก่อนใช้งาน

FAQ

ฉันสามารถย้ายคลังข้อมูลจาก Readarr มายัง Chaptarr ได้หรือไม่?

ไม่สามารถทำได้โดยการนำเข้าข้อมูลโดยตรง Chaptarr ไม่รองรับแหล่งข้อมูล metadata ของ Readarr และใช้ระบบจัดการข้อมูลของตนเอง ดังนั้นตัวระบุ (identifiers) ที่ Readarr เก็บไว้จึงไม่มีความหมายและไม่มีระบบแปลงฐานข้อมูล ไฟล์ของคุณบนดิสก์จะไม่ได้รับผลกระทบ คุณต้องเพิ่ม path เดิมเป็น root folder จากนั้นสั่งนำเข้าคลังข้อมูลเพื่อให้ Chaptarr จับคู่ไฟล์ด้วยตนเอง คุณต้องตั้งค่า Quality profiles, รูปแบบการตั้งชื่อ, การตั้งค่า indexer และแก้ไขการจับคู่ที่ผิดพลาดด้วยตนเอง ดังนั้นควรเริ่มจากโฟลเดอร์ขนาดเล็กก่อนที่จะนำเข้าข้อมูลทั้งหมด

ทำไม Chaptarr ถึงเขียนข้อมูลลงในโฟลเดอร์หนังสือเสียงของฉันไม่ได้?

ผู้ใช้งาน (user) ของ container ไม่ได้เป็นเจ้าของไฟล์ Chaptarr จะใช้ค่าเริ่มต้นเป็น PUID=99 และ PGID=100 หากไม่ได้ตั้งค่าตัวแปรเหล่านี้ไว้ ซึ่งเป็นค่าของ unRAID และไม่ถูกต้องสำหรับ Ubuntu VPS ทั่วไป ให้ตั้งค่าเป็น id -u และ id -g ของคุณเอง ใช้คู่ค่าเดียวกันนี้ในโปรแกรมดาวน์โหลด และตั้งค่า UMASK=002 เพื่อให้ไฟล์ใหม่สามารถเขียนข้อมูลโดยกลุ่มผู้ใช้ได้ ตรวจสอบความเป็นเจ้าของด้วย ls -ln บนไดเรกทอรีคลังข้อมูล เนื่องจากคำสั่งนี้จะแสดงผลเป็นตัวเลขแทนชื่อ ทำให้คุณสามารถเปรียบเทียบค่าได้

ทำไมการใช้งานดิสก์ของฉันถึงเพิ่มขึ้นเป็นสองเท่าหลังจากนำเข้าข้อมูล?

Chaptarr ทำการคัดลอกไฟล์เพราะไม่สามารถสร้าง hardlink ได้ การ mount /downloads และ /audiobooks แยกกันทำให้กลายเป็น mount point คนละจุดภายใน container ซึ่ง kernel จะปฏิเสธการทำ hardlink ข้าม mount point โดยจะแสดงข้อผิดพลาด Invalid cross-device link ให้ mount ไดเรกทอรีหลักเพียงจุดเดียว เช่น /srv/media:/data แล้วใช้ /data/downloads และ /data/audiobooks ภายในแอปพลิเคชัน ทั้งสอง path ต้องอยู่บน filesystem เดียวกันของโฮสต์ ซึ่งสามารถตรวจสอบได้ด้วย df -h

Chaptarr สามารถเล่นไฟล์หนังสือเสียงของฉันได้หรือไม่?

ไม่ได้ Chaptarr มีหน้าที่ค้นหา ดาวน์โหลด เปลี่ยนชื่อ และจัดเก็บไฟล์ ส่วนการเล่นไฟล์เป็นหน้าที่ของโปรแกรมอื่น Audiobookshelf เป็นโปรแกรมที่นิยมใช้คู่กันเพราะสามารถจดจำตำแหน่งการเล่นข้ามอุปกรณ์ได้ โดยใช้ image ทางการคือ ghcr.io/advplyr/audiobookshelf:latest และ mount path ของหนังสือเสียงบนโฮสต์เดียวกัน Jellyfin ก็สามารถเล่นไฟล์เหล่านี้ได้หากคุณเพิ่มโฟลเดอร์เป็นคลังข้อมูล แต่จะมีประสิทธิภาพในการจดจำตำแหน่งการเล่นสำหรับหนังสือเสียงที่เป็นไฟล์เดียวยาวๆ น้อยกว่า

การรัน Chaptarr กับคลังข้อมูลที่สำคัญมีความปลอดภัยหรือไม่?

นี่เป็นซอฟต์แวร์รุ่นเบต้าจากโครงการที่เพิ่งแยกตัวออกมา ซึ่งทางโครงการได้ระบุไว้ชัดเจน แต่ยังไม่มีรายงานการสูญหายของข้อมูลในช่วงเวลาประมาณหกเดือนที่ผ่านมาและมีผู้ใช้งานมากกว่าหนึ่งหมื่นหนึ่งพันคน สิ่งที่น่าเชื่อถือคือสัญญาอนุญาตแบบ GPL-3.0 ซึ่งทำให้โค้ดสามารถถูกนำไปพัฒนาต่อได้ และการใช้ .NET 10 ซึ่งเป็น runtime ที่รองรับระยะยาว (LTS) ณ เดือนสิงหาคม 2026 ให้ระบุเวอร์ชันของ image ให้ชัดเจน เช่น 0.9.925 แทนการใช้ latest และสำรองข้อมูล /config ก่อนการอัปเกรดทุกครั้ง พร้อมทั้งเก็บไฟล์สำรองนั้นไว้นอกเซิร์ฟเวอร์