A few months ago my dad gave me a spare computer and after a bit of research I set out on creating a home media server. A couple of weeks later I realized this wasn't just a project, it was a full-blown hobby.

After a ton of trial and error and a couple of hard drive wipes later, I've finally achieved a setup that I am truly happy with.

A global team of 50+ experts have compiled this list of 7 Best Docker Tutorial, Certification, Training and Course available online for 2021.These resources will help you Learn Docker from scratch, and are suitable for beginners, intermediate learners as well as experts. Docker image to run the utorrent server in a containerized environment. The docker image currently supports: running utorrent under its own user (not root); changing of the UID and GID for the utorrent user; Run Run via Docker CLI client. To run the utorrent container you can execute.

My goal here is to document as much of it as possible, and be as available as I can in the comments here so I can help out anyone else starting their home server adventure!

By the end of this guide, you will have a server that lets you access your media wherever you want, automatically grabs movies and tv shows when they are requested via a web UI and is optimized for seeding.


While all of the services we install will be running in Docker, this setup expects you are using Ubuntu 18.04. You can follow along, but when I start talking about mounting hard drives and writing bash scripts you may have to figure stuff out on your own!

Table of Contents

I. The Stack

II. Tips for managing your hard drives

III. Installing mhddfs (patched)

IV. Mounting Multiple Drives as One

V. Installing Docker

VI. Plex Config

VII. Transmission Config

VIII. Jackett Config

IX. Sonarr & Radarr Config

X. Ombi Config

Here's the stack we'll be using. There will be a section describing the installation and configuration for each one of these :)

Docker lets us run and isolate each of our services into a container. Everything for each of these services will live in the container except the configuration files which will live on our host.

Utorrent Docker

Plex is a 'client-server media player system'. There are a few alternatives, but I chose Plex here because they have a client available on nearly every platform.

Transmission is a torrent client. I used to use Deluge but honestly found it pretty buggy and unreliable. Transmission also lets you easily run bash scripts whenever a torrent finishes which is huge.

Jackett is a tool that Sonarr and Radarr use to search indexers and trackers for torrents

Sonarr is a tool for automating and managing your TV library. It automates the process of searching for torrents, downloading them then 'moving' them to your library. It also checks RSS feeds to automatically download new shows as soon as they're uploaded! Radarr Is a fork of Sonarr that does all the same stuff but for Movies

Ombi is a super simple web UI for sending requests to Radarr and Sonarr

Tips for managing your hard drives

Here are some tips for how to manage your hard drives and data.

Optimizing for Ratios

I use private trackers to get my torrents, and this means I need to maintain a ratio. If you aren't familiar with this term, it basically means you should be uploading as much, if not more than you download.

The best way I've found to do this is to mount your drives directly to the machine that handles your downloads. This means you can configure Sonarr and Radarr to create hardlinks when a torrent finishes. With this enabled, a reference to the data will exist in your media directory and in your torrent directory so Transmission can continue seeding everything you download.


Can also be written as Space vs. Reliability and Speed. I'm a freaking hoarder when it comes to media now, so I go with HDDs. This means I need to worry about my drives randomly dying.

If you roll with SSDs, I envy you and you should skip this next section!

HDD Backups vs. Redundancy

HDDs are very prone to randomly dying and you need to prepare for this. You can either set up an array of drives and use something like RAID, but you usually end up losing some space and it's not very easy to expand. I'm building my library from scratch so I want to be able to expand the space on my server as I download more media.

So instead, I mount all of my drives and then use mhddfs to treat them as one file system, and what's really cool is that it automatically fills up your drives in order.

update: I still haven't found a good way to keep backups of this data and am actually working on a way around this now.

Edit: I've gotten a lot of feedback on Reddit and it sounds like using either LVM or Mergerfs + Snapraid might be a better setup. If you are interested, check this post out by Linuxserver.io! I'll be doing that soon too :)

mhddfs contains a bug where you can occasionally run into a segfault error when mounting your drives. You'll want to install it via the patch in this repo, but it's a bit tricky.

The docker installation method is outdated and doesn't run so you'll have to install fakeroot and run the command from the Readme.

It'll give you trouble about signing, ignore it and install the .deb package

To get your drives to mount on boot we have to edit your /etc/fstab file. Add the following lines at the end of your file and replace the drive IDs with your own.

This mounts both drives on /mnt/hdd1 and /mnt/hdd2 and then mounts them together via mhddfs on /mnt/media. Now let’s set up our file system with a folder for torrents and a couple for our Libraries.

This is an easy one :)

I also like to keep my configs in one easy place in case I want to transfer them anywhere, so let’s create a folder to hold our docker container configs and create our docker-compose.yml file

And add this to your docker-compose file. We will be filling in the services in the coming steps. If you are confused on how to add the services or how your file should look, here is a good resource on docker-compose.

This will start your Plex server on port 32400, and add the volumes /mnt and ~/docker-services/plex/config onto the container. If you are trying to move your current Plex configs over, run something like this

Note that plex is looking for your config directory to contain a single directory Library. Look for that directory and copy it over.

If you are on something other than Ubuntu, refer to this page to find your configs.

Notice how we mount our torrent drive on the container in the same location as the host, rather than something like /downloads (which is suggested over at linuxserver). This, plus the config below ensures Sonarr and Radarr send torrents to the right directory.

Once Transmission has started for the first time, it will make a settings.json file for you (and will overwrite/reset it every time you run docker-compose up). here are some changes you should make to the settings file. Come back here later to make these changes once everything is started, then run docker restart transmission.

Note: This get’s reset every time you create your container for some reason. Keep a backup!

See that script that get’s run once a torrent is done? This will search for any .rar files and decompress them in your torrents. Super helpful, let’s make that and then we’re done here!

This is super basic and just boots your Jackett service on port 9117. Doesn’t need much else!

Now, these guys are freaking TRICKY. Make sure those PUID and GUID match the ID for your user and group… and make sure that user has read-write permissions for /mnt/media. Sonarr and Radarr are going to try to be creating folders and files in there when they copy or hard link files over.

If you are running into issues, check the logs of the docker container or the logs in the web UI. It should tell you exactly where it’s having trouble. Then log into the user you set it to run as an attempt the same actions. See whats going on first hand.

This will open Ombi on port 3579 but sadly they don’t have SSL support by default. I can create a post on adding LetsEncrypt to this setup if it get’s enough traction!

Run this command to boot up all your services! Remember to go back and update your Transmission settings after this.

You now have these services running locally. Go to their web UI’s and configure everything.

There is some final configuration you will need to do that is out of the scope of this tutorial, but I can help if need be. Easeus data recovery wizard for mac key.

You will have to

  1. Configure Jackett with your indexers
  2. Point Sonarr and Radarr to Jackett for indexers and Transmission as a download client
  3. Tell Sonarr and Radarr to download Movies and Shows folders you created above
  4. Tell Sonarr and Radarr to use Hardlinks instead of Copies in advanced settings
  5. Configure Ombi to use Sonarr and Radarr for requests

Now go invite your friends to your Plex server

Personally, I don’t use torrents. My preferred choice is Usenet. Still, every now and then people tend to ask me how to setup docker containers and most often is how to set up a torrent client with VPN protection.

I have written in the past how to utilize VPN on your NAS and one method of tunneling your torrent traffic via your NAS and a VPN connection is using a VDSM instance that will be protected with a VPN and in return, any other app running under that VDSM instance will be protected as well.

Now, this is useful if you will be using that same instance for more then just torrenting. If you are looking for occasional torrent download, then maybe a docker container will be far less resource demanding, not to mention that you will not need a VDSM license (unless you have the free license still open to use).

In these steps, I will explain a bit how to use qBittorrent client in a combination with a VPN provider of your choice. For this, I will use https://hub.docker.com/r/markusmcnugen/qbittorrentvpn image.

  1. Download the image from docker repository

  2. Log into your NAS via SSH and elevate to root
    a) use sudo -i to get root access

  3. Create openvpn folder inside the future /config location where you will copy your OVPN file of choice

  4. Run the following docker run as a single line and change the settings to match your needs.

Keep in mind that you need to run this as a single line so just delete each and replace it with a single space
The most important option here is the fact that you will need to make an openvpn folder inside your config mount point. This is explained in the steps, but if you are not reading carefully you might miss it. In that folder drop the OVPN file that you wanna use.

Docker Client Java

Getting OVPN files from your provider will depend on the provider and also some providers use different username/password combination that’s different from your login credentials to use their service, so keep that in mind as well when filling out the configuration parameters.

So, for example, let's say that you will use this location for your config volume mount: /volume1/docker/qbittorrent. You will need to make openvpn folder inside that qbittorrent folder and copy the OVPN file inside it.

  1. Now that you have your container running, check the logs for any error and if all is well you should have the container running.
  2. Access the qBittorrent using your NAS IP address on port 8080

If you get an error in log saying 'Cannot open TUN/TAP dev /dev/net/tun', read the next section, if all is well, skip to 'How to check if you are running inside the VPN?'

I get the 'ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)'

NOTE: All credits for this fix go to Rui Marinho (@ruipmarinho) at https://ruimarinho.github.io/post/fix-tun-tap-not-available-on-a-synology-nas/

If this error happens plese follow the steps described bellow:

Check the tun module status

Check if you have the tunmodule installed:

lsmod grep tun

If the result comes out empty, try installing it:

If everything went fine, move on to the next test.

Test if the tun.ko module works

Now let’s make sure the tun.komodule works as expected (run each line one at a time. If you get errors that the locations already exist just keep running the next line):

If the result of the catcommand was File descriptor in bad state, it means the module has been correctly installed.

Make tun.ko module persistent

The module installation needs to be made persistent otherwise on every Synology restart, you’ll have to repeat the insmod command.

Create the following file to run on every system boot:

Install Docker Client

This will open up a tun.sh file and inside it copy this block and hit return:

Make the script executable:

Reboot your Synology NAS or execute the script manually once. Done!

How to check if you are running inside the VPN?

Now that you have it running the question is are you inside the VPN or not. The easy way to test this is to use the Docker UI Terminal tab (of via console inside Portainer if you are running that as well) and open up a bash command.

Inside the command line, run this command:

curl ifconfig.me

This command will contact the service that will in return tell you what’s your public IP address. If you have a public address that’s different from the one you get when you visit whatsmyip address from your computer, then you are golden.

In my example, I will be using a NORDVPN provider connection to Switzerland. In the following steps, I will explain how to confirm that your traffic is inside the VPN tunnel and not exposed to your ISP.

  1. Once you get logged into your VPN container using the Terminal tab and running the curl ifconfig.me command, run that IP address result on http://whois.domaintools.com website.

Best Docker Bittorrent Client Download

Depending on the VPN file that you decided to use, you will get a different result and a different country. In this example, Switzerland was my destination.

Now that we have confirmation that we are indeed in a different country, it would be nice to see if the traffic is completely inside the VPN tunnel as well. The best way to do this is to trace traffic to a certain destination and see if we get a hit to our ISP provider along the way.

To do this we will use traceroute command inside the container. So again, log into it with a bash command (using the Terminal tab inside Docker UI). Now that you are inside you will need to install traceroute first. To do this run the following commands:

  1. With traceroute command line installed, run this to see how traffic is running:

Docker Client For Windows

traceroute protonmail.ch

As you can see from the image, the second hop (number 2) is hitting our VPN address confirming that we are indeed getting out in Switzerland (same IP as provided by using whois.domaintool.com. If this was not the case, the second hop would be your local router IP address and then a few more hops from your ISP. Considering that in this image there is no router local IP address as well as no ISP addresses, we can be sure that the traffic is completely tunneled.

One more bonus thing here is that once the VPN goes down, your torrenets will stop as well, so you have a kill switch scenario as well.

Again, logging onto your NAS IP address on port 8080 should land you on the main qBittorrent page where you can log in using username/password combination: admin/adminadmin (default values).

If you have any questions, comments, or suggestions, please leave a comment down below.

Coments are closed
Scroll to top