Docker Compose के साथ Arr Stack कैसे सेटअप करें
Prowlarr, Sonarr, Radarr और qBittorrent को एक Docker Compose फ़ाइल में सेटअप करें। सही PUID, PGID और वॉल्यूम लेआउट का उपयोग करके हार्डलिंक समस्याओं को हल करने का तरीका जानें।
आप क्या बना रहे हैं
Docker Compose arr stack चार containers का एक समूह है जो एक media library को manage करता है: indexer settings के लिए Prowlarr, series के लिए Sonarr, films के लिए Radarr, और download client के रूप में qBittorrent। ये Compose network पर service name के माध्यम से एक-दूसरे से बात करते हैं, और host पर एक ही folder tree साझा करते हैं। इसका install छोटा है। वह हिस्सा जो यह तय करता है कि stack वर्षों तक काम करेगा या हर हफ्ते आपको परेशान करेगा, वह volume layout है, इसलिए इस guide का अधिकांश भाग इसी के बारे में है।
यह stack आपके लिए content नहीं ढूँढता है। Prowlarr में आप जो भी indexers जोड़ते हैं, वह उन्हें रखता है, और आप किन indexers का उपयोग करते हैं, यह आपका निर्णय और आपकी कानूनी जिम्मेदारी है। यह guide plumbing को कवर करती है: users, paths, permissions, container networking, और वे जाँच जो यह साबित करती हैं कि यह काम कर रहा है।
यदि आपने कभी Compose file नहीं लिखी है, तो पहले the Docker Compose basics for a VPS पढ़ें। यह post मानती है कि docker compose version आपके सर्वर पर पहले से ही कुछ print करता है। Docker Engine 28.0.0 या उससे नए version का उपयोग करें: पुराने releases में एक ही local network segment पर मौजूद hosts, localhost पर publish किए गए ports तक पहुँच सकते हैं।
Hardlinks क्यों विफल होते हैं, और यह पूरी प्रक्रिया के लिए क्यों महत्वपूर्ण है
जब Sonarr डाउनलोड पूरा करता है, तो वह फाइल को आपकी लाइब्रेरी में import करता है। यदि डाउनलोड फोल्डर और लाइब्रेरी फोल्डर एक ही filesystem पर स्थित हैं और hardlinking सक्षम है, तो Sonarr एक hardlink बनाने का प्रयास करता है: डिस्क पर मौजूद उसी डेटा को इंगित करने वाला एक दूसरा नाम। इसमें कोई अतिरिक्त स्थान या समय नहीं लगता है। torrent पुराने नाम से seeding जारी रखता है जबकि आपका media server नए नाम से उसे पढ़ता है।
यदि दोनों फोल्डर अलग-अलग filesystems पर हैं, तो kernel वह लिंक नहीं बना सकता। Sonarr वापस copy करने की प्रक्रिया पर आ जाता है। एक 40 GB का सीजन अब डिस्क पर 80 GB स्थान लेता है और इसमें कई मिनट का input और output समय लगता है। Sonarr cross-filesystem hardlink विफलताओं को Trace स्तर पर और अन्य hardlink अपवादों को Debug स्तर पर log करता है, इसलिए सामान्य logs में विफलता का संदेश मिलना सुनिश्चित नहीं होता। एक निश्चित डिस्क क्षमता वाले VPS पर, इसी कारण से लोगों का स्टोरेज एक सप्ताह में ही समाप्त हो जाता है।
यहाँ मुख्य समस्या है। एक container के भीतर, bind mount एक filesystem सीमा होती है। यदि आप /mnt/data/torrents को /downloads के रूप में और /mnt/data/media को /tv के रूप में mount करते हैं, तो भले ही दोनों एक ही host डिस्क पर हों, Sonarr उन्हें दो अलग-अलग mounts के रूप में देखता है और उनके बीच hardlink नहीं बना सकता। आधिकारिक LinuxServer.io image documentation में यह स्पष्ट रूप से कहा गया है: अलग-अलग /downloads और /tv paths का उपयोग करने से hardlink करने की क्षमता समाप्त हो जाती है।
इसका समाधान एक ही mount है। मीडिया का उपयोग करने वाले प्रत्येक container को एक ही volume, /mnt/data:/data दिया जाना चाहिए, और उनके द्वारा उपयोग किया जाने वाला प्रत्येक path उसी के भीतर एक फोल्डर होना चाहिए। एक mount point, एक filesystem, और सही तरीके से काम करते हुए hardlinks।
उपयोगकर्ता, समूह और फ़ोल्डर बनाएँ
Containers फ़ाइलें एक numeric user id के रूप में लिखते हैं, जिसे PUID और PGID सेट करते हैं। अपने account का उपयोग करें, ताकि आप sudo के बिना SSH के माध्यम से इन फ़ाइलों को पढ़ और संपादित कर सकें।
id -u
id -gFresh Ubuntu VPS पर दोनों आम तौर पर 1000 प्रिंट करते हैं। अब directory tree बनाएँ। इसे उस disk पर रखें जिस पर आपका media है और पूरा tree उसी disk पर रखें।
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आगे बढ़ने से पहले जाँच लें कि यह वास्तव में एक ही filesystem है:
df --output=source,target /mnt/data/torrents /mnt/data/mediaदोनों lines में वही source device दिखना चाहिए। दो अलग devices होने पर hardlinks कभी काम नहीं करेंगे, चाहे आप container config में कुछ भी सेट करें।
Library folders के नाम जानबूझकर Movies और Shows रखे गए हैं। यदि आप पहले से Jellyfin को अपने media server के रूप में चला रहे हैं, तो /mnt/data/media को Jellyfin में /media के रूप में mount करें। इसकी libraries /media/Movies और /media/Shows पर बनेंगी, ठीक उसी स्थान पर जहाँ वह guide उन्हें रखती है।
पर्यावरण फ़ाइल
प्रत्येक सर्वर के अनुसार बदलने वाले मान .env में रखें, Compose फ़ाइल के पास।
mkdir -p ~/arr && cd ~/arr~/arr/.env लिखें:
PUID=1000
PGID=1000
TZ=Etc/UTC
DATA_ROOT=/mnt/dataTZ को अपने zone पर सेट करें, जैसे Europe/Berlin। arr applications इसी zone के अनुसार tasks schedule करती हैं और log lines में timestamp जोड़ती हैं। इसलिए गलत मान होने पर बाद में हर log समझना कठिन हो जाएगा।
Compose file
~/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 को जानबूझकर सभी इंटरफेस पर प्रकाशित किया गया है। यह टोरेंट लिसनिंग पोर्ट है, और आने वाले पीयर कनेक्शन के लिए इसका पहुंच योग्य होना आवश्यक है। यहाँ भी वही Docker व्यवहार लागू होता है, इसलिए आपको इसके लिए ufw नियम की आवश्यकता नहीं है, और एक नियम जोड़ने से कुछ नहीं बदलेगा। Docker का डॉक्यूमेंटेशन, जिसे 8 नवंबर, 2026 को चेक किया गया, कहता है कि प्रकाशित पोर्ट पर आने वाला ट्रैफिक ufw द्वारा उपयोग की जाने वाली चेन तक पहुँचने से पहले ही रूट हो जाता है, इसलिए sudo ufw allow 6881 का इस पोर्ट पर कोई प्रभाव नहीं पड़ता है। कंटेनर शुरू होते ही Docker इसे सभी होस्ट इंटरफेस पर प्रकाशित कर देता है, और एक ufw deny भी इसे बंद नहीं करेगा। यदि आपको कभी यह सीमित करने की आवश्यकता हो कि इससे कौन जुड़ सकता है, तो Docker का डॉक्यूमेंटेशन डिफ़ॉल्ट iptables बैकएंड के साथ इसकी DOCKER-USER चेन में नियम जोड़ने का सुझाव देता है; इसके बजाय इसके nftables बैकएंड के लिए एक अलग nftables टेबल में नियमों की आवश्यकता होती है। ufw को उन सेवाओं के लिए रखें जो Docker में नहीं चलती हैं, जैसे कि SSH, और यदि यह टूल आपके लिए नया है तो 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 पढ़ना चाहिए। 8 नवंबर, 2026 तक ये इमेजेस lscr.io पर प्रकाशित हैं और latest टैग वर्तमान स्टेबल रिलीज़ का अनुसरण करता है, इसलिए यदि आप चाहते हैं कि अपग्रेड एक निर्णय हो न कि कोई आश्चर्य, तो इसके बजाय एक वर्जन टैग पिन करें।
वेब इंटरफेस तक सुरक्षित रूप से पहुँचें
वेब इंटरफेस loopback पर bind होते हैं। उन्हें अपनी मशीन से SSH के माध्यम से forward करें:
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 तक पहुँच जाता है। स्थायी पहुँच के लिए, इस stack को Traefik with TLS certificates for several apps के पीछे रखें, या a WireGuard VPN you host yourself के माध्यम से सर्वर तक पहुँचें। हालाँकि, एक VPN अपने आप इन ports तक नहीं पहुँचता है। Docker का documentation, जिसे 8 नवंबर, 2026 को जाँचा गया था, कहता है कि Docker Engine 28.0.0 या उससे नए संस्करण और डिफ़ॉल्ट bridge configuration के साथ, केवल Docker host ही localhost पते पर प्रकाशित port तक पहुँच सकता है। VPN का उपयोग करने के लिए, या तो इसके माध्यम से SSH tunnel चलाना जारी रखें, या Compose file में bindings को 127.0.0.1 से बदलकर VPN इंटरफेस पर सर्वर का अपना पता कर दें। इनमें से किसी भी application को केवल उनके अपने login page के साथ सार्वजनिक इंटरनेट पर नहीं होना चाहिए। यदि आप reverse proxy का विकल्प चुनते हैं और चार अलग-अलग application logins को याद रखने के बजाय सभी चार इंटरफेस के लिए एक ही account रखना चाहते हैं, तो Authentik gives you self-hosted single sign-on का उपयोग करें जिसे Traefik हर request पर forward auth के साथ लागू कर सकता है। Sonarr और Radarr की proxy के पीछे अपनी दो चुनौतियाँ हैं, इसलिए उन्हें Traefik के माध्यम से route करने से पहले, how to run Sonarr and Radarr behind a reverse proxy पढ़ें ताकि आप उन Allowed Hosts entries को समझ सकें जो Invalid Hostname errors को रोकती हैं और यह जान सकें कि /api को login क्यों छोड़ना (skip) चाहिए।
qBittorrent पहली बार start होने पर एक random administrator password बनाता है और उसे container log में print करता है। उसे पढ़ें, फिर web interface में उसे बदलें:
docker compose logs qbittorrent | grep -i passwordयदि आप इसे बदलना छोड़ देते हैं, तो हर restart पर एक नया random password बन जाएगा, और आपको हर बार logs में वापस जाना पड़ेगा।
प्रत्येक application के भीतर paths सेट करें
qBittorrent में, Options खोलें, फिर Downloads पर जाएं, और default save path को /data/torrents पर सेट करें। incomplete-downloads फोल्डर को उसी tree के भीतर रखें, जैसे कि /data/torrents/incomplete। यदि कोई download /data के बाहर कहीं भी पूरा होता है, तो उसे इस Compose file के साथ library में hardlink नहीं किया जा सकता है।
Sonarr में, Settings खोलें, फिर Media Management पर जाएं, और root folder /data/media/Shows जोड़ें। Radarr में root folder /data/media/Movies है। ये container के भीतर के paths हैं। Host path /mnt/data/media/Shows को अस्वीकार कर दिया जाएगा, क्योंकि container के दृष्टिकोण से वह directory मौजूद नहीं है।
Sonarr और Radarr दोनों में, Settings खोलें, फिर Download Clients पर जाएं, और qBittorrent जोड़ें। Host qbittorrent है और port 8080 है। Service का नाम hostname के रूप में काम करता है क्योंकि Compose सभी चार containers को एक internal DNS (domain name system) service वाले network पर रखता है। यहाँ localhost का उपयोग न करें: Sonarr container के भीतर, localhost स्वयं Sonarr है।
Remote Path Mappings को खाली छोड़ दें। यह feature download client द्वारा रिपोर्ट किए गए path को उस path में बदलने के लिए मौजूद है जिसे arr application देख सके। एक shared /data mount के साथ, दोनों containers पहले से ही हर path पर सहमत हैं, जो कि दूसरा कारण है कि यह layout इतनी मेहनत के लायक है।
Prowlarr को Sonarr और Radarr से कनेक्ट करना
Prowlarr इंडेक्सर डेफिनिशन को अन्य एप्लीकेशन्स में पुश करता है, इसलिए आपको एक इंडेक्सर को दो बार के बजाय केवल एक बार कॉन्फ़िगर करना पड़ता है। इसके लिए प्रत्येक एप्लिकेशन से एक API (application programming interface) key की आवश्यकता होती है।
Sonarr में, Settings खोलें, फिर General पर जाएं और API key को कॉपी करें। Prowlarr में, Settings खोलें, फिर Apps पर जाएं, एक Sonarr एप्लिकेशन जोड़ें और तीन फ़ील्ड भरें। Prowlarr Server http://prowlarr:9696 है। Sonarr Server http://sonarr:8989 है। API Key वह मान है जिसे आपने कॉपी किया था। Test दबाएं। एक हरे रंग का परिणाम यह दर्शाता है कि Prowlarr ने Compose नेटवर्क के माध्यम से Sonarr तक पहुँच प्राप्त कर ली है। Radarr के साथ http://radarr:7878 पर यही प्रक्रिया दोहराएं।
एक लाल परिणाम जिसका अर्थ है कि कनेक्शन अस्वीकार कर दिया गया, यह दर्शाता है कि कनेक्शन कॉन्फ़िगर किए गए पते और पोर्ट पर किसी लिसनिंग सर्विस तक नहीं पहुँचा। पुष्टि करें कि नाम कंटेनर के अंदर से रिज़ॉल्व हो रहा है:
docker compose exec prowlarr curl -sS -o /dev/null -w '%{http_code}\n' http://sonarr:8989एक HTTP स्टेटस कोड यह साबित करता है कि नेटवर्क पाथ सही है। नाम रिज़ॉल्यूशन त्रुटि का अर्थ है कि सर्विस का नाम रिज़ॉल्व नहीं हुआ; इसकी स्पेलिंग की जाँच करें और सुनिश्चित करें कि दोनों कंटेनर एक ही Compose नेटवर्क पर चल रहे हैं।
यह सिद्ध करें कि hardlinks वास्तव में बन रहे हैं
जब तक आप link count न देख लें, तब तक सेटअप पर भरोसा न करें। एक आइटम import होने के बाद, download की गई फ़ाइल की तुलना library फ़ाइल से करें:
stat -c '%i %h %n' /mnt/data/torrents/tv/*/*.mkv
stat -c '%i %h %n' /mnt/data/media/Shows/*/*/*.mkvपहली संख्या inode है और दूसरी link count है। एक ही filesystem पर, दो फ़ाइलें जो एक-दूसरे की hardlinks हैं, वे समान inode और कम से कम 2 की link count दर्शाती हैं; अतिरिक्त hardlinks इस संख्या को बढ़ा देते हैं। अलग-अलग inode का मतलब है कि फ़ाइलें एक-दूसरे की hardlinks नहीं हैं, लेकिन यह साबित नहीं होता कि hardlink का प्रयास विफल रहा। जब Sonarr में hardlink सेटिंग disable होती है, तो वह hardlink का प्रयास किए बिना फ़ाइल को copy कर देता है। Cross-filesystem hardlink की विफलताएं Trace स्तर पर और अन्य hardlink अपवाद Debug स्तर पर log किए जाते हैं, इसलिए सामान्य import logs में स्पष्टीकरण की गारंटी नहीं होती।
Disk पर भी नज़र रखें। Import होने पर df -h /mnt/data में बहुत कम बदलाव होना चाहिए, क्योंकि hardlink केवल एक नाम जोड़ता है, डेटा नहीं।
वास्तव में क्या खराब होता है
Import के दौरान permission errors का मतलब है कि container का user id library folder में write नहीं कर सकता। संदेश Access to the path ... is denied है। ls -ln /mnt/data/media के साथ जाँचें कि owner id आपके PUID से मेल खाता है या नहीं, और याद रखें कि container के प्रवेश करने से पहले directories में execute bit होना आवश्यक है।
Root-owned directories तब बन सकती हैं जब host directory के अस्तित्व में आने से पहले container start कर दिया जाए, क्योंकि Docker अनुपस्थित bind-mount directories को स्वयं बना देता है। Stack को stop करें, directory को chown करें, और इसे फिर से start करें।
qBittorrent से torrent delete करने पर यदि library file गायब हो जाती है, तो यह जाँचने की आवश्यकता है कि कौन से paths delete किए गए थे; केवल download को delete करने से library की अलग copy या hardlink नहीं हटता। एक वास्तविक hardlink के साथ, एक नाम हटाने पर दूसरा सुरक्षित रहता है, क्योंकि data तभी मुक्त होता है जब link count शून्य हो जाए।
आपके द्वारा जोड़ी गई media से अधिक तेजी से disk का भरना, copy की समस्या का सबसे महंगा रूप है। अधिक storage खरीदने से पहले ऊपर दी गई stat जाँच चलाएँ।
इस स्टैक के लिए VPS की आवश्यकताएं
तीनों arr एप्लिकेशन हल्के हैं। ये इंडेक्सर्स को पोल करते हैं, एक छोटी SQLite डेटाबेस में लिखते हैं और फाइलों का नाम बदलते हैं। लोड कहीं और से आता है। एक डाउनलोड क्लाइंट बड़ी टोरेंट फाइलों पर डिस्क इनपुट और आउटपुट को पूरी तरह उपयोग कर लेता है, और उसी बॉक्स पर वीडियो ट्रांसकोडिंग करने वाला मीडिया सर्वर CPU का उपयोग करेगा। मीडिया को पर्याप्त थ्रूपुट वाले वॉल्यूम पर रखें, और यदि सर्वर पर कोई अन्य महत्वपूर्ण कार्य चल रहा है, तो डाउनलोड क्लाइंट पर बैंडविड्थ सीमा निर्धारित करें। इन अन्य कार्यों के लिए अलग से बजट रखें, यह मानकर न चलें कि अतिरिक्त क्षमता उपलब्ध है: एक self-hosted AFFiNE workspace अपने पीछे एक डेटाबेस के साथ चार और कंटेनर जोड़ता है, और AFFiNE बुनियादी उपयोग के लिए 2 GB RAM और 10,000 शब्दों से अधिक के दस्तावेजों के लिए 4 GB RAM की सिफारिश करता है। एक self-hosted openGym workout tracker जैसे एकल-उद्देश्य वाले एप्लिकेशन के लिए, इसे अपना स्वयं का TLS दें और एक साल के ट्रेनिंग इतिहास को सुरक्षित रखने से पहले यह सुनिश्चित करें कि इसका डेटा फोल्डर कहाँ स्थित है। कोई भी चीज़ जो वेब एप्लिकेशन, Postgres डेटाबेस और बैकग्राउंड वर्कर कतार को चलाती है, वह उस रेंज में AFFiNE के करीब होती है, इसलिए यह तय करें कि एक self-hosted Chatwoot support desk को इसी सर्वर पर रखना है या अलग, इससे पहले कि आप इम्पोर्ट के दौरान सीमा तक पहुँचें। बर्स्टी वर्कलोड (अचानक बढ़ने वाले कार्यभार) के लिए और भी अधिक सावधानी बरतें, क्योंकि उनका पीक लोड ही इम्पोर्ट के साथ टकराता है, न कि उनका औसत लोड: यदि आप एक self-hosted OneCLI जो प्रत्येक व्यक्ति को अपना सैंडबॉक्स एजेंट देता है पर विचार कर रहे हैं, तो इसके प्रकाशित साइजिंग नंबरों की तुलना उस क्षमता से करें जो qBittorrent के पूरी गति से चलने के दौरान वास्तव में खाली है, न कि उस क्षमता से जो free -h एक आइडल बॉक्स पर दिखाता है।
FAQ
Sonarr फाइलें कॉपी क्यों करता है, hardlink क्यों नहीं?
ऐसा इसलिए होता है क्योंकि hardlinking अक्षम है, या hardlink बनाने का प्रयास विफल हो जाता है। इसमें वह स्थिति भी शामिल है जब कंटेनर के दृष्टिकोण से source और destination अलग-अलग filesystem पर हों। दो अलग-अलग bind mounts, जैसे कि /downloads और /tv, अलग-अलग mount points होते हैं, भले ही वे दोनों एक ही host disk से आ रहे हों, और hardlinks इनके बीच काम नहीं कर सकते। प्रत्येक कंटेनर में एक ही parent directory को /data के रूप में mount करें, downloads और library को उसके अंदर रखें, और फिर link बनाना संभव हो जाएगा। दोनों फाइलों पर stat -c '%i %h %n' चलाकर परिणाम की पुष्टि करें: एक ही filesystem पर, उन्हें एक ही inode और कम से कम 2 का link count दिखाना चाहिए।
मुझे कौन सा PUID और PGID इस्तेमाल करना चाहिए?
उस host account की numeric id का उपयोग करें जिसके पास media tree का स्वामित्व है, जिसे आप id -u और id -g से प्राप्त कर सकते हैं। एक नए Ubuntu VPS पर आमतौर पर दोनों के लिए 1000 का उपयोग होता है। stack के प्रत्येक कंटेनर को एक ही pair का उपयोग करना चाहिए, अन्यथा एक application ऐसी फाइलें लिख देगा जिन्हें दूसरा modify नहीं कर पाएगा। मान बदलने के बाद, docker compose up -d --force-recreate के साथ कंटेनरों को recreate करें और chown -R के साथ मौजूदा फाइलों को ठीक करें।
क्या मुझे इन web interfaces को इंटरनेट पर expose करने की आवश्यकता है?
नहीं, और आपको ऐसा नहीं करना चाहिए। Compose file में प्रत्येक published port को 127.0.0.1 पर bind करें, फिर interfaces तक पहुँचने के लिए SSH tunnel का उपयोग करें या सर्वर पर एक reverse proxy का उपयोग करें जो TLS (transport layer security) को terminate करता है और अपना authentication जोड़ता है। Docker Engine 28.0.0 या उससे नए वर्ज़न और डिफ़ॉल्ट bridge configuration के साथ, केवल VPN का उपयोग करके 127.0.0.1 पर publish किए गए port तक नहीं पहुँचा जा सकता, क्योंकि Docker उस published port को केवल host से ही पहुँच योग्य बनाता है। Docker के पुराने वर्ज़न एक ही local network segment पर मौजूद hosts को localhost पर publish किए गए ports तक पहुँचने देते हैं। यदि आप VPN के माध्यम से सीधा access चाहते हैं, तो ports को सर्वर के VPN address पर publish करें। उन्हें सीधे public interface पर publish करना दिखने से कहीं अधिक खतरनाक है, क्योंकि Docker अपने स्वयं के firewall rules डाल देता है और एक ufw deny rule उस traffic को नहीं रोक पाएगा।
मुझे qBittorrent का password कहाँ मिलेगा?
LinuxServer.io image अपने startup log में admin user के लिए एक अस्थायी password print करती है। इसे पढ़ने के लिए docker compose logs qbittorrent | grep -i password चलाएँ, फिर Options और Web UI के अंतर्गत एक स्थायी password सेट करें। जब तक आप अपना स्वयं का password सेट नहीं करते, तब तक हर restart पर एक नया अस्थायी password generate होता रहेगा।
क्या Jellyfin उन्हीं folders का उपयोग कर सकता है?
हाँ, और यही इस layout का मुख्य उद्देश्य है। /mnt/data/media को अपने media server में /media के रूप में mount करें, और इसकी libraries /media/Movies और /media/Shows पर स्थित होंगी, जबकि Sonarr और Radarr उन्हीं directories में /data/media के माध्यम से लिखेंगे। media server को वही PUID और PGID दें ताकि वह उसे पढ़ सके जो arr stack लिखता है।