VPS-এ Chaptarr সেটআপ করার নিয়ম
Readarr বন্ধ হওয়ার পর অডিওবুক ম্যানেজমেন্টের জন্য Chaptarr ব্যবহার করুন। এই গাইডে Docker Compose কনফিগারেশন, PUID, PGID সেটআপ এবং মেটাডেটা সমস্যার সমাধান বিস্তারিত দেওয়া হলো।
Chaptarr কী এবং কেন Readarr ব্যবহারকারীদের এটি প্রয়োজন
Chaptarr হলো Readarr-এর একটি ফর্ক, যা একটি সিঙ্গেল ইনস্ট্যান্স থেকে অডিওবুক এবং ইবুক উভয়ই ম্যানেজ করতে পারে। এটি নতুন রিলিজের দিকে নজর রাখে, সেগুলোকে আপনার ডাউনলোড ক্লায়েন্টের কাছে পাঠায় এবং তারপর ফলাফলগুলো রিনেম করে আপনার লাইব্রেরিতে সাজিয়ে রাখে। এটি কোনো কিছু প্লে করে না, তাই আপনাকে Audiobookshelf-এর মতো কোনো প্লেয়ারের সাথে এটি ব্যবহার করতে হবে।
Readarr 27 জুন 2025 তারিখে বন্ধ করে দেওয়া হয়েছে। Servarr টিমের নিজস্ব নোটিশে এর কারণ উল্লেখ করা হয়েছে: প্রজেক্টের মেটাডেটা অব্যবহারযোগ্য হয়ে পড়েছিল এবং Open Library-তে স্থানান্তরের জন্য কমিউনিটির প্রচেষ্টা থমকে গিয়েছিল। রিপোজিটরিটিকে আর্কাইভ করা হয়েছে। এর ফলে বই এবং অডিওবুক সংগ্রহের জন্য কোনো মেইনটেইনড ম্যানেজার ছিল না, আর Chaptarr সেই দায়িত্ব গ্রহণ করেছে। এটি Sonarr এবং Radarr থেকে আপনার পরিচিত কাঠামোটিই (ইনডেক্সার, ডাউনলোড ক্লায়েন্ট, কোয়ালিটি প্রোফাইল, রুট ফোল্ডার) বজায় রাখে এবং অডিওবুক হ্যান্ডলিংয়ের সুবিধা যোগ করে: ন্যারেটর-সচেতন অর্গানাইজেশন, একই টাইটেলের একাধিক সংস্করণ, M4B এবং চ্যাপ্টারযুক্ত MP3 সাপোর্ট, এবং MP3 থেকে M4B কনভার্সন।
এই ওয়াকথ্রুতে chaptarr/chaptarr:0.9.925 ইমেজ ট্যাগটি ব্যবহার করা হয়েছে, যা 9 আগস্ট 2026 তারিখে সর্বশেষ রিলিজ ছিল। 11 অক্টোবর 2026 অনুযায়ী সর্বশেষ রিলিজ হলো 0.9.965, যা 27 সেপ্টেম্বর 2026 তারিখে প্রকাশিত হয়েছে। নিচের ধাপগুলো শুধুমাত্র 0.9.925 ভার্সনে পরীক্ষা করা হয়েছে, তাই ফাইলগুলোতে সেই ট্যাগটিই রাখা হয়েছে; নতুন কোনো ভার্সনে যাওয়ার আগে রিলিজ নোটগুলো পড়ে নিন। Chaptarr নিজেকে বেটা সফটওয়্যার হিসেবে অভিহিত করে। এমন কোনো লাইব্রেরিতে এটি ব্যবহার করার আগে শেষের দিকের মেইনটেন্যান্স সেকশনটি পড়ে নিন যা আপনি রিপ্লেস করতে পারবেন না।
শুরু করার আগে আপনার যা প্রয়োজন
Docker এবং Compose plugin চলছে এমন একটি VPS, এবং লাইব্রেরির জন্য পর্যাপ্ত ডিস্ক স্পেস। অডিওবুক ফাইলের আকার বড় হয়, এবং যে ইমপোর্টে hardlinks ব্যবহার করা যায় না, সেটি কিছু সময়ের জন্য ফাইলের দুটি কপি রাখে। নিচের volume সেকশনে এটি ব্যাখ্যা করা হয়েছে। যদি সার্ভারে Docker ইনস্টল করা না থাকে, তবে প্রথমে VPS-এ Docker ইনস্টল এবং চালু করা সম্পন্ন করে এখানে ফিরে আসুন।
Chaptarr বর্তমানে শুধুমাত্র Docker image হিসেবে পাওয়া যায়। এর নেটিভ সাপোর্ট বর্তমানে প্রক্রিয়াধীন রয়েছে, একটি পরীক্ষামূলক Windows build-এর পরিকল্পনা আছে, এবং কোনো ডিস্ট্রিবিউশন প্যাকেজ নেই। কন্টেইনারটি ডিফল্টভাবে এর ডাটাবেস /config-এ SQLite হিসেবে সংরক্ষণ করে। আপনি যদি আগে থেকেই PostgreSQL ব্যবহার করে থাকেন, তবে Chaptarr__Postgres__* এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে সেটি ব্যবহার করা সম্ভব। একজন ব্যবহারকারীর জন্য একটি সার্ভারে SQLite-ই সঠিক পছন্দ।
Chaptarr-এর Compose service
এই service-টি একটি বিদ্যমান stack-এ যুক্ত হয়। এতে একটি released tag নির্দিষ্ট করা থাকে, web UI শুধু loopback-এ প্রকাশ করা হয়, এবং আপনার download client যে 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: trueexternal: true লাইনটির অর্থ হলো, “এই network আগে থেকেই আছে; এতে যুক্ত হও।” Prowlarr এবং আপনার torrent client যদি ভিন্ন Compose project থেকে আসে, তখন এটি ব্যবহার করুন। অন্যথায় দ্বিতীয় Compose file নিজস্ব বিচ্ছিন্ন network তৈরি করবে, এবং Chaptarr কখনোই নাম ব্যবহার করে qbittorrent resolve করতে পারবে না। আসল নামটি docker network ls থেকে নিন। আপনার stack যদি আগে থেকেই একটি file-এ থাকে, তাহলে সেই file-এ chaptarr: service যোগ করুন এবং পুরো networks: block মুছে দিন। বৃহত্তর layout সম্পর্কে Docker Compose-এর অধীনে একটি পূর্ণ arr stack এবং naming rule সম্পর্কে Compose network ও service name কীভাবে resolve হয় দেখুন।
নিজে config directory তৈরি করুন, তারপর এটি চালু করুন।
mkdir -p ./config
sudo chown 1000:1000 ./config
docker compose up -d
docker compose ps
docker compose logs -f chaptarrdocker compose ps-এ container-টিকে Up হিসেবে দেখা যাওয়ার কথা। কোনো container Restarting হিসেবে তালিকাভুক্ত হলে সেটি চালু হতে ব্যর্থ হয়েছে এবং পুনরায় চেষ্টা করা হচ্ছে; কারণ জানতে এর log পড়ুন। অ্যাপটি port 8789-এ listening শুরু করলে log-এ নতুন output আসা বন্ধ হবে।
PUID, PGID এবং Docker root হিসেবে যে directory তৈরি করে
আপনি এগুলো নির্ধারণ না করলে Chaptarr ডিফল্ট হিসেবে PUID=99 এবং PGID=100 ব্যবহার করে। এগুলো unRAID-এর মান। সাধারণ Ubuntu VPS-এ এগুলো এমন কোনো কার্যকর user-এর সঙ্গে মেলে না, তাই ফাইলের owner এমন হয় যাকে আপনার login থেকে লেখা যায় না। id -u এবং id -g দিয়ে নিজের numeric value দেখুন এবং সেগুলো file-এ লিখুন।
একই ফাইলে কাজ করা প্রতিটি container-এর একই pair প্রয়োজন। Download client /srv/media/downloads-এ লেখে, Chaptarr ফাইলটি /srv/media/audiobooks-এ সরিয়ে নেয়, এবং player সেখান থেকে পড়ে। Download client যদি 1000:1000 হিসেবে লেখে এবং Chaptarr 99:100 হিসেবে চলে, import ব্যর্থ হয়। ফাইলের owner হওয়াই সিদ্ধান্তকারী বিষয় নয়: কোনো ফাইল তৈরি, rename বা delete করতে সেটি থাকা directory-তে write permission প্রয়োজন। সাধারণ 755 mode-এ user 1000 তৈরি করা directory-তে 99:100-এর write access থাকে না। তাই Chaptarr library-তে বইটি রাখতে বা downloads থেকে সরাতে পারে না। UMASK=002 নতুন ফাইলকে group-writable করে। একাধিক container যখন একই media group ব্যবহার করে, তখন এটিই প্রয়োজন। সম্পূর্ণ mapping PUID এবং PGID কীভাবে container user-কে host file-এর সঙ্গে map করে-এ দেওয়া আছে।
README প্রথমে config directory তৈরি করতে এবং Compose-এর user: override এড়াতে বলে। docker compose up চালানোর সময় ./config না থাকলে Docker নিজেই সেটি তৈরি করে এবং owner হিসেবে root:root নির্ধারণ করে। pinned 0.9.925 image-এ entrypoint root হিসেবে শুরু হয়। এরপর configured UID এবং GID-তে পরিবর্তিত হওয়ার আগে এটি /config এবং তার database file-গুলোর ownership ঠিক করে। তাই নতুন তৈরি root-owned directory সাধারণত restart loop তৈরি করে না। user: override ব্যবহার করলে এই setup এড়িয়ে যায়। Read-only mount বা ownership পরিবর্তন করতে অস্বীকার করা filesystem-ও database write বন্ধ করতে পারে। ls -ln ./config দিয়ে পরীক্ষা করুন। এটি নামের বদলে numeric owner দেখায়। দুটি zero মানে owner হলো root। Log-এ writable local directory-তে permissions failure নিশ্চিত হলে sudo chown -R 1000:1000 ./config দিয়ে ঠিক করে container আবার start করুন।
কেন অডিওবুক এবং ইবুক ভলিউম আলাদা রাখলে hardlinks কাজ করে না
উপরের লেআউটটি /audiobooks, /ebooks এবং /downloads-কে আলাদা বাইন্ড হিসেবে মাউন্ট করে, যা প্রজেক্টের নিজস্ব রান কমান্ডের সাথে সামঞ্জস্যপূর্ণ। এটি পড়া সহজ, তবে এর একটি বড় অসুবিধা আছে: hardlinks কাজ করা বন্ধ করে দেয়।
একটি hardlink হলো ডিস্কে থাকা একই ডেটার একটি দ্বিতীয় নাম। এটি কোনো অতিরিক্ত জায়গা নেয় না এবং তাৎক্ষণিকভাবে তৈরি হয়, যে কারণে arr ফ্যামিলি এটি কপি করার চেয়ে বেশি পছন্দ করে। একটি hardlink শুধুমাত্র একটি ফাইলসিস্টেমের ভেতরেই কাজ করে। কন্টেইনারের ভেতরে এগুলো তিনটি আলাদা মাউন্ট পয়েন্ট, তাই হোস্টের পাথগুলো একই ডিস্কে থাকলেও কার্নেল এই লিঙ্ক তৈরি করতে অস্বীকার করে। আপনি নিজেই এটি পরীক্ষা করে দেখতে পারেন।
docker exec chaptarr sh -c 'touch /downloads/linktest && ln /downloads/linktest /audiobooks/linktest'কমান্ডটি ব্যর্থ হবে এবং শেষে Invalid cross-device link ত্রুটি দেখাবে। এটি কার্নেল কর্তৃক মাউন্ট পয়েন্টের মধ্যে লিঙ্ক করতে অস্বীকৃতি জানানোর ফলাফল, এবং ঠিক এই কারণেই Chaptarr ফাইল কপি করার প্রক্রিয়ায় ফিরে যায়। কপি করা সঠিক হলেও তা ধীরগতির এবং টরেন্টটি রিমুভ না করা পর্যন্ত অডিওবুকটি দুইবার ডিস্কে জায়গা দখল করে থাকে (যেহেতু আপনি seeding চলাকালীন টরেন্ট রিমুভ করবেন না)। এরপর /srv/media/downloads/linktest ডিলিট করে দিন।
hardlinks বজায় রাখতে, পরিবর্তে একটি প্যারেন্ট ডিরেক্টরি মাউন্ট করুন:
volumes:
- ./config:/config
- /srv/media:/dataএরপর Chaptarr-এর ভেতরে রুট ফোল্ডারগুলোকে /data/audiobooks এবং /data/ebooks হিসেবে সেট করুন, এবং ডাউনলোড ক্লায়েন্টকে একই /srv/media:/data মাউন্ট দিন যাতে উভয় কন্টেইনার একটি অভিন্ন পাথ দেখতে পায়। প্রথমে নিশ্চিত হয়ে নিন যে হোস্ট সাইডটি একটি একক ফাইলসিস্টেম: df -h /srv/media/downloads /srv/media/audiobooks কমান্ডটি উভয় পাথের জন্য Filesystem কলামে একই মান প্রদর্শন করতে হবে। ভিন্ন মান মানে ভিন্ন ডিস্ক, এবং কোনো মাউন্ট লেআউটই সেগুলোর মধ্যে hardlink তৈরি করতে পারবে না। এর এবং named storage-এর মধ্যে পার্থক্য মিডিয়ার জন্য bind mounts বনাম named volumes অংশে আলোচনা করা হয়েছে।
ইন্টারনেটে উন্মুক্ত না করেই ওয়েব UI অ্যাক্সেস করা
পোর্ট লাইনটি 127.0.0.1-এ পাবলিশ করার একটি কারণ আছে। ufw deny 8789 কোনো পাবলিশ করা Docker পোর্টকে সুরক্ষিত করে না, কারণ Docker তার নিজস্ব NAT (network address translation) রুলগুলো এমন একটি চেইনে লেখে যা ufw-এর আগেই কার্নেল চেক করে। ফলে আপনার রুল কার্যকর হওয়ার আগেই ট্রাফিক ফরোয়ার্ড হয়ে যায়। এই বিষয়টি ব্যবহারকারীদের নিয়মিত বিভ্রান্ত করে এবং কেন পাবলিশ করা Docker পোর্ট আপনার ufw রুল উপেক্ষা করে অংশে এর ব্যাখ্যা দেওয়া হয়েছে। লুপব্যাক (loopback)-এ বাইন্ড করলে এই সমস্যা পুরোপুরি এড়িয়ে যাওয়া যায়।
আপনার নিজের মেশিন থেকে একটি SSH টানেলের মাধ্যমে UI অ্যাক্সেস করুন:
ssh -N -L 8789:127.0.0.1:8789 you@your-serverএটি চালু রাখুন এবং আপনার ব্রাউজারে http://127.0.0.1:8789 খুলুন। প্রথমবার চালানোর সময় অথেন্টিকেশন সেট আপ করুন। এর পরেই কেবল এর সামনে TLS (transport layer security) সহ একটি রিভার্স প্রক্সি ব্যবহারের কথা বিবেচনা করা উচিত। যখন আপনি আলাদা আলাদা পাসওয়ার্ড দিয়ে তিন বা চারটি টুলে টানেলিং করবেন, তখন সবচেয়ে গোছানো সমাধান হলো প্রক্সিটিকে Authentik-এর মতো একটি সেলফ-হোস্টেড সিঙ্গেল সাইন-অন সার্ভারের পেছনে রাখা, যাতে একটি লগইন দিয়েই সব অ্যাপ ব্যবহার করা যায় এবং একটি রিভোকেশন দিয়েই সবগুলোর অ্যাক্সেস বন্ধ করা যায়।
ইনডেক্সার এবং ডাউনলোড ক্লায়েন্ট সংযুক্ত করা
Chaptarr স্ট্যান্ডার্ড arr ইনডেক্সার এবং ডাউনলোড ক্লায়েন্ট প্রোটোকল সমর্থন করে। তাই Prowlarr যেভাবে Sonarr-এর জন্য ইনডেক্সার পুশ করে, একইভাবে Chaptarr-এর ক্ষেত্রেও কাজ করে। সাধারণ টরেন্ট এবং usenet ক্লায়েন্টগুলো কোনো বিশেষ কনফিগারেশন ছাড়াই সংযুক্ত হতে পারে।
একটি সেটিং প্রায় সবাই ভুল করে। Chaptarr যখন ডাউনলোড ক্লায়েন্টের হোস্ট জানতে চায়, তখন localhost বা 127.0.0.1 লিখবেন না। কন্টেইনারের ভেতরে এই ঠিকানাটি কন্টেইনার নিজেকেই বোঝায়। ফলে Chaptarr তার নিজের 8080 পোর্টে সংযোগ করার চেষ্টা করে এবং সংযোগ ব্যর্থ হওয়ার বার্তা দেখায়। এর পরিবর্তে কন্টেইনারের নাম qbittorrent এবং পোর্ট 8080 ব্যবহার করুন। docker network inspect arr কমান্ডটি চালিয়ে নিশ্চিত করুন যে উভয় কন্টেইনার একই নেটওয়ার্কে আছে; এটি সংযুক্ত প্রতিটি কন্টেইনারের নাম তালিকাভুক্ত করবে।
যদি আপনার ডাউনলোড ক্লায়েন্ট network_mode: "service:gluetun" ব্যবহার করে কোনো VPN কন্টেইনারের মাধ্যমে চলে, তবে নেটওয়ার্কে তার নিজস্ব কোনো নাম থাকে না, কারণ এটি Gluetun-এর নেটওয়ার্ক নেমস্পেস শেয়ার করে। সেক্ষেত্রে এটিকে Gluetun-এর উন্মুক্ত পোর্টে gluetun হিসেবে সম্বোধন করুন। এই ব্যবস্থা এবং এর সাথে সম্পর্কিত রাউটিং সম্পর্কে বিস্তারিত জানতে Gluetun-এর মাধ্যমে ডাউনলোড ক্লায়েন্ট রাউটিং দেখুন।
Readarr থেকে সরে আসা: মাইগ্রেশনের প্রকৃত খরচ
Chaptarr, Readarr-এর মেটাডেটা সোর্সের সাথে সামঞ্জস্যপূর্ণ নয়। এটি নিজস্ব পাইপলাইনের মাধ্যমে বিভিন্ন প্রোভাইডার থেকে শিরোনাম, লেখক এবং সংস্করণের তথ্য সংগ্রহ করে, তাই Readarr-এর সংরক্ষিত আইডেন্টিফায়ারগুলো এখানে কোনো কাজে আসে না। এখানে কোনো ডাটাবেস ইমপোর্ট বা সরাসরি আপগ্রেড করার সুযোগ নেই।
বিদ্যমান লাইব্রেরির ক্ষেত্রে এর অর্থ হলো, আপনার ফাইলগুলো নিরাপদ থাকলেও সেটিংসগুলো থাকবে না। এই প্রক্রিয়ার কোনো কিছুই ডিস্কে থাকা ফাইলগুলোকে স্পর্শ করে না। আপনাকে একটি রুট ফোল্ডার যোগ করতে হবে এবং লাইব্রেরি ইমপোর্ট চালাতে হবে, যাতে Chaptarr তার নিজস্ব মেটাডেটার সাথে ফাইলগুলোকে মিলিয়ে নিতে পারে। আপনাকে যা যা ম্যানুয়ালি পুনরায় তৈরি করতে হবে: কোয়ালিটি প্রোফাইল, নেমিং ফরম্যাট, ইনডেক্সার ও ক্লায়েন্ট সেটিংস এবং Chaptarr-এর ভুল করা প্রতিটি ম্যাচ। একটি বড় লাইব্রেরির ক্ষেত্রে অনেকগুলো ভুল সংশোধনের প্রয়োজন হতে পারে, তাই 10 মিনিটের পরিবর্তে এক সন্ধ্যা সময় হাতে রাখা ভালো।
এই ক্রমানুসারে কাজ করুন। Readarr কন্টেইনারটি বন্ধ করুন কিন্তু এর কনফিগ ভলিউমটি রেখে দিন, যাতে নতুন সেটিংস টাইপ করার সময় আপনি পুরনো সেটিংসগুলো দেখে নিতে পারেন। প্রথমে Chaptarr-কে একটি ছোট ফোল্ডারের দিকে নির্দেশ করুন এবং সবকিছু ইমপোর্ট করার আগে ম্যাচগুলো যাচাই করে নিন। আপনি সন্তুষ্ট হওয়ার পরেই কেবল পুরনো কন্টেইনারটি মুছে ফেলুন।
পুরো লাইব্রেরি স্ক্যান করার আগে গোপনীয়তার একটি বিষয় জেনে রাখা ভালো: মেটাডেটা লুকআপগুলো api2.chaptarr.com-তে পাঠানো হয়। README-তে উল্লেখ আছে যে, এই অনুরোধগুলোতে প্রোভাইডার আইডি, সার্চ টেক্সট, মিডিয়া টাইপ, ট্যাগ এবং ফাইলের নাম থাকতে পারে, তবে এতে সম্পূর্ণ পাথ, ব্যবহারকারীর পরিচয় এবং ক্রেডেনশিয়াল অন্তর্ভুক্ত থাকে না। ফাইলের নাম আপনার সার্ভার থেকে বাইরে চলে যায়। মেটাডেটা সার্ভিসের জন্য এটি স্বাভাবিক, তবুও আপনার এটি জেনেশুনেই সিদ্ধান্ত নেওয়া উচিত।
প্লেয়ারে অডিওবুক পাঠান
Chaptarr ফাইল সংগঠিত করে। এগুলো চালানোর কাজ অন্য একটি প্রোগ্রামের। Audiobookshelf এ ক্ষেত্রে সাধারণত ব্যবহৃত হয়, কারণ এটি বিভিন্ন ডিভাইসে আপনার শোনার অবস্থান সংরক্ষণ করে এবং ফোন অ্যাপও সরবরাহ করে। এর অফিসিয়াল image হলো ghcr.io/advplyr/audiobookshelf:latest, এবং এর নথিভুক্ত Compose উদাহরণে host port 13378-কে container port 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-stoppedChaptarr যে host path-এ লেখে, সেই একই path mount করুন। এরপর web UI-তে /audiobooks-কে একটি library হিসেবে যোগ করুন। পরবর্তী scan-এর পরে নতুন import দেখা যাবে।
আপনি যদি ইতিমধ্যে Jellyfin চালান, সেখানে folder-টিকে একটি library হিসেবে যোগ করতে পারেন। Jellyfin ফাইলগুলো চালাতে পারবে। Jellyfin সেটআপের বিবরণ VPS-এ Jellyfin-কে media server হিসেবে চালানো-এ রয়েছে। ebook-এর ক্ষেত্রে /srv/media/ebooks একটি reader application-এ দিন। ফাইলের নাম নির্ধারণ করে সঠিক স্থানে রাখার পর Chaptarr-এর কাজ শেষ।
রক্ষণাবেক্ষণের ঝুঁকি: লাইসেন্স, runtime এবং দ্রুত পরিবর্তনশীল tag
Chaptarr GPL-3.0 লাইসেন্সের অধীনে প্রকাশিত। এর copyright Chaptarr-এর contributors-এর, এবং এতে Servarr team-এর কিছু অংশের code আছে। তাই code open থাকে, এবং এই maintainer কাজ বন্ধ করলে অন্যরাও আবার fork করতে পারে। এটি .NET 10-এর ওপর তৈরি। August 2026 অনুযায়ী এটিই runtime-এর বর্তমান long term support release। ফলে ভিত্তিটি কয়েক মাসের বদলে কয়েক বছর support পাওয়ার কথা। আগামী বছরেও এই project থাকবে কি না বিচার করার সময় দুটি বিষয়ই গুরুত্বপূর্ণ।
Version number দ্রুত পরিবর্তিত হয়। 0.9.925 9 August 2026-এ প্রকাশিত হয়, এবং পরবর্তী সাত সপ্তাহে আরও পাঁচটি release প্রকাশিত হয়। 0.9.958 পর্যন্ত প্রতিটি release pre-release হিসেবে প্রকাশিত হয়েছিল। 27 September 2026-এর 0.9.965 প্রথম full release হিসেবে চিহ্নিত। নির্দিষ্ট একটি tag pin করুন। latest ব্যবহার করলে unattended docker compose pull এক সপ্তাহে আপনাকে কয়েকটি version এগিয়ে দিতে পারে। এই project এখনও এত নতুন যে release-এর মধ্যে এর API পরিবর্তিত হতে পারে। এতে এর ওপর ভিত্তি করে লেখা script বা dashboard কাজ করা বন্ধ করতে পারে। আপনি নিজে host করা প্রতিটি নতুন project-এ tag pin করার অভ্যাস রাখুন। এই কারণেই openGym-কে self-hosted workout tracker হিসেবে চালানো walkthrough-এ ঠিক একই কারণে নির্দিষ্ট git tag থেকে deploy করা হয়।
প্রতিটি upgrade-এর আগে backup নিন। এরপর পরিকল্পনা করে upgrade করুন।
docker compose stop chaptarr
sudo tar czf chaptarr-config-backup.tgz ./config
docker compose start chaptarrdocker compose pull chaptarr
docker compose up -d chaptarrProject-এর প্রতিবেদন অনুযায়ী, প্রায় ছয় মাসে এবং 11,000-এর বেশি user-এর মধ্যে data loss-এর কোনো ঘটনা ঘটেনি। তবু তারা backup রাখার এবং এমন library-তে এটিকে point না করার পরামর্শ দেয় যা হারালে আপনি ক্ষতি সামলাতে পারবেন না। দুটি পরামর্শই গুরুত্বসহকারে নিন। config archive server-এর বাইরে copy করুন। যে disk-এ সুরক্ষিত data থাকে, backup সেই একই disk-এ থাকলে সেটি backup নয়। ওই একক tarball-এ app-এর local state থাকে, কারণ এতে /config-এর অধীনে থাকা SQLite database এবং configuration অন্তর্ভুক্ত থাকে। আলাদা database server-এ থাকা data-এর database dump-ও নিতে হবে। Postgres data এবং uploaded file-সহ VPS-এ Chatwoot self-host করা backup ধাপটি এই কাঠামোই অনুসরণ করে।
ব্যর্থতার ধরন এবং যে স্ট্রিংগুলো দেখবেন
Container বারবার restart হয়। docker compose ps-এ Restarting দেখায়। প্রথমে docker compose logs chaptarr পড়ুন। শুধু root-owned ./config থাকলেই এই loop-এর কারণ ব্যাখ্যা হয় না: app চালু করার আগে entrypoint সাধারণত ownership ঠিক করে। লগে data directory-তে লেখার অনুমতি নেই বলা হলে Compose-এর user: override, read-only mount অথবা ownership পরিবর্তন প্রত্যাখ্যান করা filesystem আছে কি না পরীক্ষা করুন। Override সরিয়ে দিন, যাতে entrypoint তার setup সম্পন্ন করতে পারে। Writable local directory-এর ownership ভুল হলে sudo chown -R 1000:1000 ./config চালান।
Import কখনও সম্পূর্ণ হয় না এবং ফাইল downloads-এই থেকে যায়। Chaptarr download পড়তে পারে, কিন্তু library-তে লিখতে পারে না। আপনার PUID এবং PGID-এর সঙ্গে ls -ln /srv/media/audiobooks তুলনা করুন। অন্য UID-এর মালিকানাধীন directory, অথবা আপনার group-এর মালিকানাধীন হলেও group write অনুমতি না থাকা directory, ফাইল সরানো বন্ধ করে। নতুন ফাইলের ক্ষেত্রে UMASK=002 দ্বিতীয় সমস্যাটি প্রতিরোধ করে।
প্রতিটি import-এর পরে disk usage দ্বিগুণ হয়। কোনো hardlink তৈরি হয়নি, তাই ফাইলটি copy হয়েছে। volumes section-এর ln test চালান। Invalid cross-device link দিয়ে শেষ হওয়া error এটি নিশ্চিত করে। single-parent mount হলো এর সমাধান।
Download client connect হবে না। আপনি host হিসেবে localhost দিয়েছেন। Container-এর ভেতরে এটি Chaptarr নিজেই। Container name ব্যবহার করুন এবং docker network inspect arr-এ উভয় container তালিকাভুক্ত আছে কি না পরীক্ষা করুন।
Compose service চালু করতে অস্বীকৃতি জানায়। Bind for 127.0.0.1:8789 failed: port is already allocated-এর অর্থ হলো অন্য কোনো process port-টি ব্যবহার করছে। sudo ss -lntp | grep 8789 দিয়ে সেটি খুঁজে বের করুন।
Browser-এ একেবারেই কিছু দেখা যায় না। Port 127.0.0.1-এ bind করা থাকলে Internet-এর মাধ্যমে আপনার laptop-এর connect করার জন্য কিছু থাকে না। এটিই প্রত্যাশিত আচরণ। প্রথমে SSH tunnel খুলুন।
FAQ
আমি কি আমার Readarr লাইব্রেরি Chaptarr-এ স্থানান্তর করতে পারি?
Import হিসেবে নয়। Chaptarr Readarr-এর metadata source-এর সঙ্গে সামঞ্জস্যপূর্ণ নয় এবং নিজস্ব provider pipeline ব্যবহার করে। তাই Readarr-এ সংরক্ষিত identifier-এর এখানে কোনো অর্থ নেই এবং database conversion-এর কোনো ব্যবস্থা নেই। Disk-এ থাকা আপনার file অপরিবর্তিত থাকে। একই path-গুলোকে root folder হিসেবে যোগ করুন, library import চালান, এবং Chaptarr-কে নিজে file match করতে দিন। Quality profile, naming format, indexer setting এবং ভুল match সংশোধন আপনাকেই করতে হবে। তাই সবকিছু import করার আগে একটি ছোট folder দিয়ে শুরু করুন।
Chaptarr আমার audiobook folder-এ লিখতে পারে না কেন?
সাধারণত container-এর user-এর ওই directory-তে write permission থাকে না, কারণ container-টি directory-টির মালিক user-এর থেকে আলাদা UID-তে চলে। এই variable-গুলো unset থাকলে Chaptarr PUID=99 এবং PGID=100-এ fallback করে। এগুলো unRAID-এর value, তাই সাধারণ Ubuntu VPS-এ ভুল। এগুলো আপনার নিজস্ব id -u এবং id -g value-তে সেট করুন। Download client-এও একই জোড়া ব্যবহার করুন। নতুন file যেন group-writable থাকে, তার জন্য UMASK=002 সেট করুন। Library directory-টির ownership ls -ln দিয়ে পরীক্ষা করুন। এটি name-এর বদলে number দেখায়, তাই name দিয়ে তুলনা করা যায় না।
Import-এর পরে আমার disk usage দ্বিগুণ হলো কেন?
Chaptarr file-টি copy করেছে, কারণ এটি hardlink তৈরি করতে পারেনি। /downloads এবং /audiobooks-কে আলাদা bind হিসেবে mount করলে container-এর ভিতরে এগুলো আলাদা mount point হয়ে যায়। তখন kernel mount point অতিক্রম করে hardlink তৈরি করতে অস্বীকার করে এবং Invalid cross-device link দেখায়। /srv/media:/data-এর মতো একটি parent directory mount করুন এবং app-এর ভিতরে /data/downloads ও /data/audiobooks ব্যবহার করুন। দুটি path-ই host-এর একই filesystem-এ থাকতে হবে। df -h দিয়ে এটি নিশ্চিত করা যায়।
Chaptarr কি আমার audiobook চালাতে পারে?
না। এটি audiobook খুঁজে, download করে, rename করে এবং file করে। Playback-এর জন্য আলাদা program দরকার। Audiobookshelf সাধারণত এর সঙ্গে ব্যবহার করা হয়, কারণ এটি বিভিন্ন device-এ আপনার playback position মনে রাখে। এর জন্য official image ghcr.io/advplyr/audiobookshelf:latest ব্যবহার করুন এবং একই host audiobook path mount করুন। Folder-টিকে library হিসেবে যোগ করলে Jellyfin-ও file-গুলো চালাতে পারবে।
আমার গুরুত্বপূর্ণ library-তে Chaptarr চালানো কি নিরাপদ?
এটি একটি নতুন fork-এর beta software। Project-টিও তা স্পষ্টভাবে জানায়। একই সঙ্গে project প্রায় ছয় মাসে data loss-এর কোনো ঘটনা না ঘটার এবং এগারো হাজারের বেশি user থাকার কথা জানিয়েছে। আশ্বস্ত করার মতো বিষয় হলো GPL-3.0 license, যা code fork করার সুযোগ রাখে, এবং .NET 10 base, যা August 2026 অনুযায়ী একটি long term support runtime। latest-এর বদলে 0.9.925-এর মতো নির্দিষ্ট image tag ব্যবহার করুন। প্রতিটি upgrade-এর আগে /config backup নিন এবং archive-টি server-এর বাইরে সংরক্ষণ করুন।