Install Sonarr Raspberry Pi with Mono 3.10

raspberry_pi_nzbdrone

Sonarr is an alternative to SickBeard and SickRage for Usenet video automation. It works well with NZBGet and Sabnzbd. Sonarr has changed name because it will be supporting torrents in the near future so NzbDrone was no longer an appropriate name. It is written in C# which requires Mono on Linux based systems. Using this guide will get automatically install Mono 3.2.8 on Raspbian. The recommended Mono version is 3.10 but building mono on the Raspberry Pi is not recommended because of its low spec hardware.

I managed to compile a working mono 3.10 armhf deb package so all you have to do is download it and install it. If you already have Sonarr installed on your Raspberry Pi and Pi 2 you can either remove the old mono or try and install the deb package over the existing installation. When you are done Sonarr (NzbDrone) will use mono 3.10.

I recommend only using this on headless machines, if you are on Raspbmc you will notice Sonarr is a bit slow, that is because Raspbmc is using a lot of GPU and RAM to create the graphical interface. That said, Sonarr will still work on Raspbmc, but expect the interface to not be super snappy.

Raspberry Pi 2 users use the Raspberry Pi 2 guide

Usenet Provider
Backbone
Retention
Speed
Connections
VPN
Monthly
Annual
UsenetServer
UsenetServer
2265
Unlimited
20
Yes
$10
$95.40
Usenetlink
Cloudgate
2000
100 Mbit
30
No
$15
$140
Astraweb
Astraweb
2264
Unlimited
20
No
$7.50
$96.00
UsenetBucket
XS News
1100
40 Mbit
25
No
€4.95
€60.00
Frugal
Blocknews
600
Unlimited
60
No
$4.99
$50.00

If you are trying to figure out which hardware would work best for you, consider reading the Pi benchmarks.

Install Sonarr Raspberry Pi with Mono 3.10

Update packages

sudo apt-get update

Upgrade packages

sudo apt-get upgrade -y

Install libmono-cil-dev (Thanks to Raijmond)

sudo apt-get install libmono-cil-dev -y

If you get a libmono-cil-dev will not be installed you hold broken packages do this extra step

Lower the pin preference

sudo nano /etc/apt/preferences

Add these lines, if you are on jessie replace wheezy with jessie

Package: *
Pin: release n=wheezy
Pin-Priority: 998

Save with Ctrl+X, Y and Enter

Now update packages and install

sudo apt-get update
sudo apt-get install libmono-cil-dev -y

Install Mono 3.10 Raspberry Pi armhf Package

Download the precompiled mono 3.10 arm deb package

wget http://sourceforge.net/projects/bananapi/files/mono_3.10-armhf.deb

If Sourceforge is down you can use a mirror (thanks Hermi)

wget http://www.frickelzeugs.de/mono_3.10-armhf.deb

Here is yet another mono mirror

wget https://www.dropbox.com/s/k6ff6s9bfe4mfid/mono_3.10-armhf.deb

Install the Mono 3.10 package for Raspbian

sudo dpkg -i mono_3.10-armhf.deb

You can check your mono version

mono --version

It should read

Mono JIT compiler version 3.10.0 (mono-3.10.0-branch/ce003f4 Wed Nov 26 20:10:31 CET 2014)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com

Even if it doesn’t show 3.10.0 don’t worry, there is a workaround for the init.d script

Install Sonarr Raspberry Pi

Enable apt-get to install from https sources or you will get this error

The method driver /usr/lib/apt/methods/https could not be found.

To solve it install the https package

sudo apt-get install apt-transport-https -y --force-yes

Add sources to install Sonarr on Raspbian

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

Update packages

sudo apt-get update

Install Sonarr (NzbDrone)

sudo apt-get install nzbdrone -y

Take ownership of the Sonarr installation so updates will work properly

sudo chown -R pi:pi /opt/NzbDrone

Autostart Sonarr

There are two methods, the init.d script and upstart script. Upstart can conflict with your system so attempt the init.d method first.

Sonarr init.d Script

Create the init.d script file

sudo nano /etc/init.d/nzbdrone

Paste this long code, change DAEMON to DAEMON=/usr/local/bin/mono if mono shows 3.2.8 instead of 3.10

#! /bin/sh
### BEGIN INIT INFO
# Provides: NzbDrone
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Should-Start: $NetworkManager
# Should-Stop: $NetworkManager
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts instance of NzbDrone
# Description: starts instance of NzbDrone using start-stop-daemon
### END INIT INFO

############### EDIT ME ##################
# path to app
APP_PATH=/opt/NzbDrone

# user
RUN_AS=pi

# path to mono bin
DAEMON=$(which mono)

# Path to store PID file
PID_FILE=/var/run/nzbdrone/nzbdrone.pid
PID_PATH=$(dirname $PID_FILE)

# script name
NAME=nzbdrone

# app name
DESC=NzbDrone

# startup args
EXENAME="NzbDrone.exe"
DAEMON_OPTS=" "$EXENAME

############### END EDIT ME ##################

NZBDRONE_PID=`ps auxf | grep NzbDrone.exe | grep -v grep | awk '{print $2}'`

test -x $DAEMON || exit 0

set -e

#Look for PID and create if doesn't exist
if [ ! -d $PID_PATH ]; then
mkdir -p $PID_PATH
chown $RUN_AS $PID_PATH
fi

if [ ! -d $DATA_DIR ]; then
mkdir -p $DATA_DIR
chown $RUN_AS $DATA_DIR
fi

if [ -e $PID_FILE ]; then
PID=`cat $PID_FILE`
if ! kill -0 $PID > /dev/null 2>&1; then
echo "Removing stale $PID_FILE"
rm $PID_FILE
fi
fi

echo $NZBDRONE_PID > $PID_FILE

case "$1" in
start)
if [ -z "${NZBDRONE_PID}" ]; then
echo "Starting $DESC"
rm -rf $PID_PATH || return 1
install -d --mode=0755 -o $RUN_AS $PID_PATH || return 1
start-stop-daemon -d $APP_PATH -c $RUN_AS --start --background --pidfile $PID_FILE --exec $DAEMON -- $DAEMON_OPTS
else
echo "NzbDrone already running."
fi
;;
stop)
echo "Stopping $DESC"
echo $NZBDRONE_PID > $PID_FILE
start-stop-daemon --stop --pidfile $PID_FILE --retry 15
;;

restart|force-reload)
echo "Restarting $DESC"
start-stop-daemon --stop --pidfile $PID_FILE --retry 15
start-stop-daemon -d $APP_PATH -c $RUN_AS --start --background --pidfile $PID_FILE --exec $DAEMON -- $DAEMON_OPTS
;;
status)
# Use LSB function library if it exists
if [ -f /lib/lsb/init-functions ]; then
. /lib/lsb/init-functions
if [ -e $PID_FILE ]; then
status_of_proc -p $PID_FILE "$DAEMON" "$NAME" && exit 0 || exit $?
else
log_daemon_msg "$NAME is not running"
exit 3
fi

else
# Use basic functions
if [ -e $PID_FILE ]; then
PID=`cat $PID_FILE`
if kill -0 $PID > /dev/null 2>&1; then
echo " * $NAME is running"
exit 0
fi
else
echo " * $NAME is not running"
exit 3
fi
fi
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
exit 1
;;
esac

exit 0

Ctrl+X, Y and Enter to save

Make the Sonarr init.d script executable

sudo chmod +x /etc/init.d/nzbdrone

Update the Sonarr init.d to start on boot

sudo update-rc.d /etc/init.d/nzbdrone defaults 98

If the above command gives an error try

sudo update-rc.d nzbdrone defaults 98

Reboot and then configure Sonarr.

Sonarr on OSMC Update and Raspbian Fix

If you are using OSMC you should remove the sonarr repo from the sources.list (source here). The repository is not necessary for updating Sonarr and can cause mono dependency issues.

sudo rm /etc/apt/sources.list.d/sonarr.list

Note that Sonarr takes a minute or two to start up on boot so if you can’t access the Sonarr web interface, be patient, it will be accessible when the Pi finishes loading it. This has been tested on a Raspbian fresh install at least 5 times and it does work. On the first run it can take 5 minutes, after the first run it will automatically start faster on boot.

You can access Sonarr on its default port at http://ip.address:8989

Now you can configure NzbDrone. An updated guide to include Sonarr’s torrent abilities will be published when the updates make it to the master branch.