Last active
March 7, 2024 10:43
-
-
Save svc-user/a9c58b8f5e8cfe59a9cabe47cd4449de to your computer and use it in GitHub Desktop.
Installation script for lidarr/radarr/sonarr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
### Description: Sonarr .NET Debian install | |
### Originally written for Radarr by: DoctorArr - [email protected] on 2021-10-01 v1.0 | |
### Updates for servarr suite made by Bakerboy448, DoctorArr, brightghost, aeramor and VP-EN | |
### Version v1.0.0 2023-12-29 - StevieTV - adapted from servarr script for Sonarr installs | |
### Version V1.0.1 2024-01-02 - StevieTV - remove UTF8-BOM | |
### Version V1.0.2 2024-01-03 - markus101 - Get user input from /dev/tty | |
### Version V1.0.3 2024-01-06 - StevieTV - exit script when it is ran from install directory | |
### Boilerplate Warning | |
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
scriptversion="1.0.3" | |
scriptdate="2024-01-06" | |
set -euo pipefail | |
echo "Running Lidarr Install Script - Version [$scriptversion] as of [$scriptdate]" | |
# Am I root?, need root! | |
if [ "$EUID" -ne 0 ]; then | |
echo "Please run as root." | |
exit | |
fi | |
app="lidarr" | |
app_port="8686" | |
app_prereq="curl sqlite3 wget mediainfo libchromaprint-tools" | |
app_umask="0002" | |
branch="master" | |
# Constants | |
### Update these variables as required for your specific instance | |
installdir="/opt" # {Update me if needed} Install Location | |
bindir="${installdir}/${app^}" # Full Path to Install Location | |
datadir="/var/lib/$app/" # {Update me if needed} AppData directory to use | |
app_bin=${app^} # Binary Name of the app | |
# This script should not be ran from installdir, otherwise later in the script the extracted files will be removed before they can be moved to installdir. | |
if [ "$installdir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ] || [ "$bindir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ]; then | |
echo "You should not run this script from the intended install directory. The script will exit. Please re-run it from another directory" | |
exit | |
fi | |
# Prompt User | |
read -r -p "What user should ${app^} run as? (Default: $app): " app_uid < /dev/tty | |
app_uid=$(echo "$app_uid" | tr -d ' ') | |
app_uid=${app_uid:-$app} | |
# Prompt Group | |
read -r -p "What group should ${app^} run as? (Default: media): " app_guid < /dev/tty | |
app_guid=$(echo "$app_guid" | tr -d ' ') | |
app_guid=${app_guid:-media} | |
echo "This will install [${app^}] to [$bindir] and use [$datadir] for the AppData Directory" | |
echo "${app^} will run as the user [$app_uid] and group [$app_guid]. By continuing, you've confirmed that that user and group will have READ and WRITE access to your Media Library and Download Client Completed Download directories" | |
read -n 1 -r -s -p $'Press enter to continue or ctrl+c to exit...\n' < /dev/tty | |
# Create User / Group as needed | |
if [ "$app_guid" != "$app_uid" ]; then | |
if ! getent group "$app_guid" >/dev/null; then | |
groupadd "$app_guid" | |
fi | |
fi | |
if ! getent passwd "$app_uid" >/dev/null; then | |
adduser --system --no-create-home --ingroup "$app_guid" "$app_uid" | |
echo "Created and added User [$app_uid] to Group [$app_guid]" | |
fi | |
if ! getent group "$app_guid" | grep -qw "$app_uid"; then | |
echo "User [$app_uid] did not exist in Group [$app_guid]" | |
usermod -a -G "$app_guid" "$app_uid" | |
echo "Added User [$app_uid] to Group [$app_guid]" | |
fi | |
# Stop the App if running | |
if service --status-all | grep -Fq "$app"; then | |
systemctl stop "$app" | |
systemctl disable "$app".service | |
echo "Stopped existing $app" | |
fi | |
# Create Appdata Directory | |
# AppData | |
mkdir -p "$datadir" | |
chown -R "$app_uid":"$app_guid" "$datadir" | |
chmod 775 "$datadir" | |
echo "Directories created" | |
# Download and install the App | |
# prerequisite packages | |
echo "" | |
echo "Installing pre-requisite Packages" | |
# shellcheck disable=SC2086 | |
apt update && apt install -y $app_prereq | |
echo "" | |
ARCH=$(dpkg --print-architecture) | |
# get arch | |
dlbase="http://lidarr.servarr.com/v1/update/$branch/updatefile?os=linux&runtime=netcore" | |
case "$ARCH" in | |
"amd64") DLURL="${dlbase}&arch=x64" ;; | |
"armhf") DLURL="${dlbase}&arch=arm" ;; | |
"arm64") DLURL="${dlbase}&arch=arm64" ;; | |
*) | |
echo "Arch not supported" | |
exit 1 | |
;; | |
esac | |
echo "" | |
echo "Removing previous tarballs" | |
# -f to Force so we fail if it doesnt exist | |
rm -f "${app^}".*.tar.gz | |
echo "" | |
echo "Downloading..." | |
wget --content-disposition "$DLURL" | |
tar -xvzf "${app^}".*.tar.gz | |
echo "" | |
echo "Installation files downloaded and extracted" | |
# remove existing installs | |
echo "Removing existing installation" | |
rm -rf "$bindir" | |
echo "Installing..." | |
mv "${app^}" $installdir | |
chown "$app_uid":"$app_guid" -R "$bindir" | |
chmod 775 "$bindir" | |
rm -rf "${app^}.*.tar.gz" | |
# Ensure we check for an update in case user installs older version or different branch | |
touch "$datadir"/update_required | |
chown "$app_uid":"$app_guid" "$datadir"/update_required | |
echo "App Installed" | |
# Configure Autostart | |
# Remove any previous app .service | |
echo "Removing old service file" | |
rm -rf /etc/systemd/system/"$app".service | |
# Create app .service with correct user startup | |
echo "Creating service file" | |
cat <<EOF | tee /etc/systemd/system/"$app".service >/dev/null | |
[Unit] | |
Description=${app^} Daemon | |
After=syslog.target network.target | |
[Service] | |
User=$app_uid | |
Group=$app_guid | |
UMask=$app_umask | |
Type=simple | |
ExecStart=$bindir/$app_bin -nobrowser -data=$datadir | |
TimeoutStopSec=20 | |
KillMode=process | |
Restart=on-failure | |
[Install] | |
WantedBy=multi-user.target | |
EOF | |
# Start the App | |
echo "Service file created. Attempting to start the app" | |
systemctl -q daemon-reload | |
systemctl enable --now -q "$app" | |
# Finish Update/Installation | |
host=$(hostname -I) | |
ip_local=$(grep -oP '^\S*' <<<"$host") | |
echo "" | |
echo "Install complete" | |
sleep 10 | |
STATUS="$(systemctl is-active "$app")" | |
if [ "${STATUS}" = "active" ]; then | |
echo "Browse to http://$ip_local:$app_port for the ${app^} GUI" | |
else | |
echo "${app^} failed to start" | |
fi | |
# Exit | |
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
### Description: Radarr .NET Debian install | |
### Originally written for Radarr by: DoctorArr - [email protected] on 2021-10-01 v1.0 | |
### Updates for servarr suite made by Bakerboy448, DoctorArr, brightghost, aeramor and VP-EN | |
### Version v1.0.0 2023-12-29 - StevieTV - adapted from servarr script for Radarr installs | |
### Version V1.0.1 2024-01-02 - StevieTV - remove UTF8-BOM | |
### Version V1.0.2 2024-01-03 - markus101 - Get user input from /dev/tty | |
### Version V1.0.3 2024-01-06 - StevieTV - exit script when it is ran from install directory | |
### Boilerplate Warning | |
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
scriptversion="1.0.3" | |
scriptdate="2024-01-06" | |
set -euo pipefail | |
echo "Running Radarr Install Script - Version [$scriptversion] as of [$scriptdate]" | |
# Am I root?, need root! | |
if [ "$EUID" -ne 0 ]; then | |
echo "Please run as root." | |
exit | |
fi | |
app="radarr" | |
app_port="7878" | |
app_prereq="curl sqlite3 wget" | |
app_umask="0002" | |
branch="master" | |
# Constants | |
### Update these variables as required for your specific instance | |
installdir="/opt" # {Update me if needed} Install Location | |
bindir="${installdir}/${app^}" # Full Path to Install Location | |
datadir="/var/lib/$app/" # {Update me if needed} AppData directory to use | |
app_bin=${app^} # Binary Name of the app | |
# This script should not be ran from installdir, otherwise later in the script the extracted files will be removed before they can be moved to installdir. | |
if [ "$installdir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ] || [ "$bindir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ]; then | |
echo "You should not run this script from the intended install directory. The script will exit. Please re-run it from another directory" | |
exit | |
fi | |
# Prompt User | |
read -r -p "What user should ${app^} run as? (Default: $app): " app_uid < /dev/tty | |
app_uid=$(echo "$app_uid" | tr -d ' ') | |
app_uid=${app_uid:-$app} | |
# Prompt Group | |
read -r -p "What group should ${app^} run as? (Default: media): " app_guid < /dev/tty | |
app_guid=$(echo "$app_guid" | tr -d ' ') | |
app_guid=${app_guid:-media} | |
echo "This will install [${app^}] to [$bindir] and use [$datadir] for the AppData Directory" | |
echo "${app^} will run as the user [$app_uid] and group [$app_guid]. By continuing, you've confirmed that that user and group will have READ and WRITE access to your Media Library and Download Client Completed Download directories" | |
read -n 1 -r -s -p $'Press enter to continue or ctrl+c to exit...\n' < /dev/tty | |
# Create User / Group as needed | |
if [ "$app_guid" != "$app_uid" ]; then | |
if ! getent group "$app_guid" >/dev/null; then | |
groupadd "$app_guid" | |
fi | |
fi | |
if ! getent passwd "$app_uid" >/dev/null; then | |
adduser --system --no-create-home --ingroup "$app_guid" "$app_uid" | |
echo "Created and added User [$app_uid] to Group [$app_guid]" | |
fi | |
if ! getent group "$app_guid" | grep -qw "$app_uid"; then | |
echo "User [$app_uid] did not exist in Group [$app_guid]" | |
usermod -a -G "$app_guid" "$app_uid" | |
echo "Added User [$app_uid] to Group [$app_guid]" | |
fi | |
# Stop the App if running | |
if service --status-all | grep -Fq "$app"; then | |
systemctl stop "$app" | |
systemctl disable "$app".service | |
echo "Stopped existing $app" | |
fi | |
# Create Appdata Directory | |
# AppData | |
mkdir -p "$datadir" | |
chown -R "$app_uid":"$app_guid" "$datadir" | |
chmod 775 "$datadir" | |
echo "Directories created" | |
# Download and install the App | |
# prerequisite packages | |
echo "" | |
echo "Installing pre-requisite Packages" | |
# shellcheck disable=SC2086 | |
apt update && apt install -y $app_prereq | |
echo "" | |
ARCH=$(dpkg --print-architecture) | |
# get arch | |
dlbase="http://radarr.servarr.com/v1/update/$branch/updatefile?os=linux&runtime=netcore" | |
case "$ARCH" in | |
"amd64") DLURL="${dlbase}&arch=x64" ;; | |
"armhf") DLURL="${dlbase}&arch=arm" ;; | |
"arm64") DLURL="${dlbase}&arch=arm64" ;; | |
*) | |
echo "Arch not supported" | |
exit 1 | |
;; | |
esac | |
echo "" | |
echo "Removing previous tarballs" | |
# -f to Force so we fail if it doesnt exist | |
rm -f "${app^}".*.tar.gz | |
echo "" | |
echo "Downloading..." | |
wget --content-disposition "$DLURL" | |
tar -xvzf "${app^}".*.tar.gz | |
echo "" | |
echo "Installation files downloaded and extracted" | |
# remove existing installs | |
echo "Removing existing installation" | |
rm -rf "$bindir" | |
echo "Installing..." | |
mv "${app^}" $installdir | |
chown "$app_uid":"$app_guid" -R "$bindir" | |
chmod 775 "$bindir" | |
rm -rf "${app^}.*.tar.gz" | |
# Ensure we check for an update in case user installs older version or different branch | |
touch "$datadir"/update_required | |
chown "$app_uid":"$app_guid" "$datadir"/update_required | |
echo "App Installed" | |
# Configure Autostart | |
# Remove any previous app .service | |
echo "Removing old service file" | |
rm -rf /etc/systemd/system/"$app".service | |
# Create app .service with correct user startup | |
echo "Creating service file" | |
cat <<EOF | tee /etc/systemd/system/"$app".service >/dev/null | |
[Unit] | |
Description=${app^} Daemon | |
After=syslog.target network.target | |
[Service] | |
User=$app_uid | |
Group=$app_guid | |
UMask=$app_umask | |
Type=simple | |
ExecStart=$bindir/$app_bin -nobrowser -data=$datadir | |
TimeoutStopSec=20 | |
KillMode=process | |
Restart=on-failure | |
[Install] | |
WantedBy=multi-user.target | |
EOF | |
# Start the App | |
echo "Service file created. Attempting to start the app" | |
systemctl -q daemon-reload | |
systemctl enable --now -q "$app" | |
# Finish Update/Installation | |
host=$(hostname -I) | |
ip_local=$(grep -oP '^\S*' <<<"$host") | |
echo "" | |
echo "Install complete" | |
sleep 10 | |
STATUS="$(systemctl is-active "$app")" | |
if [ "${STATUS}" = "active" ]; then | |
echo "Browse to http://$ip_local:$app_port for the ${app^} GUI" | |
else | |
echo "${app^} failed to start" | |
fi | |
# Exit | |
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
### Description: Sonarr .NET Debian install | |
### Originally written for Radarr by: DoctorArr - [email protected] on 2021-10-01 v1.0 | |
### Updates for servarr suite made by Bakerboy448, DoctorArr, brightghost, aeramor and VP-EN | |
### Version v1.0.0 2023-12-29 - StevieTV - adapted from servarr script for Sonarr installs | |
### Version V1.0.1 2024-01-02 - StevieTV - remove UTF8-BOM | |
### Version V1.0.2 2024-01-03 - markus101 - Get user input from /dev/tty | |
### Version V1.0.3 2024-01-06 - StevieTV - exit script when it is ran from install directory | |
### Boilerplate Warning | |
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
scriptversion="1.0.3" | |
scriptdate="2024-01-06" | |
set -euo pipefail | |
echo "Running Sonarr Install Script - Version [$scriptversion] as of [$scriptdate]" | |
# Am I root?, need root! | |
if [ "$EUID" -ne 0 ]; then | |
echo "Please run as root." | |
exit | |
fi | |
app="sonarr" | |
app_port="8989" | |
app_prereq="curl sqlite3 wget" | |
app_umask="0002" | |
branch="main" | |
# Constants | |
### Update these variables as required for your specific instance | |
installdir="/opt" # {Update me if needed} Install Location | |
bindir="${installdir}/${app^}" # Full Path to Install Location | |
datadir="/var/lib/$app/" # {Update me if needed} AppData directory to use | |
app_bin=${app^} # Binary Name of the app | |
# This script should not be ran from installdir, otherwise later in the script the extracted files will be removed before they can be moved to installdir. | |
if [ "$installdir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ] || [ "$bindir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ]; then | |
echo "You should not run this script from the intended install directory. The script will exit. Please re-run it from another directory" | |
exit | |
fi | |
# Prompt User | |
read -r -p "What user should ${app^} run as? (Default: $app): " app_uid < /dev/tty | |
app_uid=$(echo "$app_uid" | tr -d ' ') | |
app_uid=${app_uid:-$app} | |
# Prompt Group | |
read -r -p "What group should ${app^} run as? (Default: media): " app_guid < /dev/tty | |
app_guid=$(echo "$app_guid" | tr -d ' ') | |
app_guid=${app_guid:-media} | |
echo "This will install [${app^}] to [$bindir] and use [$datadir] for the AppData Directory" | |
echo "${app^} will run as the user [$app_uid] and group [$app_guid]. By continuing, you've confirmed that that user and group will have READ and WRITE access to your Media Library and Download Client Completed Download directories" | |
read -n 1 -r -s -p $'Press enter to continue or ctrl+c to exit...\n' < /dev/tty | |
# Create User / Group as needed | |
if [ "$app_guid" != "$app_uid" ]; then | |
if ! getent group "$app_guid" >/dev/null; then | |
groupadd "$app_guid" | |
fi | |
fi | |
if ! getent passwd "$app_uid" >/dev/null; then | |
adduser --system --no-create-home --ingroup "$app_guid" "$app_uid" | |
echo "Created and added User [$app_uid] to Group [$app_guid]" | |
fi | |
if ! getent group "$app_guid" | grep -qw "$app_uid"; then | |
echo "User [$app_uid] did not exist in Group [$app_guid]" | |
usermod -a -G "$app_guid" "$app_uid" | |
echo "Added User [$app_uid] to Group [$app_guid]" | |
fi | |
# Stop the App if running | |
if service --status-all | grep -Fq "$app"; then | |
systemctl stop "$app" | |
systemctl disable "$app".service | |
echo "Stopped existing $app" | |
fi | |
# Create Appdata Directory | |
# AppData | |
mkdir -p "$datadir" | |
chown -R "$app_uid":"$app_guid" "$datadir" | |
chmod 775 "$datadir" | |
echo "Directories created" | |
# Download and install the App | |
# prerequisite packages | |
echo "" | |
echo "Installing pre-requisite Packages" | |
# shellcheck disable=SC2086 | |
apt update && apt install -y $app_prereq | |
echo "" | |
ARCH=$(dpkg --print-architecture) | |
# get arch | |
dlbase="https://services.sonarr.tv/v1/download/$branch/latest?version=4&os=linux" | |
case "$ARCH" in | |
"amd64") DLURL="${dlbase}&arch=x64" ;; | |
"armhf") DLURL="${dlbase}&arch=arm" ;; | |
"arm64") DLURL="${dlbase}&arch=arm64" ;; | |
*) | |
echo "Arch not supported" | |
exit 1 | |
;; | |
esac | |
echo "" | |
echo "Removing previous tarballs" | |
# -f to Force so we fail if it doesnt exist | |
rm -f "${app^}".*.tar.gz | |
echo "" | |
echo "Downloading..." | |
wget --content-disposition "$DLURL" | |
tar -xvzf "${app^}".*.tar.gz | |
echo "" | |
echo "Installation files downloaded and extracted" | |
# remove existing installs | |
echo "Removing existing installation" | |
rm -rf "$bindir" | |
echo "Installing..." | |
mv "${app^}" $installdir | |
chown "$app_uid":"$app_guid" -R "$bindir" | |
chmod 775 "$bindir" | |
rm -rf "${app^}.*.tar.gz" | |
# Ensure we check for an update in case user installs older version or different branch | |
touch "$datadir"/update_required | |
chown "$app_uid":"$app_guid" "$datadir"/update_required | |
echo "App Installed" | |
# Configure Autostart | |
# Remove any previous app .service | |
echo "Removing old service file" | |
rm -rf /etc/systemd/system/"$app".service | |
# Create app .service with correct user startup | |
echo "Creating service file" | |
cat <<EOF | tee /etc/systemd/system/"$app".service >/dev/null | |
[Unit] | |
Description=${app^} Daemon | |
After=syslog.target network.target | |
[Service] | |
User=$app_uid | |
Group=$app_guid | |
UMask=$app_umask | |
Type=simple | |
ExecStart=$bindir/$app_bin -nobrowser -data=$datadir | |
TimeoutStopSec=20 | |
KillMode=process | |
Restart=on-failure | |
[Install] | |
WantedBy=multi-user.target | |
EOF | |
# Start the App | |
echo "Service file created. Attempting to start the app" | |
systemctl -q daemon-reload | |
systemctl enable --now -q "$app" | |
# Finish Update/Installation | |
host=$(hostname -I) | |
ip_local=$(grep -oP '^\S*' <<<"$host") | |
echo "" | |
echo "Install complete" | |
sleep 10 | |
STATUS="$(systemctl is-active "$app")" | |
if [ "${STATUS}" = "active" ]; then | |
echo "Browse to http://$ip_local:$app_port for the ${app^} GUI" | |
else | |
echo "${app^} failed to start" | |
fi | |
# Exit | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment