VPS-এ Chaptarr সেটআপ করার নিয়ম
Readarr বন্ধ হওয়ার পর অডিওবুক ম্যানেজমেন্টের জন্য Chaptarr ব্যবহার করুন। এই গাইডে Docker Compose কনফিগারেশন, PUID, PGID সেটআপ এবং মেটাডেটা সমস্যার সমাধান বিস্তারিত দেওয়া হলো।
Chaptarr কী এবং কেন Readarr ব্যবহারকারীদের এটি প্রয়োজন
Chaptarr হলো Readarr-এর একটি fork, যা একই instance থেকে অডিওবুক এবং ইবুক উভয়ই পরিচালনা করে। এটি নতুন releases-এর জন্য নজর রাখে, সেগুলোকে আপনার download client-এ পাঠায়, এবং তারপর ফলাফলগুলো রিনেম করে আপনার লাইব্রেরিতে সাজিয়ে রাখে। এটি কোনো কিছু প্লে করে না, তাই আপনাকে Audiobookshelf-এর মতো কোনো প্লেয়ারের সাথে এটি ব্যবহার করতে হবে।
Readarr 27 জুন 2025 তারিখে বন্ধ (retired) হয়ে গেছে। Servarr টিমের নিজস্ব নোটিশে এর কারণ উল্লেখ করা হয়েছে: প্রজেক্টটির মেটাডেটা ব্যবহারের অনুপযোগী হয়ে পড়েছিল এবং Open Library-তে স্থানান্তরের কমিউনিটি প্রচেষ্টা থমকে গিয়েছিল। রিপোজিটরিটিকে আর্কাইভ করা হয়েছে। এর ফলে বই এবং অডিওবুক সংগ্রহের জন্য কোনো রক্ষণাবেক্ষণকারী ম্যানেজার ছিল না, আর Chaptarr সেই দায়িত্ব গ্রহণ করেছে। এটি Sonarr এবং Radarr থেকে আপনার পরিচিত কাঠামোটিই (indexers, download clients, quality profiles, root folders) বজায় রাখে এবং এর সাথে অডিওবুক হ্যান্ডলিং যুক্ত করে: ন্যারেটর-সচেতন অর্গানাইজেশন, একটি শিরোনামের একাধিক সংস্করণ, M4B এবং chaptered MP3 সাপোর্ট, এবং MP3 থেকে M4B কনভার্সন।
এই নির্দেশিকায় chaptarr/chaptarr:0.9.925 ইমেজ ট্যাগটি ব্যবহার করা হয়েছে, যা 9 আগস্ট 2026 তারিখে সর্বশেষ release ছিল। Chaptarr নিজেকে বিটা সফটওয়্যার হিসেবে অভিহিত করে। এমন কোনো লাইব্রেরিতে এটি ব্যবহার করার আগে শেষের দিকের রক্ষণাবেক্ষণ অংশটি পড়ুন, যা আপনি সহজে পুনরুদ্ধার করতে পারবেন না।
শুরু করার আগে আপনার যা প্রয়োজন
Docker এবং Compose plugin ইনস্টল করা একটি VPS, এবং লাইব্রেরির জন্য পর্যাপ্ত ডিস্ক স্পেস। অডিওবুক ফাইলের আকার বড় হয়, এবং যে ইমপোর্টে hardlinks ব্যবহার করা যায় না, সেখানে কিছু সময়ের জন্য ফাইলের দুটি কপি থাকে। নিচের volume সেকশনে এটি ব্যাখ্যা করা হয়েছে। যদি আপনার সার্ভারে Docker ইনস্টল করা না থাকে, তবে প্রথমে VPS-এ Docker ইনস্টল এবং রান করা সম্পন্ন করে এখানে ফিরে আসুন।
Chaptarr বর্তমানে শুধুমাত্র Docker image হিসেবে পাওয়া যায়। একটি native Windows build তৈরির কাজ চলছে, তবে এখন পর্যন্ত কোনো ডিস্ট্রিবিউশন প্যাকেজ নেই। কন্টেইনারটি ডিফল্টভাবে এর ডেটাবেস /config-এ SQLite হিসেবে সংরক্ষণ করে। আপনি যদি আগে থেকেই PostgreSQL ব্যবহার করে থাকেন, তবে Chaptarr__Postgres__* এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে এটি একটি এক্সটার্নাল PostgreSQL সার্ভারের সাথে যুক্ত করা সম্ভব। একজন ব্যবহারকারীর জন্য একটি সার্ভারে SQLite ব্যবহার করাই সঠিক সিদ্ধান্ত।
Chaptarr-এর জন্য Compose সার্ভিস
এই সার্ভিসটি একটি বিদ্যমান স্ট্যাকের সাথে যুক্ত হয়। এটি একটি নির্দিষ্ট রিলিজ ট্যাগ ব্যবহার করে, ওয়েব UI-কে শুধুমাত্র লুপব্যাক ইন্টারফেসে পাবলিশ করে এবং আপনার ডাউনলোড ক্লায়েন্ট যে নেটওয়ার্ক ব্যবহার করছে তার সাথে যুক্ত হয়।
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 লাইনটির অর্থ হলো "এই নেটওয়ার্কটি আগে থেকেই বিদ্যমান, এর সাথে যুক্ত হও"। যখন Prowlarr এবং আপনার টরেন্ট ক্লায়েন্ট ভিন্ন কোনো Compose প্রজেক্ট থেকে আসে, তখন এটি ব্যবহার করুন। কারণ অন্যথায়, দ্বিতীয় একটি Compose ফাইল তার নিজস্ব আইসোলেটেড নেটওয়ার্ক তৈরি করবে এবং Chaptarr তখন কখনোই নাম দিয়ে qbittorrent-কে রিজলভ করতে পারবে না। docker network ls থেকে প্রকৃত নামটি জেনে নিন। যদি আপনার স্ট্যাকটি ইতিমধ্যেই একটি ফাইলে থাকে, তবে সেই ফাইলে chaptarr: সার্ভিসটি যোগ করুন এবং পুরো networks: ব্লকটি মুছে ফেলুন। বিস্তারিত লেআউট সম্পর্কে জানতে Docker Compose-এর অধীনে একটি পূর্ণাঙ্গ arr স্ট্যাক এবং নাম নির্ধারণের নিয়ম সম্পর্কে জানতে Compose নেটওয়ার্ক এবং সার্ভিস নাম কীভাবে রিজলভ হয় দেখুন।
প্রথমে কনফিগারেশন ডিরেক্টরি তৈরি করুন, তারপর এটি স্টার্ট করুন।
mkdir -p ./config
sudo chown 1000:1000 ./config
docker compose up -d
docker compose ps
docker compose logs -f chaptarrdocker compose ps কমান্ডটি চালালে কন্টেইনারটিকে Up হিসেবে দেখানো উচিত। যদি কোনো কন্টেইনার Restarting হিসেবে তালিকাভুক্ত থাকে, তবে বুঝতে হবে সেটি স্টার্ট হতে ব্যর্থ হয়েছে এবং পুনরায় চেষ্টা করা হচ্ছে। এর কারণ প্রায় সবসময়ই কনফিগারেশন ডিরেক্টরি সংক্রান্ত সমস্যা। অ্যাপটি যখন 8789 পোর্টে লিসেন করা শুরু করে, তখন লগ স্ক্রলিং বন্ধ হয়ে যায়।
PUID, PGID এবং root হিসেবে Docker-এর তৈরি ডিরেক্টরি
আপনি যদি PUID=99 এবং PGID=100 সেট না করেন, তবে Chaptarr ডিফল্ট হিসেবে এই মানগুলো ব্যবহার করে। এগুলো unRAID-এর মান, কিন্তু সাধারণ Ubuntu VPS-এ এগুলোর কোনো কার্যকর মালিকানা নেই। ফলে ফাইলগুলো এমন মালিকের অধীনে তৈরি হয় যা আপনার login দিয়ে পরিবর্তন করা যায় না। id -u এবং id -g কমান্ড চালিয়ে আপনার নিজের UID এবং GID জেনে নিন এবং সেগুলো ফাইলে বসান।
যেসব container একই ফাইল নিয়ে কাজ করে, সেগুলোর জন্য একই জোড়া মান প্রয়োজন। download client ফাইল লেখে /srv/media/downloads-এ, Chaptarr ফাইলটি সরিয়ে নেয় /srv/media/audiobooks-এ, এবং player সেখান থেকে ফাইলটি পড়ে। যদি download client 1000:1000 হিসেবে এবং Chaptarr 99:100 হিসেবে চলে, তবে import ব্যর্থ হবে। কারণ Chaptarr এমন কোনো ফাইল মুছে বা সরাতে পারে না যার মালিক সে নিজে নয়। UMASK=002 নতুন ফাইলগুলোকে group-writable করে তোলে, যা একাধিক container-এর মধ্যে media group শেয়ার করার জন্য প্রয়োজনীয়। সম্পূর্ণ ম্যাপিং এখানে দেখুন: PUID এবং PGID কীভাবে container user-কে host file-এর সাথে ম্যাপ করে।
README-তে একটি নির্দিষ্ট সমস্যার বিষয়ে সতর্ক করা হয়েছে, যা পুনরায় উল্লেখ করা প্রয়োজন। আপনি যখন docker compose up চালান, তখন যদি ./config ডিরেক্টরিটির অস্তিত্ব না থাকে, তবে Docker সেটি তৈরি করে এবং এর মালিকানা root:root-কে দেয়। এরপর container-টি UID 1000 হিসেবে চলার চেষ্টা করে কিন্তু নিজের database-এ লিখতে পারে না। ফলে এটি বারবার বন্ধ হয়ে রিস্টার্ট হতে থাকে। ls -ln ./config দিয়ে পরীক্ষা করুন, যা নামের পরিবর্তে মালিকের সংখ্যাসূচক মান দেখায়। দুটি শূন্য থাকার অর্থ হলো এর মালিক root। sudo chown -R 1000:1000 ./config দিয়ে এটি ঠিক করুন এবং container-টি পুনরায় চালু করুন।
কেন অডিওবুক এবং ইবুক ভলিউম আলাদা রাখলে 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 সাধারণত এর জন্য ব্যবহৃত হয় কারণ এটি বিভিন্ন ডিভাইসে আপনার শোনার অবস্থান ট্র্যাক করে এবং এর ফোন অ্যাপ রয়েছে। এর অফিসিয়াল ইমেজ হলো 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-stoppedChaptarr যে হোস্ট পাথে ফাইল লেখে, সেই একই পাথ মাউন্ট করুন, তারপর ওয়েব UI-এর ভেতরে লাইব্রেরি হিসেবে /audiobooks যোগ করুন। পরবর্তী স্ক্যানের পর একটি নতুন ইমপোর্ট দেখা যাবে।
আপনি যদি ইতিমধ্যে Jellyfin ব্যবহার করেন, তবে সেখানে ফোল্ডারটিকে লাইব্রেরি হিসেবে যোগ করতে পারেন এবং এটি ফাইলগুলো চালাবে, যদিও একটি দীর্ঘ অডিওবুক ফাইলে পুনরায় শোনার (resume) সুবিধাটি অডিওবুকের জন্য তৈরি সার্ভারের তুলনায় কিছুটা দুর্বল। সেই অংশটি সেটআপ করার প্রক্রিয়া VPS-এ মিডিয়া সার্ভার হিসেবে Jellyfin চালানো-তে আলোচনা করা হয়েছে। ইবুকের ক্ষেত্রে, /srv/media/ebooks-কে একটি রিডার অ্যাপ্লিকেশনে যুক্ত করুন; ফাইলটির নামকরণ এবং সাজানোর কাজ শেষ হওয়ার পর Chaptarr-এর দায়িত্ব শেষ হয়।
রক্ষণাবেক্ষণের ঝুঁকি: লাইসেন্স, রানটাইম এবং দ্রুত পরিবর্তনশীল ট্যাগ
Chaptarr-এর লাইসেন্স হলো GPL-3.0 এবং এর কপিরাইট Chaptarr কন্ট্রিবিউটরদের, যার কিছু অংশ Servarr টিমের কাছ থেকে নেওয়া। তাই কোডটি উন্মুক্ত থাকে এবং বর্তমান মেইনটেইনার কাজ বন্ধ করে দিলেও যে কেউ এটি আবার ফর্ক (fork) করতে পারবে। এটি .NET 10-এর ওপর ভিত্তি করে তৈরি, যা আগস্ট 2026 অনুযায়ী রানটাইমের বর্তমান লং টার্ম সাপোর্ট রিলিজ। এর মানে হলো, এর ভিত্তিটি কয়েক মাসের পরিবর্তে কয়েক বছর ধরে সাপোর্ট পাবে। আগামী বছর এই প্রজেক্টটি টিকে থাকবে কি না, তা বিচার করার ক্ষেত্রে এই দুটি তথ্যই গুরুত্বপূর্ণ।
ভার্সন নম্বর খুব দ্রুত পরিবর্তিত হয়। রিলিজগুলো প্রি-রিলিজ হিসেবে প্রকাশিত হয় এবং এই নির্দেশিকাটি লেখার দিনেই 0.9.925 ভার্সনটি এসেছে। একটি নির্দিষ্ট ট্যাগ পিন (pin) করে রাখুন। latest ব্যবহার করার অর্থ হলো, একটি আনঅ্যাটেন্ডেড docker compose pull আপনাকে এক সপ্তাহের মধ্যে কয়েক ভার্সন এগিয়ে নিয়ে যেতে পারে। এত নতুন একটি ফর্কের ক্ষেত্রে রিলিজের মাঝে API পরিবর্তিত হতে পারে, যা আপনার লেখা কোনো স্ক্রিপ্ট বা ড্যাশবোর্ডকে অকেজো করে দিতে পারে। আপনি নিজে হোস্ট করেন এমন প্রতিটি নতুন প্রজেক্টের ক্ষেত্রেই ট্যাগ পিন করার অভ্যাসটি বজায় রাখা উচিত। ঠিক এই কারণেই running openGym as a self-hosted workout tracker-এর নির্দেশিকায় একটি নির্দিষ্ট গিট ট্যাগ থেকে ডিপ্লয় করার পরামর্শ দেওয়া হয়েছে।
প্রতিটি আপগ্রেডের আগে ব্যাকআপ নিন, তারপর সচেতনভাবে আপগ্রেড করুন।
docker compose stop chaptarr
sudo tar czf chaptarr-config-backup.tgz ./config
docker compose start chaptarrdocker compose pull chaptarr
docker compose up -d chaptarrপ্রকল্পটি প্রায় ছয় মাসে এবং 11000-এরও বেশি ব্যবহারকারীর মধ্যে কোনো data loss event রিপোর্ট করেনি। তবু এটি backup রাখার এবং এমন কোনো library-র দিকে এটি point না করার পরামর্শ দেয়, যেটি হারালে আপনি ক্ষতি সামলাতে পারবেন না। এই দুই দিকই গুরুত্ব দিয়ে নিন। config archive-টি server-এর বাইরে copy করুন। যে backup সুরক্ষিত করা জিনিসটির একই disk-এ থাকে, সেটি backup নয়। Chaptarr তার state /config-এর অধীনে একটি SQLite file-এ রাখে বলেই ওই একটিমাত্র tarball যথেষ্ট। আলাদা database server-এ থাকা যেকোনো data-এর জন্য database-ও dump করতে হবে। Postgres data এবং uploaded file-সহ VPS-এ Chatwoot self-host করা অবস্থায় backup step-টি এই কাঠামোতেই নেওয়া হয়।
ব্যর্থতার ধরন এবং যে বার্তাগুলো আপনি দেখবেন
কন্টেইনারটি বারবার রিস্টার্ট হচ্ছে। docker compose ps-এ Restarting দেখাচ্ছে। ls -ln ./config কমান্ডটি চালান। মালিকানার কলামে দুটি শূন্য থাকার অর্থ হলো Docker ডিরেক্টরিটি root হিসেবে তৈরি করেছে এবং কন্টেইনারের ইউজার সেটিতে ডেটাবেস লিখতে পারছে না। sudo chown -R 1000:1000 ./config কমান্ডটি চালান।
ইমপোর্ট সম্পন্ন হচ্ছে না এবং ফাইলগুলো ডাউনলোড ফোল্ডারেই থেকে যাচ্ছে। Chaptarr ডাউনলোড ফোল্ডারটি পড়তে পারছে কিন্তু লাইব্রেরিতে লিখতে পারছে না। আপনার PUID এবং PGID-এর সাথে ls -ln /srv/media/audiobooks তুলনা করুন। ভিন্ন UID-এর মালিকানাধীন ডিরেক্টরি, অথবা আপনার গ্রুপের মালিকানাধীন কিন্তু গ্রুপ রাইট পারমিশন না থাকা ডিরেক্টরি ফাইল স্থানান্তর আটকে দেয়। UMASK=002 নতুন ফাইলের ক্ষেত্রে এই সমস্যাটি প্রতিরোধ করে।
প্রতিটি ইমপোর্টের পর ডিস্কের ব্যবহার দ্বিগুণ হয়ে যাচ্ছে। কোনো hardlink তৈরি হয়নি, তাই ফাইলটি কপি করা হয়েছে। ভলিউম সেকশন থেকে ln পরীক্ষাটি চালান। 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-এ bind করা থাকলে, ইন্টারনেটের মাধ্যমে আপনার ল্যাপটপের সংযোগ স্থাপনের কোনো উপায় নেই। এটিই প্রত্যাশিত আচরণ। প্রথমে SSH tunnel খুলুন।
FAQ
আমি কি আমার Readarr লাইব্রেরি Chaptarr-এ স্থানান্তর করতে পারি?
সরাসরি ইমপোর্ট করা সম্ভব নয়। Chaptarr, Readarr-এর মেটাডেটা সোর্সের সাথে সামঞ্জস্যপূর্ণ নয় এবং এটি নিজস্ব প্রোভাইডার পাইপলাইন ব্যবহার করে। তাই Readarr-এর সংরক্ষিত আইডেন্টিফায়ারগুলোর কোনো কার্যকারিতা নেই এবং ডাটাবেস রূপান্তরের কোনো ব্যবস্থা নেই। আপনার ডিস্কে থাকা ফাইলগুলো অপরিবর্তিত থাকবে। আপনি একই পাথগুলোকে রুট ফোল্ডার হিসেবে যোগ করুন, লাইব্রেরি ইমপোর্ট চালান এবং Chaptarr-কে ফাইলগুলো নিজে থেকে ম্যাচ করতে দিন। কোয়ালিটি প্রোফাইল, নেমিং ফরম্যাট, ইনডেক্সার সেটিংস এবং ভুল ম্যাচগুলো ম্যানুয়ালি ঠিক করতে হবে, তাই সবকিছু ইমপোর্ট করার আগে একটি ছোট ফোল্ডার দিয়ে পরীক্ষা করে নিন।
Chaptarr কেন আমার অডিওবুক ফোল্ডারে লিখতে পারছে না?
কন্টেইনারের ব্যবহারকারীর ফাইলগুলোর ওপর মালিকানা নেই। PUID=99 এবং PGID=100 ভেরিয়েবলগুলো সেট করা না থাকলে Chaptarr সেগুলোর ওপর নির্ভর করে, যা unRAID-এর ডিফল্ট মান এবং সাধারণ Ubuntu VPS-এর জন্য ভুল। এগুলোকে আপনার নিজস্ব id -u এবং id -g হিসেবে সেট করুন, ডাউনলোড ক্লায়েন্টেও একই জোড়া ব্যবহার করুন এবং UMASK=002 সেট করুন যাতে নতুন ফাইলগুলো গ্রুপ-রাইটেবল থাকে। লাইব্রেরি ডিরেক্টরিতে ls -ln দিয়ে মালিকানা যাচাই করুন, কারণ এটি নামের পরিবর্তে নম্বর দেখায় যা আপনি সরাসরি তুলনা করতে পারবেন না।
ইমপোর্টের পর আমার ডিস্কের ব্যবহার কেন দ্বিগুণ হয়ে গেল?
Chaptarr ফাইলটি কপি করেছে কারণ এটি হার্ডলিঙ্ক করতে পারেনি। /downloads এবং /audiobooks-কে আলাদা বাইন্ড হিসেবে মাউন্ট করলে সেগুলো কন্টেইনারের ভেতরে আলাদা মাউন্ট পয়েন্ট হিসেবে কাজ করে এবং কার্নেল Invalid cross-device link এর কারণে মাউন্ট পয়েন্টের মধ্যে হার্ডলিঙ্ক করতে দেয় না। একটি প্যারেন্ট ডিরেক্টরি যেমন /srv/media:/data মাউন্ট করুন এবং অ্যাপের ভেতরে /data/downloads ও /data/audiobooks ব্যবহার করুন। উভয় পাথ অবশ্যই একই হোস্ট ফাইলসিস্টেমে থাকতে হবে, যা df -h নিশ্চিত করে।
Chaptarr কি আমার অডিওবুক প্লে করতে পারে?
না। এটি অডিওবুক খুঁজে বের করে, ডাউনলোড করে, নাম পরিবর্তন করে এবং সাজিয়ে রাখে; প্লেব্যাক করার জন্য আলাদা প্রোগ্রামের প্রয়োজন হয়। Audiobookshelf সাধারণত এর সাথে ব্যবহার করা হয় কারণ এটি বিভিন্ন ডিভাইসে আপনার শোনার অবস্থান মনে রাখতে পারে; এর জন্য অফিসিয়াল ইমেজ ghcr.io/advplyr/audiobookshelf:latest ব্যবহার করুন এবং একই হোস্ট অডিওবুক পাথ মাউন্ট করুন। Jellyfin-এও ফাইলগুলো প্লে করা সম্ভব যদি আপনি ফোল্ডারটিকে লাইব্রেরি হিসেবে যোগ করেন, তবে দীর্ঘ একক ফাইলের অডিওবুকের ক্ষেত্রে এটি শোনার অবস্থান মনে রাখার ক্ষেত্রে কিছুটা দুর্বল।
আমার গুরুত্বপূর্ণ লাইব্রেরিতে Chaptarr চালানো কি নিরাপদ?
এটি একটি নতুন ফোর্ক থেকে আসা বেটা সফটওয়্যার। প্রকল্পটি নিজেই এটি স্বীকার করে, তবে প্রায় ছয় মাস এবং এগারো হাজারেরও বেশি ব্যবহারকারীর মধ্যে কোনো ডেটা হারানোর ঘটনা রিপোর্ট করা হয়নি। আশ্বস্ত করার মতো বিষয় হলো এর GPL-3.0 লাইসেন্স, যা কোডটিকে ফোর্ক করার সুযোগ রাখে এবং .NET 10 বেস, যা আগস্ট 2026 পর্যন্ত একটি দীর্ঘমেয়াদী সাপোর্ট রানটাইম। latest এর পরিবর্তে 0.9.925 এর মতো নির্দিষ্ট ইমেজ ট্যাগ ব্যবহার করুন, প্রতিটি আপগ্রেডের আগে /config ব্যাকআপ নিন এবং সেই আর্কাইভটি সার্ভারের বাইরে রাখুন।