একটি Docker Compose ফাইলে Prowlarr, Sonarr ও Radarr সেটআপ
একটি Docker Compose ফাইলে Prowlarr, Sonarr, Radarr ও qBittorrent সেটআপ করার সঠিক নিয়ম জানুন। হার্ডলিঙ্ক কাজ করার জন্য সঠিক PUID, PGID ও ভলিউম লেআউট কনফিগার করার উপায় এখানে দেখুন।
আপনি যা তৈরি করছেন
একটি Docker Compose arr stack হলো চারটি কন্টেইনারের সমষ্টি যা একটি মিডিয়া লাইব্রেরি পরিচালনা করে: ইনডেক্সার সেটিংসের জন্য Prowlarr, টিভি সিরিজের জন্য Sonarr, সিনেমার জন্য Radarr এবং ডাউনলোড ক্লায়েন্ট হিসেবে qBittorrent। এরা Compose নেটওয়ার্কে একে অপরের সাথে সার্ভিস নামের মাধ্যমে যোগাযোগ করে এবং হোস্ট মেশিনে একটি সাধারণ ফোল্ডার ট্রি শেয়ার করে। এর ইনস্টলেশন প্রক্রিয়াটি সংক্ষিপ্ত। তবে এই স্ট্যাকটি বছরের পর বছর নির্বিঘ্নে চলবে নাকি প্রতি সপ্তাহে সমস্যা তৈরি করবে, তা নির্ভর করে ভলিউম লেআউটের ওপর। তাই এই গাইডের বেশিরভাগ অংশই এ বিষয়ে আলোকপাত করে।
এই স্ট্যাকটি নিজে থেকে আপনার জন্য কোনো কন্টেন্ট খুঁজে দেবে না। Prowlarr-এ আপনি যে ইনডেক্সারগুলো যোগ করবেন, সেগুলোই সেখানে থাকবে। কোন ইনডেক্সার ব্যবহার করবেন তা সম্পূর্ণ আপনার সিদ্ধান্ত এবং এর আইনি দায়ভারও আপনার। এই গাইডটি মূলত সিস্টেমের অভ্যন্তরীণ কাঠামোর ওপর আলোকপাত করে: ইউজার, পাথ, পারমিশন, কন্টেইনার নেটওয়ার্কিং এবং এটি সঠিকভাবে কাজ করছে কি না তা যাচাই করার পদ্ধতি।
আপনি যদি আগে কখনো Compose ফাইল না লিখে থাকেন, তবে প্রথমে VPS-এর জন্য Docker Compose-এর মৌলিক বিষয়গুলো পড়ে নিন। এই পোস্টটি ধরে নেয় যে আপনার সার্ভারে docker compose version কমান্ডটি ইতিমধ্যে আউটপুট প্রদান করছে।
কেন hardlink কাজ করা বন্ধ করে দেয় এবং কেন এটিই মূল বিষয়
Sonarr যখন কোনো ডাউনলোড সম্পন্ন করে, তখন এটি ফাইলটিকে আপনার লাইব্রেরিতে ইমপোর্ট করে। যদি ডাউনলোড ফোল্ডার এবং লাইব্রেরি ফোল্ডার একই filesystem-এ থাকে, তবে ইমপোর্টটি একটি hardlink হিসেবে সম্পন্ন হয়: এটি ডিস্কের একই ডেটার দিকে নির্দেশ করা একটি দ্বিতীয় নাম মাত্র। এতে কোনো অতিরিক্ত জায়গা বা সময়ের প্রয়োজন হয় না। আপনার মিডিয়া সার্ভার নতুন ফাইলটি পড়ার সময় torrent-টি পুরনো নাম থেকে seeding চালিয়ে যেতে পারে।
যদি ফোল্ডার দুটি ভিন্ন filesystem-এ থাকে, তবে kernel সেই link তৈরি করতে পারে না। তখন Sonarr বিকল্প হিসেবে ফাইলটি copy করে। একটি 40 GB-এর সিজন তখন 80 GB জায়গা দখল করে এবং ফাইল কপি হতে কয়েক মিনিট সময় লাগে; ইমপোর্ট লগে তখন রেকর্ড হয় যে hardlink ব্যর্থ হয়েছে এবং ফাইলটি কপি করা হয়েছে। নির্দিষ্ট ডিস্ক স্পেসের VPS-এ এভাবেই মানুষ এক সপ্তাহের মধ্যে জায়গা ফুরিয়ে ফেলে।
এখানেই ফাঁদটি লুকিয়ে আছে। একটি container-এর ভেতরে, bind mount হলো একটি filesystem boundary। যদি /mnt/data/torrents-কে /downloads হিসেবে এবং /mnt/data/media-কে /tv হিসেবে mount করেন, তবে host ডিস্কে উভয়ই একই জায়গায় থাকলেও, Sonarr সেগুলোকে দুটি আলাদা mount হিসেবে দেখে এবং সেগুলোর মধ্যে link করতে অস্বীকার করে। অফিসিয়াল LinuxServer.io ইমেজ ডকুমেন্টেশনে সরাসরি বলা হয়েছে: আলাদা /downloads এবং /tv পাথ ব্যবহার করলে hardlink করার ক্ষমতা হারাবেন।
এর সমাধান হলো একটিমাত্র mount ব্যবহার করা। মিডিয়া নিয়ে কাজ করে এমন প্রতিটি container-কে একই একক volume, /mnt/data:/data দিতে হবে এবং তাদের ব্যবহৃত প্রতিটি পাথ হবে এর ভেতরের একটি ফোল্ডার। একটি mount point, একটি filesystem, আর এভাবেই hardlink কাজ করবে।
ইউজার, গ্রুপ এবং ফোল্ডার তৈরি করুন
কন্টেইনারগুলো PUID এবং PGID দ্বারা নির্ধারিত একটি সংখ্যাসূচক ইউজার আইডি (numeric user id) হিসেবে ফাইল লেখে। আপনার নিজের অ্যাকাউন্ট ব্যবহার করুন যাতে আপনি sudo ছাড়াই SSH-এর মাধ্যমে সেই ফাইলগুলো পড়তে এবং এডিট করতে পারেন।
id -u
id -gসাধারণত একটি নতুন Ubuntu VPS-এ উভয় কমান্ডই 1000 আউটপুট দেয়। এখন ডিরেক্টরি ট্রি তৈরি করুন। এটি আপনার মিডিয়া ধারণকারী যেকোনো ডিস্কে রাখুন এবং পুরো ট্রি-টি সেই একটি ডিস্কেই বজায় রাখুন।
sudo mkdir -p /mnt/data/torrents/movies /mnt/data/torrents/tv
sudo mkdir -p /mnt/data/media/Movies /mnt/data/media/Shows
sudo chown -R 1000:1000 /mnt/data
sudo chmod -R 775 /mnt/dataসামনে অগ্রসর হওয়ার আগে নিশ্চিত করুন যে এটি সত্যিই একটি ফাইলসিস্টেম:
df --output=source,target /mnt/data/torrents /mnt/data/mediaউভয় লাইনেই একই সোর্স ডিভাইস দেখাতে হবে। দুটি ভিন্ন ডিভাইসের অর্থ হলো হার্ডলিঙ্ক কখনোই কাজ করবে না, কন্টেইনার কনফিগারেশনে আপনি যাই সেট করুন না কেন।
লাইব্রেরি ফোল্ডারগুলোর নাম ইচ্ছাকৃতভাবে Movies এবং Shows রাখা হয়েছে। আপনি যদি ইতিমধ্যে Jellyfin-কে আপনার মিডিয়া সার্ভার হিসেবে চালিয়ে থাকেন, তবে /mnt/data/media-কে Jellyfin-এ /media হিসেবে মাউন্ট করুন এবং এর লাইব্রেরিগুলো /media/Movies ও /media/Shows-এ রাখুন, ঠিক যেখানে সেই গাইডটি সেগুলোকে রাখতে বলে।
এনভায়রনমেন্ট ফাইল
প্রতিটি সার্ভারের জন্য পরিবর্তনশীল মানগুলো .env ফাইলে রাখুন, যা Compose ফাইলের পাশেই থাকবে।
mkdir -p ~/arr && cd ~/arr~/arr/.env লিখুন:
PUID=1000
PGID=1000
TZ=Etc/UTC
DATA_ROOT=/mnt/dataTZ-কে আপনার নিজস্ব জোনে সেট করুন, যেমন Europe/Berlin। arr অ্যাপ্লিকেশনগুলো এই জোনের ভিত্তিতে টাস্ক শিডিউল করে এবং লগ লাইনে টাইমস্ট্যাম্প যুক্ত করে, তাই ভুল মান দিলে পরবর্তীতে প্রতিটি লগ বোঝা বিভ্রান্তিকর হয়ে দাঁড়াবে।
Compose ফাইল
~/arr/docker-compose.yml লিখুন:
services:
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ./config/prowlarr:/config
ports:
- 127.0.0.1:9696:9696
restart: unless-stopped
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ./config/sonarr:/config
- ${DATA_ROOT}:/data
ports:
- 127.0.0.1:8989:8989
restart: unless-stopped
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ./config/radarr:/config
- ${DATA_ROOT}:/data
ports:
- 127.0.0.1:7878:7878
restart: unless-stopped
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- WEBUI_PORT=8080
- TORRENTING_PORT=6881
volumes:
- ./config/qbittorrent:/config
- ${DATA_ROOT}:/data
ports:
- 127.0.0.1:8080:8080
- 6881:6881
- 6881:6881/udp
stop_grace_period: "10s"
restart: unless-stoppedএই ফাইলের চারটি বিষয় প্রকৃত কাজ সম্পন্ন করে।
মিডিয়া ফাইল ব্যবহারকারী তিনটি কন্টেইনারেই ${DATA_ROOT}:/data একই রকম। Prowlarr-এর ক্ষেত্রে এটি প্রয়োজন হয় না, কারণ Prowlarr কখনোই কোনো মিডিয়া ফাইল খোলে না।
প্রতিটি ওয়েব পোর্ট 127.0.0.1-এর সাথে বাইন্ড করা থাকে, তাই Docker শুধুমাত্র loopback অ্যাড্রেসে এটি পাবলিশ করে। সাধারণ 8989:8989 ব্যবহার করলে তা প্রতিটি ইন্টারফেসে পাবলিশ হয়ে যেত এবং Docker-এর নিজস্ব ফায়ারওয়াল রুল সেই ট্রাফিককে সরাসরি ufw deny রুলের পাশ দিয়ে নিয়ে যেত। এই আচরণটি ব্যবহারকারীদের নিয়মিত অবাক করে, এবং এটি কেন Docker সরাসরি ufw-এর মাধ্যমে পোর্ট পাবলিশ করে-এ ব্যাখ্যা করা হয়েছে।
পোর্ট 6881 ইচ্ছাকৃতভাবে সব ইন্টারফেসে পাবলিশ করা হয়েছে। এটি টরেন্ট লিসেনিং পোর্ট এবং ইনকামিং পিয়ার কানেকশনের জন্য এটি অবশ্যই রিচেবল হতে হবে। sudo ufw allow 6881 দিয়ে এটি অ্যালাউ করুন, এবং যদি এই কমান্ডটি আপনার কাছে নতুন মনে হয় তবে VPS-এর জন্য ufw ফায়ারওয়ালের মৌলিক বিষয়সমূহ পড়ুন।
কনফিগ ডিরেক্টরিগুলো প্রতিটি অ্যাপ্লিকেশনের জন্য আলাদা এবং শুধুমাত্র মিডিয়া ভলিউমটি শেয়ার করা হয়েছে। প্রথমবার স্টার্ট করার আগেই এগুলো তৈরি করুন যাতে এগুলোর মালিকানা root-এর পরিবর্তে আপনার ব্যবহারকারীর থাকে:
mkdir -p ~/arr/config/prowlarr ~/arr/config/sonarr ~/arr/config/radarr ~/arr/config/qbittorrent
docker compose up -d
docker compose psচারটি সার্ভিসই running রিড করবে। জুলাই 2026 অনুযায়ী এই ইমেজগুলো lscr.io-এ পাবলিশ করা হয়েছে এবং latest ট্যাগটি বর্তমান স্টেবল রিলিজ অনুসরণ করে। তাই আপনি যদি আপডেটগুলো হঠাৎ না চেয়ে নিজের সিদ্ধান্তে করতে চান, তবে একটি নির্দিষ্ট ভার্সন ট্যাগ ব্যবহার করুন।
নিরাপদে ওয়েব ইন্টারফেসগুলোতে প্রবেশ
পোর্টগুলো loopback-এ থাকায়, এখন পর্যন্ত কোনো কিছুই উন্মুক্ত নয়। আপনার নিজের মেশিন থেকে SSH-এর মাধ্যমে সেগুলোকে ফরওয়ার্ড করুন:
ssh -L 9696:127.0.0.1:9696 -L 8989:127.0.0.1:8989 \
-L 7878:127.0.0.1:7878 -L 8080:127.0.0.1:8080 you@your-serverএখন আপনার ব্রাউজারে http://127.0.0.1:8989 লিখলে সার্ভারে থাকা Sonarr-এ প্রবেশ করা যাবে। স্থায়ীভাবে ব্যবহারের জন্য, এই স্ট্যাকটিকে একাধিক অ্যাপের জন্য TLS সার্টিফিকেটসহ Traefik-এর পেছনে রাখুন, অথবা আপনার নিজের হোস্ট করা WireGuard VPN-এর মাধ্যমে সার্ভারে প্রবেশ করুন। এই অ্যাপ্লিকেশনগুলোর কোনোটিই শুধুমাত্র নিজস্ব লগইন পেজ দিয়ে পাবলিক ইন্টারনেটে রাখা উচিত নয়। আপনি যদি reverse proxy ব্যবহার করেন এবং চারটি আলাদা অ্যাপ্লিকেশনের লগইন মনে রাখার পরিবর্তে সবগুলোর জন্য একটি অ্যাকাউন্ট ব্যবহার করতে চান, তবে Authentik আপনাকে সেলফ-হোস্টেড সিঙ্গেল সাইন-অন (SSO) সুবিধা দেয়, যা Traefik-এর forward auth ব্যবহার করে প্রতিটি অনুরোধে কার্যকর করা যায়।
qBittorrent প্রথমবার চালু হওয়ার সময় একটি র্যান্ডম অ্যাডমিনিস্ট্রেটর পাসওয়ার্ড তৈরি করে এবং তা কন্টেইনারের লগে প্রদর্শন করে। সেটি পড়ুন এবং তারপর ওয়েব ইন্টারফেসে গিয়ে পাসওয়ার্ডটি পরিবর্তন করুন:
docker compose logs qbittorrent | grep -i passwordযদি আপনি এটি পরিবর্তন না করেন, তবে প্রতিবার রিস্টার্টের সময় নতুন র্যান্ডম পাসওয়ার্ড তৈরি হবে এবং আপনাকে প্রতিবারই লগ চেক করতে হবে।
প্রতিটি অ্যাপ্লিকেশনের ভেতরে পাথ সেট করা
qBittorrent-এ Options ওপেন করুন, তারপর Downloads-এ যান এবং ডিফল্ট সেভ পাথ হিসেবে /data/torrents সেট করুন। অসম্পূর্ণ ডাউনলোড ফোল্ডারটিকে একই ট্রির ভেতরে রাখুন, যেমন /data/torrents/incomplete। /data-এর বাইরে কোথাও কোনো ডাউনলোড শেষ হলে সেটিকে লাইব্রেরিতে হার্ডলিঙ্ক করা সম্ভব হবে না।
Sonarr-এ Settings ওপেন করুন, তারপর Media Management-এ যান এবং রুট ফোল্ডার /data/media/Shows যোগ করুন। Radarr-এর ক্ষেত্রে রুট ফোল্ডারটি হলো /data/media/Movies। এগুলো কন্টেইনারের ভেতরের পাথ। হোস্ট পাথ /mnt/data/media/Shows প্রত্যাখ্যান করা হবে, কারণ কন্টেইনারের দৃষ্টিকোণ থেকে সেই ডিরেক্টরিটির কোনো অস্তিত্ব নেই।
Sonarr এবং Radarr উভয় ক্ষেত্রেই Settings ওপেন করুন, তারপর Download Clients-এ যান এবং qBittorrent যোগ করুন। হোস্ট হলো qbittorrent এবং পোর্ট হলো 8080। সার্ভিস নামটি হোস্টনাম হিসেবে কাজ করে কারণ Compose চারটি কন্টেইনারকেই একটি ইন্টারনাল DNS (domain name system) সার্ভিসসহ একই নেটওয়ার্কে রাখে। এখানে localhost ব্যবহার করবেন না: Sonarr কন্টেইনারের ভেতরে localhost হলো Sonarr নিজেই।
Remote Path Mappings খালি রাখুন। ডাউনলোড ক্লায়েন্ট যে পাথ রিপোর্ট করে সেটিকে arr অ্যাপ্লিকেশন দেখতে পায় এমন পাথে রূপান্তর করার জন্যই এই ফিচারটি থাকে। একটি শেয়ার করা /data মাউন্ট থাকার ফলে, উভয় কন্টেইনারই প্রতিটি পাথের ব্যাপারে একমত থাকে, আর এই লেআউটটি কার্যকর করার এটিই দ্বিতীয় কারণ।
Prowlarr-কে Sonarr এবং Radarr-এর সাথে সংযুক্ত করা
Prowlarr অন্য অ্যাপ্লিকেশনগুলোতে ইনডেক্সার ডেফিনিশন পাঠিয়ে দেয়, তাই আপনাকে প্রতিবার আলাদাভাবে ইনডেক্সার কনফিগার করতে হয় না। এর জন্য প্রতিটি অ্যাপ্লিকেশন থেকে একটি API (application programming interface) কী প্রয়োজন।
Sonarr-এ Settings ওপেন করে General-এ যান এবং API কী-টি কপি করুন। Prowlarr-এ Settings ওপেন করে Apps-এ যান, একটি Sonarr অ্যাপ্লিকেশন যোগ করুন এবং তিনটি ফিল্ড পূরণ করুন। Prowlarr Server হলো http://prowlarr:9696। Sonarr Server হলো http://sonarr:8989। API Key হলো আপনার কপি করা মানটি। Test বাটনে চাপ দিন। সবুজ রঙের ফলাফল মানে Prowlarr Compose নেটওয়ার্কের মাধ্যমে Sonarr-এর সাথে যোগাযোগ করতে পেরেছে। Radarr-এর ক্ষেত্রে http://radarr:7878 ব্যবহার করে একই প্রক্রিয়া পুনরাবৃত্তি করুন।
সংযোগ প্রত্যাখ্যান (connection refused) সংক্রান্ত লাল রঙের ফলাফল সাধারণত ভুল সার্ভিস নাম বা http:// প্রিফিক্স না থাকার কারণে হয়। কন্টেইনারের ভেতর থেকে নামটি সঠিকভাবে রেজলভ হচ্ছে কি না তা নিশ্চিত করুন:
docker compose exec prowlarr curl -sS -o /dev/null -w '%{http_code}\n' http://sonarr:8989একটি HTTP স্ট্যাটাস কোড প্রমাণ করে যে নেটওয়ার্ক পাথটি ঠিক আছে। নাম রেজল্যুশন এরর প্রমাণ করে যে সার্ভিসের নামটি ভুল।
হার্ডলিঙ্ক যে কাজ করছে তা নিশ্চিত করুন
লিঙ্ক কাউন্ট (link count) না দেখা পর্যন্ত সেটআপটিকে বিশ্বাস করবেন না। একটি আইটেম ইম্পোর্ট করার পর, ডাউনলোড করা ফাইলটির সাথে লাইব্রেরি ফাইলটির তুলনা করুন:
stat -c '%i %h %n' /mnt/data/torrents/tv/*/*.mkv
stat -c '%i %h %n' /mnt/data/media/Shows/*/*/*.mkvপ্রথম সংখ্যাটি হলো ইনোড (inode) এবং দ্বিতীয়টি হলো লিঙ্ক কাউন্ট। একটি ফাইল হার্ডলিঙ্ক করা হলে উভয় জায়গাতেই একই ইনোড দেখাবে এবং লিঙ্ক কাউন্ট হবে 2। যদি দুটি ভিন্ন ইনোড থাকে এবং প্রতিটির লিঙ্ক কাউন্ট 1 হয়, তবে এর অর্থ হলো Sonarr ফাইলটি কপি করেছে এবং ইম্পোর্ট লগে হার্ডলিঙ্ক ব্যর্থ হওয়ার কথা উল্লেখ থাকবে।
ডিস্কের দিকেও নজর রাখুন। ইম্পোর্ট হওয়ার সময় df -h /mnt/data খুব সামান্যই পরিবর্তিত হওয়া উচিত, কারণ হার্ডলিঙ্ক শুধুমাত্র একটি নাম যোগ করে, কোনো ডেটা কপি করে না।
আসলে কী কারণে সমস্যা হয়
ইমপোর্টের সময় পারমিশন এরর হওয়ার অর্থ হলো কন্টেইনারের ইউজার আইডি লাইব্রেরি ফোল্ডারে লিখতে পারছে না। এরর মেসেজটি হলো Access to the path ... is denied। ls -ln /mnt/data/media ব্যবহার করে চেক করুন যে মালিকানার আইডি আপনার PUID-এর সাথে মিলছে কি না, এবং মনে রাখবেন যে কন্টেইনার কোনো ডিরেক্টরিতে প্রবেশ করার আগে সেটিতে অবশ্যই এক্সিকিউট বিট (execute bit) থাকতে হবে।
যদি ফাইলগুলোর মালিক root হিসেবে দেখায়, তবে বুঝতে হবে হোস্ট ডিরেক্টরি তৈরি হওয়ার আগেই কন্টেইনার চালু হয়েছিল, তাই Docker সেটিকে root হিসেবে তৈরি করেছে। স্ট্যাকটি বন্ধ করুন, ডিরেক্টরিটি chown করুন এবং পুনরায় চালু করুন।
qBittorrent থেকে কোনো টরেন্ট ডিলিট করার পর যদি লাইব্রেরি ফাইলটিও হারিয়ে যায়, তবে বুঝতে হবে ইমপোর্টটি একটি কপি ছিল যা পরে মুছে ফেলা হয়েছে, অথবা আপনি টরেন্ট এন্ট্রির পরিবর্তে সরাসরি ডেটা ডিলিট করেছেন। প্রকৃত হার্ডলিঙ্ক (hardlink) ব্যবহার করলে একটি নাম মুছে ফেললেও অন্যটি অক্ষত থাকে, কারণ লিঙ্কের সংখ্যা শূন্যে পৌঁছালেই কেবল ডেটা মুছে যায়।
আপনার যোগ করা মিডিয়ার চেয়েও দ্রুত ডিস্ক পূর্ণ হয়ে যাওয়া হলো কপি সমস্যার সবচেয়ে ব্যয়বহুল রূপ। আরও স্টোরেজ কেনার আগে উপরের stat চেকটি চালিয়ে দেখুন।
এই স্ট্যাকের জন্য একটি VPS-এর যা প্রয়োজন
তিনটি arr application হালকা। এগুলো indexer-এ poll করে, একটি ছোট SQLite database-এ লেখে এবং file-এর নাম পরিবর্তন করে। 2 GB RAM-এর একটি server চারটি container-ই স্বচ্ছন্দে চালাতে পারে। মূল load অন্য জায়গা থেকে আসে। বড় torrent download করার সময় একটি download client disk input এবং output সম্পূর্ণ ব্যবহার করতে পারে। একই box-এ video transcode করা media server CPU ব্যবহার করবে। Media এমন volume-এ রাখুন যার প্রকৃত throughput ভালো। Server-এ আপনার গুরুত্বপূর্ণ অন্য কাজ চললে download client-এ bandwidth limit সেট করুন। এই অন্যান্য কাজের জন্য আলাদা করে resource budget ধরুন। Headroom আছে ধরে নেবেন না: একটি self-hosted AFFiNE workspace-এ database-সহ আরও চারটি container থাকে, এবং 2 GB-এর box-এ এটি প্রায় পুরো memory নিজেই ব্যবহার করতে চায়। সব অতিরিক্ত service-এর খরচ এত বেশি নয়। একটি self-hosted openGym workout tracker-এর মতো single-purpose service একই box-এ স্বচ্ছন্দে চলতে পারে, যদি এর জন্য আলাদা TLS দেন এবং এক বছরের training history রাখার আগে database file কোথায় আছে তা জানেন। যে কোনো service-এ web application, একটি Postgres database এবং background worker queue থাকলে সেটি resource ব্যবহারে AFFiNE-এর কাছাকাছি পড়ে। তাই import চলার মাঝপথে limit বুঝতে পারার আগে সিদ্ধান্ত নিন, একটি self-hosted Chatwoot support desk এই server-এ থাকবে, নাকি আলাদা server-এ। Bursty workload-এর ক্ষেত্রে আরও সতর্ক থাকুন। কারণ import-এর সঙ্গে সংঘর্ষ ঘটায় average নয়, peak load: প্রতিটি ব্যক্তির জন্য আলাদা sandboxed agent চালানো একটি self-hosted OneCLI বিবেচনা করলে, qBittorrent সম্পূর্ণ গতিতে চলার সময় বাস্তবে যত resource free থাকে, তার সঙ্গে প্রকাশিত sizing number মিলিয়ে দেখুন। idle box-এ free -h যা দেখায়, তার সঙ্গে নয়।
FAQ
Sonarr কেন ফাইল কপি করে, হার্ডলিঙ্ক করে না?
কারণ কন্টেইনারের দৃষ্টিকোণ থেকে উৎস (source) এবং গন্তব্য (destination) ভিন্ন ফাইলসিস্টেমে অবস্থিত। দুটি আলাদা বাইন্ড মাউন্ট, যেমন /downloads এবং /tv, দুটি ভিন্ন ফাইলসিস্টেম হিসেবে গণ্য হয়, এমনকি যদি সেগুলো একই হোস্ট ডিস্ক থেকে আসে। প্রতিটি কন্টেইনারে একটি একক প্যারেন্ট ডিরেক্টরিকে /data হিসেবে মাউন্ট করুন এবং ডাউনলোড ও লাইব্রেরি ফোল্ডারগুলোকে এর ভেতরে রাখুন, তাহলেই লিঙ্কিং সম্ভব হবে। উভয় ফাইলের ওপর stat -c '%i %h %n' চালিয়ে ফলাফল নিশ্চিত করুন: একই inode এবং 2 সংখ্যক লিঙ্ক কাউন্ট দেখতে পাবেন।
আমার কোন PUID এবং PGID ব্যবহার করা উচিত?
যে হোস্ট অ্যাকাউন্টের অধীনে মিডিয়া ফাইলগুলো রয়েছে, সেই অ্যাকাউন্টের নিউমেরিক আইডি ব্যবহার করুন। এটি আপনি id -u এবং id -g কমান্ডের মাধ্যমে পেতে পারেন। একটি নতুন Ubuntu VPS-এ সাধারণত উভয়ই 1000 হয়। স্ট্যাকের প্রতিটি কন্টেইনারে একই জোড়া ব্যবহার করতে হবে, অন্যথায় একটি অ্যাপ্লিকেশন এমন ফাইল তৈরি করবে যা অন্যটি পরিবর্তন করতে পারবে না। মানগুলো পরিবর্তন করার পর, docker compose up -d --force-recreate দিয়ে কন্টেইনারগুলো পুনরায় তৈরি করুন এবং chown -R ব্যবহার করে বিদ্যমান ফাইলগুলো ঠিক করুন।
এই ওয়েব ইন্টারফেসগুলোকে কি ইন্টারনেটে উন্মুক্ত করা প্রয়োজন?
না, এবং আপনার তা করা উচিত নয়। Compose ফাইলে প্রতিটি পাবলিশ করা পোর্টকে 127.0.0.1-এ বাইন্ড করুন। এরপর SSH টানেল, VPN অথবা এমন একটি reverse proxy-এর মাধ্যমে ইন্টারফেসে প্রবেশ করুন যা TLS (transport layer security) টার্মিনেট করে এবং নিজস্ব অথেন্টিকেশন যোগ করে। এগুলো সরাসরি পাবলিশ করা যতটা মনে হয় তার চেয়েও বেশি ঝুঁকিপূর্ণ, কারণ Docker নিজস্ব ফায়ারওয়াল রুল যুক্ত করে এবং ufw deny রুল সেই ট্রাফিক আটকাতে পারে না।
qBittorrent-এর পাসওয়ার্ড কোথায় পাব?
LinuxServer.io ইমেজটি তার স্টার্টআপ লগে admin ইউজারের জন্য একটি অস্থায়ী পাসওয়ার্ড প্রদর্শন করে। এটি পড়ার জন্য docker compose logs qbittorrent | grep -i password চালান, তারপর Options এবং Web UI-তে গিয়ে একটি স্থায়ী পাসওয়ার্ড সেট করুন। আপনি নিজে পাসওয়ার্ড সেট না করা পর্যন্ত প্রতিটি রিস্টার্টে নতুন অস্থায়ী পাসওয়ার্ড তৈরি হতে থাকবে।
Jellyfin কি একই ফোল্ডার ব্যবহার করতে পারে?
হ্যাঁ, এবং এই লেআউটের মূল উদ্দেশ্যই এটি। /mnt/data/media-কে আপনার মিডিয়া সার্ভারে /media হিসেবে মাউন্ট করুন। এর ফলে লাইব্রেরিগুলো /media/Movies এবং /media/Shows-এ থাকবে, যেখানে Sonarr এবং Radarr একই ডিরেক্টরিতে /data/media-এর মাধ্যমে ফাইল রাইট করতে পারবে। মিডিয়া সার্ভারকে একই PUID এবং PGID দিন, যাতে arr স্ট্যাক যা রাইট করে তা মিডিয়া সার্ভার পড়তে পারে।