SSD Nodes Learn RAM 8GB — $66/mwaka
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-01

Docker Compose ya Prowlarr, Sonarr, Radarr na qBittorrent

Endesha Prowlarr, Sonarr, Radarr na qBittorrent kwenye VPS kwa faili moja ya Docker Compose, ukitumia PUID, PGID na mpangilio wa ujazo unaodumisha hardlink.

Unachojenga

Stack ya Docker Compose arr ni kontena nne zinazodhibiti maktaba ya midia: Prowlarr kwa mipangilio ya waindexi, Sonarr kwa mfululizo, Radarr kwa filamu, na qBittorrent kama mteja wa upakuaji. Zinawasiliana kwenye mtandao wa Compose kwa kutumia majina ya huduma, na zinashiriki mti mmoja wa folda kwenye seva mwenyeji. Usakinishaji ni mfupi. Kinachoamua ikiwa stack itafanya kazi kwa miaka au ikusumbue kila wiki ni mpangilio wa ujazo, kwa hiyo sehemu kubwa ya mwongozo huu inahusu hilo.

Stack haikutafutii maudhui. Prowlarr huhifadhi waindexi wowote unaoongeza, na uamuzi wa kutumia waindexi gani pamoja na wajibu wa kisheria ni wako. Mwongozo huu unashughulikia miundombinu: watumiaji, njia, ruhusa, mtandao wa kontena, na ukaguzi unaothibitisha kuwa inafanya kazi.

Ikiwa hujawahi kuandika faili ya Compose, soma misingi ya Docker Compose kwa VPS kwanza. Chapisho hili linachukulia kuwa docker compose version tayari hutoa matokeo kwenye seva yako.

Sonarr inapomaliza upakuaji, huingiza faili kwenye maktaba yako. Ikiwa folda ya upakuaji na folda ya maktaba ziko kwenye mfumo uleule wa faili, uingizaji huo huwa hardlink: jina la pili linaloelekeza kwenye data ileile iliyo kwenye diski. Haitumii nafasi ya ziada wala muda wa ziada. Torrent inaendelea kupakia kutoka kwenye jina la awali huku seva yako ya midia ikisoma jina jipya.

Ikiwa folda hizo mbili ziko kwenye mifumo tofauti ya faili, kernel haiwezi kuunda kiungo hicho. Sonarr hutumia nakala badala yake. Msimu wa 40 GB sasa hutumia 80 GB za diski na dakika kadhaa za uingizaji na utoaji, na kumbukumbu ya uingizaji huonyesha kuwa hardlink imeshindwa na faili imenakiliwa badala yake. Kwenye VPS yenye kikomo maalum cha diski, hivi ndivyo watu huishiwa nafasi ndani ya wiki moja.

Hapa ndipo mtego ulipo. Ndani ya kontena, bind mount ni mpaka wa mfumo wa faili. Ukiweka /mnt/data/torrents kama /downloads na /mnt/data/media kama /tv, ingawa zote ziko kwenye diski moja ya mwenyeji, Sonarr huona mount mbili tofauti na hukataa kuunganisha kati yao. Nyaraka rasmi za image ya LinuxServer.io zinaeleza hili moja kwa moja: kutumia njia tofauti za /downloads na /tv huondoa uwezo wa kutumia hardlink.

Suluhisho ni mount moja. Kila kontena inayotumia midia inapokea volume ileile moja, /mnt/data:/data, na kila njia inayotumia huwa folda ndani yake. Mount point moja, mfumo mmoja wa faili, na hardlink zinazofanya kazi.

Unda mtumiaji, kikundi na folda

Kontena huandika faili kwa kutumia kitambulisho cha mtumiaji cha nambari, kinachowekwa na PUID na PGID. Tumia akaunti yako mwenyewe ili uweze kusoma na kuhariri faili hizo kupitia SSH bila sudo.

id -u
id -g

Kwa kawaida zote huchapisha 1000 kwenye Ubuntu VPS mpya. Sasa unda mpangilio wa folda. Uweke kwenye diski inayohifadhi media yako, na uhakikishe mpangilio wote unabaki kwenye diski hiyo moja.

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

Thibitisha kuwa ni mfumo mmoja wa faili kabla ya kuendelea:

df --output=source,target /mnt/data/torrents /mnt/data/media

Mistari yote miwili lazima ionyeshe kifaa chanzo kilekile. Vifaa viwili tofauti vinamaanisha hardlinks hazitawahi kufanya kazi, bila kujali mipangilio utakayoweka kwenye usanidi wa kontena.

Folda za maktaba zimepewa majina Movies na Shows kwa makusudi. Ikiwa tayari unaendesha Jellyfin kama seva yako ya media, weka /mnt/data/media kwenye Jellyfin kama /media, na maktaba zake zitapatikana kwenye /media/Movies na /media/Shows, sawa kabisa na jinsi mwongozo huo unavyoziweka.

Faili ya mazingira

Hifadhi thamani zinazobadilika kwa kila seva katika .env, karibu na faili ya Compose.

mkdir -p ~/arr && cd ~/arr

Andika ~/arr/.env:

PUID=1000
PGID=1000
TZ=Etc/UTC
DATA_ROOT=/mnt/data

Weka TZ iwe eneo lako mwenyewe, kwa mfano Europe/Berlin. Programu za arr hupanga kazi na kuweka mihuri ya muda kwenye mistari ya kumbukumbu katika eneo hilo, kwa hiyo thamani isiyo sahihi itafanya kumbukumbu zote zichanganye baadaye.

Faili ya Compose

Andika ~/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

Vitu vinne katika faili hiyo vinafanya kazi muhimu.

${DATA_ROOT}:/data inafanana katika kontena tatu zinazoshughulikia media. Prowlarr haiipati, kwa sababu Prowlarr haifungui kamwe faili ya media.

Kila port ya wavuti imefungwa kwenye 127.0.0.1, hivyo Docker huichapisha kwenye anwani ya loopback pekee. 8989:8989 ya kawaida ingeichapisha kwenye kila kiolesura, na kanuni za firewall za Docker zingepeleka trafiki hiyo moja kwa moja kupita kanuni ya deny ya ufw. Tabia hiyo huwastaajabisha watu mara kwa mara, na imeelezwa katika kwa nini Docker huchapisha port moja kwa moja kupitia ufw.

Port 6881 imechapishwa kwenye violesura vyote kwa makusudi. Hii ndiyo port ya kusikiliza ya torrent, na lazima ipatikane kwa miunganisho inayoingia kutoka kwa wenzao. Iruhusu kwa sudo ufw allow 6881, na soma misingi ya firewall ya ufw kwa VPS ikiwa amri hiyo ni mpya kwako.

Saraka za usanidi zimetenganishwa kwa kila programu, na volume ya media pekee ndiyo inayoshirikiwa. Ziunde kabla ya kuanza kwa mara ya kwanza ili ziwe za mtumiaji wako badala ya root:

mkdir -p ~/arr/config/prowlarr ~/arr/config/sonarr ~/arr/config/radarr ~/arr/config/qbittorrent
docker compose up -d
docker compose ps

Huduma zote nne zinapaswa kusoma running. Kufikia July 2026, image hizi zimechapishwa kwenye lscr.io, na tag ya latest inafuata toleo thabiti la sasa. Kwa hiyo, tumia tag ya toleo mahususi badala yake ikiwa unataka masasisho yawe uamuzi unaoufanya, si mshangao.

Fikia violesura vya wavuti kwa usalama

Kwa kuwa milango iko kwenye loopback, hakuna kitu kilicho wazi bado. Ipeleke milango hiyo kupitia SSH kutoka kwenye mashine yako mwenyewe:

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

Sasa http://127.0.0.1:8989 katika kivinjari chako inafikia Sonarr kwenye seva. Kwa ufikiaji wa kudumu, weka stack nyuma ya Traefik yenye vyeti vya TLS kwa programu kadhaa, au fikia seva kupitia VPN ya WireGuard unayoiendesha mwenyewe. Hakuna programu yoyote kati ya hizi inayopaswa kuwa kwenye intaneti ya umma ikiwa ukurasa wake wa kuingia pekee ndio ulinzi uliopo mbele yake.

qBittorrent hutengeneza nenosiri la msimamizi bila mpangilio wakati wa kuanza mara ya kwanza na kuliandika kwenye logi ya container. Lisome, kisha libadilishe katika kiolesura cha wavuti:

docker compose logs qbittorrent | grep -i password

Ukiruka kulibadilisha, nenosiri jipya bila mpangilio hutengenezwa kila seva inapoanzishwa upya, na utalazimika kurudi kwenye logi kila wakati.

Weka njia ndani ya kila programu

Katika qBittorrent, fungua Options, kisha Downloads, na uweke njia chaguo-msingi ya kuhifadhi kuwa /data/torrents. Weka folda ya vipakuliwa visivyokamilika ndani ya mti huo huo, kwa mfano /data/torrents/incomplete. Kipakuliwa kinachokamilika mahali popote nje ya /data hakiwezi kuunganishwa kwa hard link ndani ya maktaba.

Katika Sonarr, fungua Settings, kisha Media Management, na uongeze folda ya msingi /data/media/Shows. Katika Radarr, folda ya msingi ni /data/media/Movies. Hizi ni njia zilizo ndani ya container. Njia ya mwenyeji /mnt/data/media/Shows inakataliwa kwa sababu folda hiyo haipo kwa mtazamo wa container.

Katika Sonarr na Radarr zote mbili, fungua Settings, kisha Download Clients, na uongeze qBittorrent. Mwenyeji ni qbittorrent na port ni 8080. Jina la huduma linafanya kazi kama hostname kwa sababu Compose huweka containers zote nne kwenye mtandao mmoja wenye huduma ya ndani ya DNS (domain name system). Usitumie localhost hapa: ndani ya container ya Sonarr, localhost ni Sonarr.

Acha Remote Path Mappings wazi. Kipengele hicho hutafsiri njia ambayo download client inaripoti kuwa njia ambayo programu ya arr inaweza kuona. Kwa mount moja ya pamoja ya /data, containers zote mbili tayari zinakubaliana kuhusu kila njia. Hiyo ndiyo sababu ya pili inayofanya mpangilio huu ustahili juhudi.

Unganisha Prowlarr na Sonarr na Radarr

Prowlarr hutuma maelezo ya indexer kwenye programu nyingine, kwa hivyo unasanidi indexer mara moja badala ya mara mbili. Inahitaji ufunguo wa API (application programming interface) kutoka kwa kila programu.

Katika Sonarr, fungua Settings, kisha General, na unakili ufunguo wa API. Katika Prowlarr, fungua Settings, kisha Apps, ongeza programu ya Sonarr, na ujaze sehemu tatu. Prowlarr Server ni http://prowlarr:9696. Sonarr Server ni http://sonarr:8989. API Key ni thamani uliyonakili. Bonyeza Test. Matokeo ya kijani yanaonyesha kuwa Prowlarr imefikia Sonarr kupitia mtandao wa Compose. Rudia hatua hizo kwa Radarr katika http://radarr:7878.

Matokeo mekundu yanayosema muunganisho umekataliwa karibu kila mara husababishwa na jina la huduma lisilo sahihi au kukosekana kwa kiambishi awali cha http://. Thibitisha kuwa jina linatatuliwa kutoka ndani ya container:

docker compose exec prowlarr curl -sS -o /dev/null -w '%{http_code}\n' http://sonarr:8989

Msimbo wa hali wa HTTP unathibitisha kuwa njia ya mtandao inafanya kazi. Hitilafu ya utatuzi wa jina inathibitisha kuwa jina la huduma si sahihi.

Usiamini usanidi huo hadi utakapoona idadi ya viunganishi. Baada ya kipengee kimoja kuingizwa, linganisha faili lililopakuliwa na faili la maktaba:

stat -c '%i %h %n' /mnt/data/torrents/tv/*/*.mkv
stat -c '%i %h %n' /mnt/data/media/Shows/*/*/*.mkv

Nambari ya kwanza ni inode, na ya pili ni idadi ya viunganishi. Faili lililounganishwa kwa hardlink lina inode ileile katika maeneo yote mawili na idadi ya viunganishi ya 2. Inode mbili tofauti, kila moja ikiwa na idadi ya viunganishi ya 1, zinaonyesha kwamba Sonarr ilinakili faili. Kumbukumbu ya uingizaji itaonyesha kwamba hardlink ilishindwa.

Fuatilia diski pia. df -h /mnt/data inapaswa kubadilika kidogo sana wakati wa uingizaji, kwa sababu hardlink huongeza jina bila kuongeza data.

Kinachoharibika hasa

Hitilafu za ruhusa wakati wa kuleta faili humaanisha kuwa kitambulisho cha mtumiaji wa container hakiwezi kuandika katika folda ya maktaba. Ujumbe huo ni Access to the path ... is denied. Tumia ls -ln /mnt/data/media kuthibitisha kuwa kitambulisho cha mmiliki kinalingana na PUID yako. Kumbuka kuwa saraka zinahitaji biti ya utekelezaji kabla ya container kuweza kuziingia.

Faili zinazoonekana kuwa zinamilikiwa na root humaanisha kuwa container ilianzishwa kabla saraka ya host haikuwepo. Kwa hiyo, Docker iliunda saraka hiyo ikiwa root. Simamisha stack, chown saraka hiyo, kisha uanzishe stack tena.

Kufuta torrent kutoka qBittorrent na kugundua kuwa faili ya maktaba haipo humaanisha kuwa uletaji ulikuwa nakala ambayo ilifutwa baadaye, au ulifuta data badala ya ingizo la torrent. Kwa hardlink halisi, kuondoa jina moja huacha jingine likiwa salama, kwa sababu data huondolewa tu idadi ya viungo inapofikia sifuri.

Disk inayojazwa kwa kasi inayozidi kasi ya media uliyoongeza ni tatizo la kunakili katika hali yake yenye gharama kubwa zaidi. Tekeleza ukaguzi wa stat hapo juu kabla ya kununua storage zaidi.

Mahitaji ya stack hii kutoka kwa VPS

Programu tatu za arr hazihitaji rasilimali nyingi. Huchunguza indexers, huandika kwenye hifadhidata ndogo ya SQLite, na hubadilisha majina ya faili. Server yenye RAM ya 2 GB inaweza kuendesha containers zote nne bila matatizo. Mzigo mkubwa hutoka kwingine. Download client hutumia kikamilifu ingizo na towe la diski wakati wa torrents kubwa, na media server inayobadili usimbaji wa video kwenye mashine hiyo hiyo itatumia CPU. Hifadhi media kwenye volume yenye throughput halisi, na weka kikomo cha bandwidth kwenye download client ikiwa server inafanya kazi nyingine muhimu.

FAQ

Kwa sababu chanzo na lengwa viko kwenye filesystems tofauti kwa mtazamo wa container. Bind mounts mbili tofauti, kama vile /downloads na /tv, ni filesystems mbili hata zinapotoka kwenye diski moja ya host. Mount saraka moja ya mzazi kama /data katika kila container, kisha weka vipakuliwa na maktaba ndani yake ili link iwezekane. Thibitisha matokeo kwa stat -c '%i %h %n' kwenye faili zote mbili: inode ni ileile na idadi ya links ni 2.

Nitumie PUID na PGID zipi?

Tumia id ya nambari ya account ya host inayomiliki mti wa media; utaipata kwa id -u na id -g. Kwenye Ubuntu VPS mpya, kwa kawaida huwa 1000 kwa zote mbili. Kila container katika stack lazima itumie jozi hiyo hiyo. La sivyo, programu moja itaandika faili ambazo programu nyingine haiwezi kurekebisha. Baada ya kubadilisha thamani, tengeneza upya containers kwa docker compose up -d --force-recreate na urekebishe faili zilizopo kwa chown -R.

Je, ninahitaji kuweka interfaces hizi za wavuti wazi kwa intaneti?

Hapana, na hupaswi kufanya hivyo. Bind kila port iliyochapishwa kwa 127.0.0.1 katika faili ya Compose, kisha fikia interfaces kupitia SSH tunnel, VPN, au reverse proxy inayokamilisha TLS (usalama wa safu ya usafirishaji) na kuongeza uthibitishaji wake. Kuzichapisha moja kwa moja ni hatari zaidi kuliko inavyoonekana, kwa sababu Docker huingiza sheria zake za firewall na sheria ya deny ya ufw haitazuia traffic hiyo.

Nitapata wapi password ya qBittorrent?

Image ya LinuxServer.io huonyesha password ya muda ya mtumiaji wa admin kwenye startup log yake. Endesha docker compose logs qbittorrent | grep -i password ili kuisoma, kisha weka password ya kudumu chini ya Options na Web UI. Password mpya ya muda hutengenezwa kila restart hadi uweke password yako mwenyewe.

Je, Jellyfin inaweza kutumia folda hizo hizo?

Ndiyo, na hilo ndilo kusudi la mpangilio huu. Mount /mnt/data/media kwenye media server yako kama /media. Maktaba zake zitakuwa kwenye /media/Movies na /media/Shows, huku Sonarr na Radarr zikiandika kwenye saraka hizo hizo kupitia /data/media. Ipe media server PUID na PGID hizo hizo ili iweze kusoma kile stack ya arr inaandika.

#sonarr#radarr#prowlarr#docker-compose#self-hosting