Skip to content

Instantly share code, notes, and snippets.

@Nottt
Last active April 6, 2024 13:36
Show Gist options
  • Save Nottt/d7a3ae3c7b05f74947084ea3420141e2 to your computer and use it in GitHub Desktop.
Save Nottt/d7a3ae3c7b05f74947084ea3420141e2 to your computer and use it in GitHub Desktop.
Cloudbox install script
#!/bin/bash
# Docker Setup for streaming backend using cloudbox, intended to be run as root :
## To Do : Pass arguments to script if reboot is necessary, edit only the necessary line in plex-autoscan config file.
KERNEL=$(uname -r)
BASE=4.10
echo $KERNEL
if [ "$KERNEL" != "$BASE" ]; then
tput setaf 1; echo "You don't need to reboot, continuing install" && tput setaf 7;
else
echo tput setaf 1; "You have to reboot to update kernel, please wait" && tput setaf 7;
crontab -l | { cat; echo "@reboot /root/install.sh > /root/install.log 2>&1"; } | crontab -
apt-get update && apt install linux-generic-hwe-16.04 -y && tput setaf 1; echo "Rebooting now" && reboot
fi
## Set Variables
if [ -z "$user" ] || [ -z "$DOMAIN" ] || [ -z "$EMAIL" ] || [ -z "$RCLONEREMOTE" ] || [ -z "$RCLONEBACKUP" ] || [ -z "$PLEXDRIVE" ] || [ -z "$LOCALSTORAGE" ] || ; then
$user=$1
$DOMAIN=$2
$EMAIL=$3
$RCLONEREMOTE=$4
$RCLONEBACKUP=$5
$PLEXDRIVE=$6
$LOCALSTORAGE=$7
fi
while [ -z "$user" ]; do
>&2 echo -n 'Your desired User : '
read USER
done
while [ -z "$DOMAIN" ]; do
>&2 echo -n 'Your domain : '
read DOMAIN
done
while [ -z "$EMAIL" ]; do
>&2 echo -n 'Your email : '
read EMAIL
done
while [ -z "$RCLONEREMOTE" ]; do
>&2 echo -n 'Desired name for rclone remote : '
read RCLONEREMOTE
done
while [ -z "$RCLONEBACKUP" ]; do
>&2 echo -n 'Desired path in google drive for backups : '
read RCLONEBACKUP
done
while [ -z "$PLEXDRIVE" ]; do
>&2 echo -n 'If you have a plexdrive backup in google drive, insert rclone path here : '
read PLEXDRIVE
done
while [ -z "$LOCALSTORAGE" ]; do
>&2 echo -n 'How much disk space to use to cache files : '
read LOCALSTORAGE
done
# Install stuff, set time to UTC
timedatectl set-timezone Etc/UTC && apt-get update && apt-get upgrade -y && apt install linux-generic-hwe-16.04 -y && apt install fuse cifs-utils iotop lsof pv ncdu nload htop iotop git python-pip unattended-upgrades-y && easy_install -U pip && pip install ansible==2.3.1.0 && apt-get autoremove -y && apt-get autoclean -y
# Create user for cloudbox
groupadd docker --system
adduser --disabled-login --gecos "" $user && usermod -aG sudo $user && usermod -u 1010 $user && groupmod -g 1010 $user && usermod -aG docker $user
# Open necessary ports, assumes ssh port is 22
tput setaf 1; echo "WARNING : DO NOT USE A DIFFERENT PORT FOR SSH OTHER THAN 22 OR YOU WILL BE LOCKED OUT" && tput setaf 7;
apt-get install ufw && ufw default deny incoming && ufw default allow outgoing && ufw allow 7421 && ufw allow 9000 && ufw allow 9117 && ufw allow 5075 && ufw allow 7878 && ufw allow 8989 && ufw allow 3000 && ufw allow 8181 && ufw allow 80 && ufw allow 443 && ufw allow 6789 && ufw allow 3111 && ufw allow ssh && ufw allow 32400 && ufw allow 3468 && echo "y" | ufw enable
# Create necessary paths
mkdir -p /mnt/unionfs /mnt/plexdrive /mnt/local /opt/plexdrive /root/.config/rclone/ /home/$user/downloads/ && chown $user:$user -R /mnt && chmod 770 -R /mnt
# Install cloudbox
git clone http://github.com/l3uddz/cloudbox /home/$user/cloudbox/
## Change settings.yml
cat > /home/$USER/cloudbox/settings.yml <<EOF
user: $user
passwd: ""
domain: $DOMAIN
email: $EMAIL
nzbget:
downloads: "/home/{{user}}/downloads/nzbget"
rutorrent:
passwd:
downloads: "/home/{{user}}/downloads/rutorrent"
plex:
tag: public
transcodes: "/home/{{user}}/transcodes"
plex_autoscan:
ip: "0.0.0.0"
rclone:
version: 1.38
unionfs_cleaner:
max_local_gigabytes: $LOCALSTORAGE
size_check_mins: 15
rclone_remote: "$RCLONEREMOTE:"
backup:
tgz_dest: "/home/{{user}}/Backups"
rsync_dest: rsync://somehost.com/Backups
rclone_dest: $RCLONEBACKUP
use_rsync: false
use_rclone: true
cron_time: weekly
cron_state: absent
EOF
## Install
cd /home/$user/cloudbox/ && ansible-playbook cloudbox.yml --tags full
# Set rclone for user and root
cat > /opt/rclone/rclone.conf <<EOF
[$RCLONEREMOTE]
type = drive
client_id =
client_secret =
token = {"access_token":
EOF
cat > /root/.config/rclone/rclone.conf <<EOF
[$RCLONEREMOTE]
type = drive
client_id =
client_secret =
token = {"access_token":
EOF
# Setup plexdrive if necessary files already exist on gdrive, otherwise do manually
rclone copy gdrive:$PLEXDRIVE /opt/plexdrive && systemctl enable plexdrive
# Grab Plex Autoscan URL
IP=$(curl ipecho.net/plain)
sleep 5s
key=$(awk -vFS=/ '$0 ~ "http://0.0.0.0:3468/"{print $NF}' /opt/plex_autoscan/*.log)
tput setaf 1; echo "Your Plex Autoscan URL when adding to sonarr/etc is http://$IP:3468/$key - please save it" && tput setaf 7;
# Grab the Plex AutoScan Token
# credits: https://raw.githubusercontent.com/wernight/docker-plex-media-server/master/root/usr/local/bin/retrieve-plex-token
if [ -z "$PLEX_LOGIN" ] || [ -z "$PLEX_PASSWORD" ]; then
PLEX_LOGIN=$1
PLEX_PASSWORD=$2
fi
while [ -z "$PLEX_LOGIN" ]; do
>&2 echo -n 'Your Plex login (e-mail or username): '
read PLEX_LOGIN
done
while [ -z "$PLEX_PASSWORD" ]; do
>&2 echo -n 'Your Plex password: '
read PLEX_PASSWORD
done
>&2 echo 'Retrieving a X-Plex-Token using Plex login/password...'
curl -qu "${PLEX_LOGIN}":"${PLEX_PASSWORD}" 'https://plex.tv/users/sign_in.xml' \
-X POST -H 'X-Plex-Device-Name: PlexMediaServer' \
-H 'X-Plex-Provides: server' \
-H 'X-Plex-Version: 0.9' \
-H 'X-Plex-Platform-Version: 0.9' \
-H 'X-Plex-Platform: xcid' \
-H 'X-Plex-Product: Plex Media Server'\
-H 'X-Plex-Device: Linux'\
-H 'X-Plex-Client-Identifier: XXXX' --compressed >/tmp/plex_sign_in
X_PLEX_TOKEN=$(sed -n 's/.*<authentication-token>\(.*\)<\/authentication-token>.*/\1/p' /tmp/plex_sign_in)
if [ -z "$X_PLEX_TOKEN" ]; then
cat /tmp/plex_sign_in
rm -f /tmp/plex_sign_in
>&2 echo 'Failed to retrieve the X-Plex-Token.'
exit 1
fi
rm -f /tmp/plex_sign_in
>&2 echo "Your X_PLEX_TOKEN:"
echo $X_PLEX_TOKEN && echo "This is your Plex Token"
# Edit plex_autoscan config files
cat > /opt/plex_autoscan/config/config.json <<EOF
{
"DOCKER_NAME": "plex",
"PLEX_DATABASE_PATH": "/opt/plex/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.db",
"PLEX_EMPTY_TRASH": true,
"PLEX_EMPTY_TRASH_CONTROL_FILES": [
"/mnt/unionfs/mounted.bin"
],
"PLEX_EMPTY_TRASH_MAX_FILES": 100,
"PLEX_EMPTY_TRASH_ZERO_DELETED": false,
"PLEX_LD_LIBRARY_PATH": "/usr/lib/plexmediaserver",
"PLEX_LOCAL_URL": "http://plex.{{domain}}",
"PLEX_SCANNER": "/usr/lib/plexmediaserver/Plex\\ Media\\ Scanner",
"PLEX_SECTION_PATH_MAPPINGS": {
"1": [
"/Movies/"
],
"2": [
"/TV/"
]
},
"PLEX_SUPPORT_DIR": "/var/lib/plexmediaserver/Library/Application\\ Support",
"PLEX_TOKEN": "$X_PLEX_TOKEN",
"PLEX_USER": "plex",
"PLEX_WAIT_FOR_EXTERNAL_SCANNERS": true,
"SERVER_ALLOW_MANUAL_SCAN": false,
"SERVER_FILE_EXIST_PATH_MAPPINGS": {
"/mnt/unionfs/Media": [
"/data"
]
},
"SERVER_IP": "{{plex_autoscan.ip}}",
"SERVER_MAX_FILE_CHECKS": 10,
"SERVER_PASS": "{{plex_autoscan_pass.stdout}}",
"SERVER_PATH_MAPPINGS": {
"/data/TV/": [
"/tv/"
],
"/data/Movies/": [
"/movies/"
]
},
"SERVER_PORT": 3468,
"SERVER_SCAN_DELAY": 5,
"USE_DOCKER": true,
"USE_SUDO": false
}
EOF
# Make sure the permissions are correct
chown $user:$user -R /mnt && chmod 770 -R /mnt && chown $user:$user -R /opt && chmod 770 -R /opt
echo "Server will reboot now. Enjoy"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment