This guide is for someone who is looking to setup an Arr Stack for media organization and downloading. This guide requires no remote path mappings, follows Trash-Guides recommendations and every command needed is copy-pasteable. The VM’s in this guide are hosted on Proxmox 8.1.4, but you can use any Ubuntu environment (WSL-2, VirtualBox, etc.)
+Arr VM Specs:
+-
+
- 2 core host +
- 8GB RAM +
- 100GB Storage +
Downloader VM Specs:
+-
+
- 2 core host +
- 4GB RAM +
- 250GB Storage (can download up to this limit at a time, be careful when mass downloading or give plenty of space) +
Prerequisites
+-
+
- Ubuntu 22.04 +
- Any Usenet Server Subscription (preferred) +
- Any Usenet Indexer Subscription (preferred) +
- Real-Debrid Subscription (if you like torrents being fast) +
- VPN Subscription (Bare minimum needed to download torrents) +
Folder Structure Setup
+Run this command to make all folders, following TRASH-guides recommended naming scheme:
+sudo mkdir -p /data/torrents/{books,movies,music,tv} /data/usenet/{incomplete,complete/{books,movies,music,tv}} /data/media/{books,movies,music,tv}
+
Mounting NAS
+I use my NAS for storing all my content, this allows me to have 1 spot to have everything saved too, and not getting tripped up with different file systems. You do not need a NAS, and can just skip this part of guide and use the local filesystem. I use TrueNAS Scale with SMB. In order to mount SMB shares to Linux filesystem we need to install CIFS:
+sudo apt install cifs-utils -y
+
then we need to tell the system which directory to map it to, to do this:
+sudo nano /etc/fstab
+
at the end of the file, add an entry for your NAS as such:
+//<NAS IP>/<NAS Share> /data/media cifs username=<user>,password=<pass>,uid=1000,gid=1000,auto,nofail 0 0
+
be sure to replace your credentials.
+To mount your NAS, you can run:
+sudo mount -a
+
then run the following to make sure your NAS is mounted:
+ls /data/media
+
Everything in your NAS should be showing now, but we need to set permissions, to do that run:
+sudo chown -R $USER:$USER /data
+sudo chmod -R a=,a+rX,u+w,g+w /data
+
Install Docker
+Now we have to install Docker, I use this command to install Docker and Docker Engine:
+curl -fsSL https://get.docker.com | sudo sh
+
Now that docker is installed, we can add our user to the docker group so we dont have to use sudo every command:
+sudo usermod -aG docker $USER
+
Now I would make a docker directory to store all your appdata, you can use your home directory if you want, but trash-guides recommend not doing so:
+sudo mkdir -p /docker/appdata/{radarr,sonarr,bazarr,prowlarr,lidarr,sabnzbd,qbitty,rdt}
+
Then set permissions on the docker directory:
+sudo chown -R $USER:$USER /docker
+sudo chmod -R a=,a+rX,u+w,g+w /docker
+
2 VM Setup
+I have my downloaders (Sab, Qbitty, Rdt-client) on a different VM than my ARR’s, this is cause when I had everything on 1 docker host, I would have constant HTTP errors from Sab mainly, and as Sab is where I get most of my media, I decided to move to another VM, and then SMB share the download directories over to my ARR’s VM.
+You do not have to do this, you can just have 1 docker host, up to you. It is alot less work to do all in one 1 VM.
+If you do this, you need to replicate the origin setup, making all the same directories, then run:
+sudo apt update
+sudo apt install samba
+
We need to configure Samba to tell it what we are sharing:
+sudo nano /etc/samba/smb.conf
+
Add the following at the end of this file:
+[usenet]
+ path = /data/usenet
+ read only = no
+ guest ok = no
+ create mask = 0755
+
+[torrents]
+ path = /data/torrents
+ read only = no
+ guest ok = no
+ create mask = 0755
+
To create your username and password, replace your_username with your actual username:
+sudo smbpasswd -a your_username
+
Then restart samba with:
+sudo systemctl restart smbd
+
Go back to your Arr VM and add the following to your /etc/fstab:
+//<nas-ip>/usenet /data/usenet cifs username=<username>,password=<password>,uid=1000,gid=1000,auto,nofail 0 0
+//<nas-ip>/torrents /data/torrents cifs username=<username>,password=<password>,uid=1000,gid=1000,auto,nofail 0 0
+
Mount them with:
+sudo mount -a
+
Then re-run our permissions command:
+sudo chown -R $USER:$USER /data
+sudo chmod -R a=,a+rX,u+w,g+w /data
+
I would reboot this VM at this point, this will make sure it auto connects to our SMB shares at boot.
+Docker Compose Files
+Now that everything is setup, we can actually install the services:
+One VM
+This is a full docker compose file for pretty much all major Arr’s and downloaders I use. I threw Lidarr in here as well, as I run Lidarr for music, but if you dont care about music you can remove lidarr:
+version: "3.9"
+
+services:
+ sabnzbd:
+ image: lscr.io/linuxserver/sabnzbd:latest
+ container_name: sabnzbd
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Etc/UTC
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/sabnzbd:/config
+ - /data/usenet:/data/usenet:rw
+ ports:
+ - 8080:8080
+ restart: unless-stopped
+
+ arch-qbittorrentvpn:
+ image: binhex/arch-qbittorrentvpn:latest
+ container_name: qbittorrentvpn
+ volumes:
+ - '/docker/appdata/qbitty:/config'
+ - '/data/torrents/:/data/torrents'
+ - '/etc/localtime:/etc/localtime:ro'
+ ports:
+ - '49550:49550'
+ - '49551:8118'
+ environment:
+ - VPN_ENABLED=yes
+ - VPN_PROV=protonvpn
+ - VPN_CLIENT=wireguard
+ - VPN_USER=username+pmp
+ - VPN_PASS=
+ - STRICT_PORT_FORWARD=yes
+ - LAN_NETWORK=10.0.0.0/24
+ - ENABLE_PRIVOXY=yes
+ - PUID=1000
+ - PGID=1000
+ - WEBUI_PORT=49550
+ - UMASK=1000
+ - DEBUG=false
+ cap_add:
+ - NET_ADMIN
+ sysctls:
+ - net.ipv4.conf.all.src_valid_mark=1
+ privileged: true
+ network_mode: bridge
+ restart: unless-stopped
+
+ rdtclient:
+ container_name: rdtclient
+ volumes:
+ - '/data/torrents:/data/torrents'
+ - '/docker/appdata/rdt:/data/db'
+ image: rogerfar/rdtclient
+ restart: always
+ logging:
+ driver: json-file
+ options:
+ max-size: 10m
+ ports:
+ - '6500:6500'
+
+ bazarr:
+ image: lscr.io/linuxserver/bazarr:latest
+ ports:
+ - "6767:6767"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/bazarr:/config
+ - /data/media:/data/media
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ lidarr:
+ image: lscr.io/linuxserver/lidarr:latest
+ ports:
+ - "8686:8686"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/lidarr:/config
+ - /data:/data
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ prowlarr:
+ image: lscr.io/linuxserver/prowlarr:latest
+ ports:
+ - "9696:9696"
+ volumes:
+ - /docker/appdata/prowlarr:/config
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ radarr:
+ image: lscr.io/linuxserver/radarr:latest
+ ports:
+ - "7878:7878"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/radarr:/config
+ - /data:/data
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ sonarr:
+ image: lscr.io/linuxserver/sonarr:latest
+ ports:
+ - "8989:8989"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/sonarr:/config
+ - /data:/data
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+networks:
+ default:
+ name: arrs_default
+
2 VM
+Arrs:
+version: "3.7"
+services:
+ bazarr:
+ image: lscr.io/linuxserver/bazarr:latest
+ ports:
+ - "6767:6767"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/bazarr:/config
+ - /data/media:/data/media
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ lidarr:
+ image: lscr.io/linuxserver/lidarr:latest
+ ports:
+ - "8686:8686"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/lidarr:/config
+ - /data:/data
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ prowlarr:
+ image: lscr.io/linuxserver/prowlarr:latest
+ ports:
+ - "9696:9696"
+ volumes:
+ - /docker/appdata/prowlarr:/config
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ radarr:
+ image: lscr.io/linuxserver/radarr:latest
+ ports:
+ - "7878:7878"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/radarr:/config
+ - /data:/data
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+ sonarr:
+ image: lscr.io/linuxserver/sonarr:latest
+ ports:
+ - "8989:8989"
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/sonarr:/config
+ - /data:/data
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+
+networks:
+ default:
+ name: arrs_default
+
Downloaders: +As stated previously, Sab downloads most of my content (95%), you do not need all 3 of these, you can just copy the Sab part and just use Usenet with Sab. But I like to have a variety.
+version: '3.9'
+services:
+ sabnzbd:
+ image: lscr.io/linuxserver/sabnzbd:latest
+ container_name: sabnzbd
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Etc/UTC
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - /docker/appdata/sabnzbd:/config
+ - /data/usenet:/data/usenet:rw
+ ports:
+ - 8080:8080
+ restart: unless-stopped
+
+ arch-qbittorrentvpn:
+ image: binhex/arch-qbittorrentvpn:latest
+ container_name: qbittorrentvpn
+ volumes:
+ - '/docker/appdata/qbitty:/config'
+ - '/data/torrents/:/data/torrents'
+ - '/etc/localtime:/etc/localtime:ro'
+ ports:
+ - '49550:49550'
+ - '49551:8118'
+ environment:
+ - VPN_ENABLED=yes
+ - VPN_PROV=protonvpn
+ - VPN_CLIENT=wireguard
+ - VPN_USER=username+pmp
+ - VPN_PASS=
+ - STRICT_PORT_FORWARD=yes
+ - LAN_NETWORK=10.0.0.0/24
+ - ENABLE_PRIVOXY=yes
+ - PUID=1000
+ - PGID=1000
+ - WEBUI_PORT=49550
+ - UMASK=1000
+ - DEBUG=false
+ cap_add:
+ - NET_ADMIN
+ sysctls:
+ - net.ipv4.conf.all.src_valid_mark=1
+ privileged: true
+ network_mode: bridge
+ restart: unless-stopped
+
+ rdtclient:
+ container_name: rdtclient
+ volumes:
+ - '/data/torrents:/data/torrents'
+ - '/docker/appdata/rdt:/data/db'
+ image: rogerfar/rdtclient
+ restart: always
+ logging:
+ driver: json-file
+ options:
+ max-size: 10m
+ ports:
+ - '6500:6500'
+
Running Docker Compose Files
+In order to run these files, it depends on which option you chose, if 1 VM setup, just copy the compose file and create a new docker-compose.yml file with:
+nano docker-compose.yml
+
Paste in the content, CTRL + X to exit nano, Y to save, ENTER to keep filename. Then run:
+docker compose up -d
+
If you are using 2 VM’s, you need to do this 2x. One for each docker-compose file.
+Conclusion
+Congratulations on setting up your media library backend! We now have to go and configure all these services to work together, which I have another full blog post on which you can find here.
+ + +