Build A Complete Linux Media Server – Install Sonarr Series Download Manager

This entry is part 5 of 6 in the series Complete Linux Media Server

Install Sonarr Downloader

This article describes how to install Sonarr on Debian and integrate it with the previously configured transmission and nzbget programs.

Sonarr is the new name for NZBdrone – an application which not only automates TV show downloads but also maintains them after this is done. For example, depending on settings you configure, Sonarr will download an episode of a series in SD format as soon as it is posted and then upgrade it as progressively better quality releases become available.

Install Mono

Mono is an open source impementation of Microsoft’s .NET runtime and required in order run Sonarr. Debian needs a couple of extra steps to install this:

  1. Add the mono repositories to the Debian sources list:
    • sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
      echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
      echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list
  2. Update the package lists and install:
    • sudo apt-get upgrade && sudo apt-get install mono-devel

 Install Sonarr

First, add the Sonarr software repository to the debian software source list. This will allow us to easily install (and upgrade in the future) using apt-get:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC
echo "deb http://apt.sonarr.tv/ master main" | sudo tee /etc/apt/sources.list.d/sonarr.list

The next step is to install Sonarr itself:

sudo apt-get update
sudo apt-get install nzbdrone

Configure Sonarr to Run As a Service Under nobody:nogroup

  1. Change permissions on the Sonarr folder:
    • sudo chown -R nobody:nogroup /opt/NzbDrone/
  2. Create the file sonarr.service in /etc/systemd/system/ and paste in the following:
    • [Unit]
      Description=Sonarr Daemon
      After=network.target
      
      [Service]
      User=nobody
      Group=nogroup
      Restart=always
      RestartSec=5
      Type=simple
      ExecStart=/usr/bin/mono /opt/NzbDrone/NzbDrone.exe -nobrowser -data=ExecStart=/usr/bin/mono /opt/NzbDrone/NzbDrone.exe -nobrowser -data=/home/nobody/.config/NzbDrone
      TimeoutStopSec=20
      KillMode=process
      Restart=on-failure
      
      [Install]
      WantedBy=multi-user.target
  3. Update systemctl, enable the service and start sonarr:
    • sudo systemctl daemon-reload 
      sudo systemctl enable sonarr 
      sudo systemctl start sonarr
  4. This point is just a reminder that if you haven’t given nobody a home as detailed on the server install page then you’ll need to do it now and then restart sonarr. This is necessary to enable sonarr to auto-update which it can only do if the config files are kept separately away from its install directory.

Connect to Sonarr Web GUI

Open your browser and browse to http://your_server_ip:8989/

You should now see the following and this tells us that everything is working well:

sonarr web gui

Now we can proceed to our Sonarr configuration – click here to continue!

Build A Complete Linux Media Server – Install Nzbget

This entry is part 4 of 6 in the series Complete Linux Media Server

Install Nzbget Usenet Downloader

This article describes how to download and install nzbget on a debian server.

Usenet is a distributed system where users read and post messages – articles or posts, and collectively termed news) to one or more categories, known as newsgroups. They have been around since before the internet as we know it existed – think of it as a large, distributed forum. It was originally designed to transmit text messages but has since proved exceedingly popular for binaries i.e. programs and other files.

Nzbget is a downloader client for Usenet newsgroups binaries – it’s fast, efficient, has a small system footprint and of course it’s free! While transmission-daemon will take care of the torrent downloads, nzbget in turn takes care of newsgroup binary downloads.

A binary file in a newsgroup is split into a number of “part” files to allow posting – once all files have been downloaded, the original file can be reassembled – should one part file be missing or corrupted however then reassembly is not possible. Nzbget downloads all the part files and reassembles the file, notofying the user should anything be amiss.

The last thing to say is that while many internet providers have a limited Usenet service for their customers, to take real advantage of newsgroups you will need to take out a subscription – a quick google for providers will soon have you up and running and many have a free trial period.

Htpcguides have already written an excellent guide on installing nzbget on debian and ubuntu systems so this tutorial has been taken from their site and modified only to run as the user and group – nobody:nogroup – which we are configuring.

Install unrar

Unrar is the program that nzbget uses to unpack and reassemble the part files – you can install this with apt-get install unrar OR build it from source as described below to take advantage of multicore PCs which all of them are nowadays.

Why bother? Well, newsgroup binaries tend to be in a rar format so the faster we can decompress them the better – let’s use as many cores as possible!

We are going to build the latest unrar from source adapted from these instructions.

  1. Make sure you have building tools:
    • sudo apt-get install build-essential -y
  2. Enter your temporary directory
    • cd /tmp
  3. Download the latest unrar source tarball
    • wget rarlab.com/rar/unrarsrc-5.2.7.tar.gz
  4. Unpack the unrar source
    • tar -xvf unrarsrc-5.2.7.tar.gz
  5. Enter the unrar source
    • cd unrar
  6. Get the number of processors for compiling faster
    • nproc
  7. I have 2 so when building I add 2 after -j
    • make -j2 -f makefile
  8. Now install unrar
    • sudo install -v -m755 unrar /usr/bin
  9. Cleanup your unrar source and unpacked directory
    • cd ..
    • rm -rf unrar
    • rm unrarsrc.5.2.7.tar.gz

Install NZBGet

  1. Download the latest stable NZBGet installer – check the page and insert the correct link:
    • http://nzbget.net/download/
    • wget https://github.com/nzbget/nzbget/releases/download/v16.4/nzbget-16.4-bin-linux.run
  2. Install NZBGet on Debian 8.x:
    • sudo sh nzbget-16.4-bin-linux.run --destdir /opt/nzbget
  3. Remove the installer
    • rm nzbget-16.4-bin-linux.run
  4. Change ownership of the NZBGet installation to our nobody user
    • sudo chown -R nobody:nogroup /opt/nzbget
  5. Update your NZBGet configuration file to run as  nobody
    • sudo sed -i "/DaemonUsername=/c\DaemonUsername=nobody" /opt/nzbget/nzbget.conf
  6. Create the NZBGet systemd service
    • sudo nano /etc/systemd/system/nzbget.service
  7. Paste the working NZBGet systemd script for Debian
    • [Unit]
      Description=NZBGet Daemon
      Documentation=http://nzbget.net/Documentation
      After=network.target
      
      [Service]
      User=nobody
      Group=nogroup
      Type=forking
      ExecStart=/opt/nzbget/nzbget -c /opt/nzbget/nzbget.conf -D
      ExecStop=/opt/nzbget/nzbget -Q
      ExecReload=/opt/nzbget/nzbget -O
      KillMode=process
      Restart=on-failure
      
      [Install]
      WantedBy=multi-user.target
  8. Enable the NZBGet systemd service
    • sudo systemctl enable nzbget.service
  9. Start the NZBGet systemd service for Debian
    • sudo service nzbget start
    • Confirm you have access to NZBGet on http:/your_ip_here:6789, the default username is nzbget and password is tegbzn6789.nzbget web gui
  10. Change the default username and password under “SETTINGS: ControlUsername and Control Password” – we will need this later when we integrate nzbget into Sonarr:

    • change default username and password
  11. Lastly and definitely not least, enter your news server(s) address under SETTINGS -> NEWS-SERVERS. There are 4 parameters per server which must be configured:
    • Host – the address of your news server
    • Port – can be anything but generally 119 for non-SSL (unencrypted ) connections and 563 for SSL connections
    • Username and password for your Usenet providernews server configuration

Build A Complete Linux Media Server – Install transmission-daemon running as nobody

This entry is part 3 of 6 in the series Complete Linux Media Server

Install transmission-daemon

You could be forgiven for thinking that a simple “apt-get install” would suffice to install transmission-daemon and thoretically it does.

However! We want this set up securely and neatly as there are other components which need to interact with transmission and its files and directories and ideally we will have all of these running as user “nobody:nogroup”.

Install the Software

merlin@merlin:~$ sudo apt-get install transmission-daemon

Configure transmission-daemon to run as user nobody

If we now check our running processes, transmission is configured to run as user “debian-transmsission” – totally fine and secure but not quite what we want:

merlin@merlin:~$ ps aux | grep transmission
debian-+  1356  0.1  0.5  30708  6064 ?        Ssl  20:45   0:00 /usr/bin/transmission-daemon -f --log-error

We need to make the following edits and permission changes:

  1. Stop the daemon:
    • /etc/init.d/transmission-daemon stop
  2. Edit /etc/init.d/transmission-daemon and change the user:
    • change USER=debian-transmission to USER=nobody:nogroup and save the file
  3. As debian now uses systemd to manage services we also need to change the service “Unit” to reflect the different user. Edit the /lib/systemd/system/transmission-daemon.service file and change the following:
    •  User=debian-transmission to User=nobody
    • Add the absolute path of the config file to the end of the ExecStart line to workaround a slight bug with $HOME variables, the line should read:
      ExecStart=/usr/bin/transmission-daemon -f --log-error --config-dir=/var/lib/transmission-daemon/info
    • Save the file and reload the system configuration:
      sudo systemctl daemon-reload
  4. We now need to make sure that user nobody has permissions to the relevant files and directories:
    • merlin@merlin:~$ sudo chown -R nobody:nogroup /var/lib/transmission-daemon/
    • merlin@merlin:~$ sudo chown -R nobody:nogroup /etc/transmission-daemon

Set the UDP Send and Receive Buffers

The daemon will now start and run as user nobody:

merlin@merlin:~$ ps aux | grep trans
nobody     418  0.5  1.7  60628 18512 ?        Ssl  09:38   0:14 /usr/bin/transmission-daemon -f --log-error --config-dir=/var/lib/transmission-daemon/info

Tailing /var/log/syslog while restarting the service shows the following errors:

UDP Failed to set receive buffer: requested 4194304, got 327680 (tr-udp.c:78)
Failed to set send buffer: requested 1048576, got 327680 (tr-udp.c:89)

Transmission is requesting a 4MB receive buffer and a 1MB send buffer but not getting them. This can be swiftly corrected by adding the values to the sysctl.conf file and then refreshing with “sysctl -p”:

echo 'net.core.rmem_max = 4194304' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 1048576' >> /etc/sysctl.conf
sysctl -p

You can also try using larger buffers to tweak performance e.g. 16MB receive buffer and 4MB send as below:

echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 4194304' >> /etc/sysctl.conf

Once the values have been applied, a restart should be smooth and error free.

Change Default User Credentials & Allow Network GUI Access

As this is a headless server we are unlikely to be accessing it from localhost very often. Default settings allow only connections from 127.0.0.1 so edit the /etc/transmission-daemon/settings.json file and either add allowed IPs to the whitelist or disable the whitelist altogether (change rpc-enabled to false) – the latter should only be done if the server is not directly connected to the internet where anyone could access it!

  1. Stop the daemon before editing, otherwise your changes will be overwritten when the service is stopped / started later:
    merlin@merlin:~# sudo /etc/init.d/transmission-daemon stop
  2. Edit /etc/transmission-daemon/settings.json, look for the settings and change them as applicable:
    • Delete the hashed password between the quotes in this line and replace it with your new plain text password – transmission will automatically hash it as soon as it restarts:
      "rpc-password": "{b21ebef271608102725706c76924ca596ca0d3e6CA5En8YL",
    • Find the following line and change the username:
      "rpc-username": "transmission",
    • Either add your allowed IP(s) to the whitelist or set the enabled parameter to false to allow access from any IP:
      "rpc-whitelist": "127.0.0.1", "rpc-whitelist-enabled": true,
  3. Restart the service and you should now be able to connect via either the web gui or a front-end app e.g. Transmission Remote GUI

Implement a Blocklist (Optional)

In the Transmission Remote GUI go to Tools -> Transmission Options -> Network (WAN). Select “Enable blocklist” and enter the URL of your favourite blocklist provider. Generally the following is ample:

http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz

enable blocklist
Click OK and then Tools -> Update Blocklistupdate blocklist

References