SuiteArr – An Arr Stack with VPN support

So once again I had to redo my “arr” stack that I have named SuiteArr and this time around include a NAS and instead of Portainer we will be running Dockge for the first time to try out.

Getting Started

  • We need a clean Ubuntu Server installation in my case I am using Ubuntu 24.04.2 with Docker. Installing Docker on Ubuntu
  • Folder Structure. Need to create and organize the folders where our containers will be saving their configurations and the folder of where our media will be stored.
  • We need to mount our NAS with our existing media (Movies, TV Shows) and this will be the location where all of our new media and downloads will be getting stored.
  • We will be using Dockge instead of Portainer to be controlling our Docker Deployments. Installing Dockge on Ubuntu

Once we have all the above ready and configured we will be able to deploy our “SuiteArr” stack with Gluetun, Jellyfin, qBittorrent, Radarr, Sonarr and Prowlarr.

The way our stack will be configured Gluetun will be connecting to our VPN provider to provide us with security and anonymity on the web for downloads. The apps that will be going through our VPN are qBittorent, Radarr, Sonarr and Prowlarr.

Quick Overview of each App

Portainer

Portainer is a lightweight, web-based management UI for Docker. It lets you easily view, configure, and control your containers, images, networks, and volumes—all from a simple dashboard. With Portainer, managing the SuiteArr stack (and any other Docker services) becomes visual and beginner-friendly, no terminal required.

Gluetun

Gluetun is a privacy-focused VPN proxy container for Docker that routes your internet traffic through a secure VPN tunnel. In the SuiteArr stack, it protects apps like qBittorrent by ensuring all torrenting traffic stays encrypted and anonymous. It supports major VPN providers, DNS blocking, and built-in kill switch functionality for peace of mind.

qBittorrent

qBittorrent is a free, open-source BitTorrent client that lets SuiteArr apps like Sonarr and Radarr download TV shows, movies, and music automatically. It supports features like magnet links, RSS feeds, speed limits, and encryption, all through a clean and easy-to-use web interface. It integrates seamlessly with SuiteArr for fully automated and private downloading.

Radarr

Radarr is an automated movie management tool that works with your torrent or Usenet client to find, download, and organize movies. It monitors your library, searches for new or upgraded versions, and renames and moves files automatically — making your movie collection hands-free and hassle-free.

Sonarr

Sonarr is an automated TV show manager that helps you download, organize, and monitor your favorite series. It integrates with torrent or Usenet clients to automatically grab new episodes as soon as they’re available, rename them, and place them neatly into your media library—perfectly paired with Jellyfin or Plex.

Prowlarr

Prowlarr is the indexer manager for the Arr apps. It connects Sonarr, Radarr, Lidarr, and others to torrent and Usenet indexers, making it easy to search for media across multiple sources. With built-in support for over 500 indexers, Prowlarr centralizes and simplifies indexer configuration for your entire SuiteArr stack.

Jellyfin

Jellyfin is a free and open-source media server that lets you stream your movies, TV shows, and music to any device. It works beautifully with SuiteArr to organize and play your media, with support for rich metadata, user profiles, remote access, and no paid licenses or tracking—ever.

Prerequisites

Before proceeding, ensure you have:

  • An Ubuntu system (20.04 LTS or newer) with Docker and Docker Compose installed. Guide Here
  • Dockge installed and configured. Guide Here
  • A user with sudo privileges or the user to be able to run docker without sudo.

Folder Structure

In my specific case my media library lives on my NAS so I will be mounting my Media share on my home folder and that folder will be accessed in the future from SuiteArr apps (qBittorent, Jellyfin, Radarr, Sonarr, etc.) which will be located on my home folder:

/home/myuser/suitearr/media

myuser = your username

Mounting a NAS to our server

If not already installed, install the necessary tools:

sudo apt install cifs-utils
Bash

Also we will create a file were we will place our NAS credentials (username and password) and make them only accessible by our user.

nano ~/.smbcredentials
Bash

Then add the following:

username=your_username
password=your_password

Secure the file so only the user that created the file has access to it:

sudo chmod 600 ~/.smbcredentials
Bash

At this point we will need to create our media folder before we can proceed with mounting the NAS there.

cd ~
mkdir -p suitearr/media
Bash

Now its time to open /etc/fstab that will be automatically mounting our media share to our system

sudo nano /etc/fstab
Bash

And add the following line:

//SERVER/share /home/myuser/suitearr/media cifs uid=myuser,credentials=/home/myuser/.smbcredentials 0 0
  • Replace //SERVER/share with your server NAS address and share. For example //192.168.1.20/media.
  • Replace myuser with your username.
  • Also uid=myuser will be giving your user ownership of the files.

Then we will need to run

sudo mount -a
Bash

to mount everything without rebooting.

Now lets make sure that we can write to this folder with no issues:

cd ~/suitearr/media
touch test.txt
Bash

✅ If successful means that you have write permission on the folder.
❌ If it fails you’ll see an error like this:

touch: cannot touch 'test.txt': Permission denied
Bash

If everything works as described above at this point we should be ready to move on and create some folders if we don’t already have them in place.

mkdir -p ~/suitearr/media/downloads
mkdir -p ~/suitearr/media/movies
mkdir -p ~/suitearr/media/tvshows
Bash

Final Folder Structure

So our current folder structure should be as follows:
NAS Media Folder: ~/suitearr/media/
SuiteArr’s Docker Files: ~/suitearr/docker/
Downloads: ~/suitearr/media/downloads
Movies: ~/suitearr/media/movies
TV Shows: ~/suitearr/media/tvshows
*Like mentioned before if you chose a different location for your suitearr folder please noted now because you will need to do some changes in the configuration.
Also you can use ~ as your /home/username so remember ~= /home/username/

Deploying our SuiteArr Stack

At this point we have a working server with the following completed:
✅ Docker and Docker Compose installed.
✅ Dockge Installed
✅ Mounted NAS folder for media storage

Our Deployment Files

Now lets take a look at our docker-compose.yaml and our .env file and try to understand what everything does and what changes we will need to do on our .env file.

docker-compose.yaml

services:
  # -----------------------------
  # 🎬 RADARR
  # -----------------------------
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    network_mode: service:gluetun
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
    volumes:
      - ${DOCKER_BASE}/radarr/config:/config
      - ${MOVIES_PATH}:/movies #optional
      - ${DOWNLOADS_PATH}:/downloads #optional
    restart: unless-stopped
    depends_on:
      - gluetun
  # -----------------------------
  # 📡 SONARR
  # -----------------------------
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    network_mode: service:gluetun
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
    volumes:
      - ${DOCKER_BASE}/sonarr/config:/config
      - ${TV_PATH}:/tv #optional
      - ${DOWNLOADS_PATH}:/downloads #optional
    restart: unless-stopped
    depends_on:
      - gluetun
  # -----------------------------
  # 🧭 PROWLARR
  # -----------------------------
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    network_mode: service:gluetun
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
    volumes:
      - ${DOCKER_BASE}/prowlarr/config:/config
    restart: unless-stopped
    depends_on:
      - gluetun
  # -----------------------------
  # 🧲 QBITTORENT
  # -----------------------------
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    network_mode: service:gluetun
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
      - WEBUI_PORT=8080
      - TORRENTING_PORT=6881
    volumes:
      - ${DOCKER_BASE}/qbittorrent/config:/config
      - ${DOWNLOADS_PATH}:/downloads #optional
    restart: unless-stopped
    depends_on:
      - gluetun
  # -----------------------------
  # 📺 JELLYFIN
  # -----------------------------
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
    volumes:
      - ${DOCKER_BASE}/jellyfin/config:/config
      - ${TV_PATH}:/data/tvshows
      - ${MOVIES_PATH}:/data/movies
    ports:
      - 8096:8096
      - 8920:8920 #optional
      - 7359:7359/udp #optional
      - 1900:1900/udp #optional
    restart: unless-stopped
  watcharr:
    image: ghcr.io/sbondco/watcharr:latest
    container_name: watcharr
    ports:
      - 3080:3080
    volumes:
      # Contains all of watcharr data (database & cache)
      - ${DOCKER_BASE}/watcharr/data:/data
    restart: unless-stopped
  # -----------------------------
  # 🛡️ GLUETUN
  # -----------------------------
  gluetun:
    image: qmcgaw/gluetun
    container_name: gluetun
    ports:
      - 9696:9696 #prowlarr
      - 7878:7878 #radarr
      - 8989:8989 #sonarr
      - 8191:8191 #flaresolverr
      - 8080:8080 #qbittorrent
      - 6881:6881 #qbittorrent
      - 6881:6881/udp #qbittorrent
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      - VPN_SERVICE_PROVIDER=${VPN_SERVICE_PROVIDER}
      - VPN_TYPE=${VPN_TYPE}
      - OPENVPN_USER=${VPN_USER}
      - OPENVPN_PASSWORD=${VPN_PASSWORD}
      - SERVER_COUNTRIES=${VPN_COUNTRY}
    restart: unless-stopped
networks: {}
YAML

.env

# -----------------------------
# 🛡️  VPN Settings (Gluetun)
# -----------------------------
VPN_SERVICE_PROVIDER=protonvpn    # e.g. nordvpn, mullvad, protonvpn, etc.
VPN_TYPE=openvpn                  # openvpn or wireguard
VPN_USER=daADADsadaAdDadA
VPN_PASSWORD=DASDdahljijJDadjada
TZ=Etc/UTC                        # Set your local timezone (e.g.Europe/Berlin)
VPN_COUNTRY=Netherlands

# -----------------------------
# 🧑 User Permissions
# -----------------------------
PUID=1000                         # Your local user ID (use `id -u` on Linux)
PGID=1000                         # Your local group ID (use `id -g` on Linux)

# -----------------------------
# 📁 Media Folder Paths
# -----------------------------
MEDIA_BASE=/home/$USER/suitearr/media
DOCKER_BASE=/home/$USER/dockge/stacks
MOVIES_PATH=/home/$USER/suitearr/media/movies
TV_PATH=/home/$USER/suitearr/media/tvshows
DOWNLOADS_PATH=/home/$USER/suitearr/media/downloads
TEXT

What Needs to be changed

The above docker-compose.yaml together with the .env will be deploying a stack with Gluetun, Jellyfin, qBittorrent, Radarr, Sonarr and Prowlarr but there are some changes that you will need to do.

VPN Settings

As you can see in the .env there are some environment variables that need to be adjusted to your system needs.

You will need to change the VPN_SERVICE_PROVIDER to the VPN service you will be using. Then the obvious that needs to be changed are VPN_USER and VPN_PASSWORD to your credentials and VPN_COUNTRY to country that you want your VPN to connect.

For more info you can read the Gluetun Documentation and see what is supported for your VPN needs. https://github.com/qdm12/gluetun-wiki

User Permissions

Set the appropriate UID and GID for your user so you will not have an read/write or ownership issues with all the files. Those credentials should be matching the UID and GID that you have on your NAS mounted folder as well.

Media Folder Paths

Adjust your Folders here if you have followed the whole guide and set up everything the same way your will just need to replace $USER with your username and will be good to go. If you have chosen different location you will need to specify them here.

Accessing Dockge and Deploying SuiteArr

Now its time to access our Dockge by opening up our web browser and going to
http://IPAddress:5001

Then go ahead and hit the Compose Button


You should be seeing a screen similar to the one below now

You will need to give the stack a name. I will name mine suitearr and then copy and paste the docker-compose.yaml on the top box and then the .env on the bottom one.

One all the above are completed you should be able to hit the Save button and then Deploy.

Conclusion

With everything set up—your NAS mounted, Docker and Dockge configured, environment variables tailored to your system, and your SuiteArr stack deployed—you now have a fully automated, VPN-secure media management system running on your Ubuntu server. From downloading with qBittorrent through a secure Gluetun VPN tunnel, to organizing with Sonarr and Radarr, and streaming through Jellyfin, your media pipeline is now centralized, efficient, and private.

If you’ve followed along, you should now have a powerful and flexible home media server that can run quietly in the background—automating downloads, organizing your library, and delivering your favorite content to any device, anytime.

Stay tuned for future posts on how to use and automate each app to your needs and also how to add more apps to the current stack for your extra needs.