Browse Source

Merge pull request #173 from tteck/v3

V3
tteckster 3 years ago
parent
commit
d9d06c877e
5 changed files with 448 additions and 4 deletions
  1. 2 0
      CHANGELOG.MD
  2. 2 4
      README.md
  3. 0 0
      ct/jellyfin-v1.sh
  4. 328 0
      ct/jellyfin-v3.sh
  5. 116 0
      setup/jellyfin-install.sh

+ 2 - 0
CHANGELOG.MD

@@ -41,6 +41,8 @@ All notable changes to this project will be documented in this file.
   - New V3 Install Script 
 - **Plex Media Server LXC**
   - New V3 Install Script 
+- **Jellyfin Media Server LXC**
+  - New V3 Install Script 
 
 ## 2022-04-17
 

+ 2 - 4
README.md

@@ -1045,7 +1045,7 @@ ________________________________________________________________________________
 </details>
 
 <details>
-<summary markdown="span"> Jellyfin Media Server LXC </summary>
+<summary markdown="span"> 🔸Jellyfin Media Server LXC </summary>
 <p align="center"><img src="https://github.com/home-assistant/brands/blob/master/core_integrations/jellyfin/icon.png?raw=true" height="100"/></p>
 <h1 align="center" id="heading"> Jellyfin Media Server LXC </h1>
 
@@ -1054,12 +1054,10 @@ ________________________________________________________________________________
 To create a new Proxmox Jellyfin Media Server LXC, run the following in the Proxmox Shell.
 
 ```yaml
-bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/jellyfin_container.sh)"
+bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/jellyfin-v3.sh)"
 ```
 <h3 align="center" id="heading">⚡ Default Settings:  2GB RAM - 8GB Storage - 2vCPU ⚡</h3>
 
-After the script completes, If you're dissatisfied with the default settings, click on the LXC, then on the **_Resources_** tab and change the settings to what you desire. Changes are immediate.
-
 **Jellyfin Media Server Interface - IP:8096**
 
 ⚙️ **To Update Jellyfin Media Server**

+ 0 - 0
ct/jellyfin_container.sh → ct/jellyfin-v1.sh


+ 328 - 0
ct/jellyfin-v3.sh

@@ -0,0 +1,328 @@
+#!/usr/bin/env bash -ex
+set -euo pipefail
+shopt -s inherit_errexit nullglob
+NEXTID=$(pvesh get /cluster/nextid)
+INTEGER='^[0-9]+$'
+YW=`echo "\033[33m"`
+BL=`echo "\033[36m"`
+RD=`echo "\033[01;31m"`
+BGN=`echo "\033[4;92m"`
+GN=`echo "\033[1;92m"`
+DGN=`echo "\033[32m"`
+CL=`echo "\033[m"`
+BFR="\\r\\033[K"
+HOLD="-"
+CM="${GN}✓${CL}"
+CROSS="${RD}✗${CL}"
+APP="Jellyfin"
+NSAPP=$(echo ${APP,,} | tr -d ' ')
+while true; do
+    read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn
+    case $yn in
+        [Yy]* ) break;;
+        [Nn]* ) exit;;
+        * ) echo "Please answer yes or no.";;
+    esac
+done
+clear
+function header_info {
+echo -e "${DGN}
+       _      _ _        __ _       
+      | |    | | |      / _(_)      
+      | | ___| | |_v3 _| |_ _ _ __  
+  _   | |/ _ \ | | | | |  _| |  _ \ 
+ | |__| |  __/ | | |_| | | | | | | |
+  \____/ \___|_|_|\__, |_| |_|_| |_|
+                   __/ |            
+                  |___/             
+${CL}"
+}
+
+header_info
+
+function msg_info() {
+    local msg="$1"
+    echo -ne " ${HOLD} ${YW}${msg}..."
+}
+
+function msg_ok() {
+    local msg="$1"
+    echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
+}
+
+function PVE_CHECK() {
+    PVE=$(pveversion | grep "pve-manager/7" | wc -l)
+
+    if [[ $PVE != 1 ]]; then
+        echo -e "${RD}This script requires Proxmox Virtual Environment 7.0 or greater${CL}"
+        echo -e "Exiting..."
+        sleep 2
+        exit
+    fi
+}
+
+function default_settings() {
+        clear
+        header_info
+        echo -e "${BL}Using Default Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}Privileged${CL}"
+        CT_TYPE="0"
+	    echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}"
+		PW=" "
+		echo -e "${DGN}Using CT ID ${BGN}$NEXTID${CL}"
+		CT_ID=$NEXTID
+		echo -e "${DGN}Using CT Name ${BGN}$NSAPP${CL}"
+		HN=$NSAPP
+		echo -e "${DGN}Using Disk Size ${BGN}8GB${CL}"
+		DISK_SIZE="8"
+		echo -e "${DGN}Using ${BGN}2vCPU${CL}"
+		CORE_COUNT="2"
+		echo -e "${DGN}Using ${BGN}2048MiB${CL}${DGN} RAM${CL}"
+		RAM_SIZE="2048"
+		echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}"
+		NET=dhcp
+		echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}"
+		GATE=" "
+                echo -e "${DGN}Using VLAN Tag ${BGN}NONE${CL}"
+                VLAN=" "
+}
+
+function advanced_settings() {
+        clear
+        header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${YW}Type ${CROSS} ${YW}Unprivileged, or Press [ENTER] for Default: Privileged"
+        read CT_TYPE1
+        if [ -z $CT_TYPE1 ]; then CT_TYPE1="Privileged" CT_TYPE="0"; 
+        echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}"
+        else
+        CT_TYPE1="Unprivileged"
+        CT_TYPE="1"
+        echo -en "${DGN}Set CT Type ${BL}Unprivileged${CL}"  
+        fi;
+echo -e " ${CM}${CL} \r"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${YW}Set Password, or Press [ENTER] for Default: Automatic Login "
+        read PW1
+        if [ -z $PW1 ]; then PW1="Automatic Login" PW=" "; 
+        echo -en "${DGN}Set CT ${BL}$PW1${CL}"
+        else
+          PW="-password $PW1"
+        echo -en "${DGN}Set CT Password ${BL}$PW1${CL}"
+        fi;
+echo -e " ${CM}${CL} \r"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${YW}Enter the CT ID, or Press [ENTER] to automatically generate (${NEXTID}) "
+        read CT_ID
+        if [ -z $CT_ID ]; then CT_ID=$NEXTID; fi;
+        echo -en "${DGN}Set CT ID To ${BL}$CT_ID${CL}"
+echo -e " ${CM}${CL} \r"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP "
+        read CT_NAME
+        if [ -z $CT_NAME ]; then
+           HN=$NSAPP
+        else
+           HN=$(echo ${CT_NAME,,} | tr -d ' ')
+        fi
+        echo -en "${DGN}Set CT Name To ${BL}$HN${CL}"
+echo -e " ${CM}${CL} \r"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${DGN}Using CT Name ${BGN}$HN${CL}"
+        echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 8Gb "
+        read DISK_SIZE
+        if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; fi;
+        if ! [[ $DISK_SIZE =~ $INTEGER ]] ; then echo "ERROR! DISK SIZE MUST HAVE INTEGER NUMBER!"; exit; fi;
+        echo -en "${DGN}Set Disk Size To ${BL}$DISK_SIZE${CL}"
+echo -e " ${CM}${CL} \r"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${DGN}Using CT Name ${BGN}$HN${CL}"
+        echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}"
+        echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: 2 "
+        read CORE_COUNT
+        if [ -z $CORE_COUNT ]; then CORE_COUNT="2"; fi;
+        echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}"
+echo -e " ${CM}${CL} \r"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${DGN}Using CT Name ${BGN}$HN${CL}"
+        echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}"
+        echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}"
+        echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 "
+        read RAM_SIZE
+        if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi;
+        echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}"
+echo -e " ${CM}${CL} \n"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${DGN}Using CT Name ${BGN}$HN${CL}"
+        echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}"
+        echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}"
+        echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}"
+        echo -e "${YW}Enter a Static IP Address, or Press [ENTER] for Default: DHCP "
+        read NET
+        if [ -z $NET ]; then NET="dhcp"; fi;
+        echo -en "${DGN}Set Static IP Address To ${BL}$NET${CL}"
+echo -e " ${CM}${CL} \n"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${DGN}Using CT Name ${BGN}$HN${CL}"
+        echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}"
+        echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}"
+        echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}"
+        echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}"
+        echo -e "${YW}Enter a Gateway IP, or Press [ENTER] for Default: NONE "
+        read GATE1
+        if [ -z $GATE1 ]; then GATE1="NONE" GATE=" "; 
+        echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}"
+        else
+          GATE=",gw=$GATE1"
+        echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}"
+        fi;
+echo -e " ${CM}${CL} \n"
+sleep 1
+clear
+header_info
+
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${DGN}Using CT Name ${BGN}$HN${CL}"
+        echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}"
+        echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}"
+        echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}"
+        echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}"
+        echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${CL}"
+        echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE "
+        read VLAN1
+        if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; 
+        echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}"
+        else
+          VLAN=",tag=$VLAN1"
+        echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}"
+        fi;
+echo -e " ${CM}${CL} \n"
+sleep 1
+clear
+header_info
+        echo -e "${RD}Using Advanced Settings${CL}"
+        echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}"
+        echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}"
+        echo -e "${DGN}Using CT ID ${BGN}$CT_ID${CL}"
+        echo -e "${DGN}Using CT Name ${BGN}$HN${CL}"
+        echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}"
+        echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}"
+        echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}"
+        echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}"
+        echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${CL}"
+        echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}"
+
+read -p "Are these settings correct(y/n)? " -n 1 -r
+echo
+if [[ ! $REPLY =~ ^[Yy]$ ]]
+then
+    advanced_settings
+fi
+}
+
+function start_script() {
+		echo -e "${YW}Type Advanced, or Press [ENTER] for Default Settings "
+		read SETTINGS
+		if [ -z $SETTINGS ]; then default_settings; 
+		else
+		advanced_settings 
+		fi;
+}
+
+PVE_CHECK
+start_script
+
+if [ "$CT_TYPE" == "1" ]; then 
+ FEATURES="nesting=1,keyctl=1"
+ else
+ FEATURES="nesting=1"
+ fi
+
+TEMP_DIR=$(mktemp -d)
+pushd $TEMP_DIR >/dev/null
+
+export CTID=$CT_ID
+export PCT_OSTYPE=ubuntu
+export PCT_OSVERSION=20.04
+export PCT_DISK_SIZE=$DISK_SIZE
+export PCT_OPTIONS="
+  -features $FEATURES
+  -hostname $HN
+  -net0 name=eth0,bridge=vmbr0,ip=$NET$GATE$VLAN
+  -onboot 1
+  -cores $CORE_COUNT
+  -memory $RAM_SIZE
+  -unprivileged $CT_TYPE
+  $PW
+"
+bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
+
+LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
+cat <<EOF >> $LXC_CONFIG
+lxc.cgroup2.devices.allow: c 226:0 rwm
+lxc.cgroup2.devices.allow: c 226:128 rwm
+lxc.cgroup2.devices.allow: c 29:0 rwm
+lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
+lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
+lxc.mount.entry: /dev/dri/renderD128 dev/renderD128 none bind,optional,create=file
+EOF
+
+msg_info "Starting LXC Container"
+pct start $CTID
+msg_ok "Started LXC Container"
+
+lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/jellyfin-install.sh)" || exit
+
+IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}')
+
+msg_ok "Completed Successfully!\n"
+echo -e "Jellyfin Media Server should be reachable by going to the following URL.
+             ${BL}http://${IP}:8096${CL}\n"

+ 116 - 0
setup/jellyfin-install.sh

@@ -0,0 +1,116 @@
+#!/usr/bin/env bash -ex
+set -euo pipefail
+shopt -s inherit_errexit nullglob
+YW=`echo "\033[33m"`
+RD=`echo "\033[01;31m"`
+BL=`echo "\033[36m"`
+GN=`echo "\033[1;92m"`
+CL=`echo "\033[m"`
+RETRY_NUM=10
+RETRY_EVERY=3
+NUM=$RETRY_NUM
+CM="${GN}✓${CL}"
+CROSS="${RD}✗${CL}"
+BFR="\\r\\033[K"
+HOLD="-"
+
+function msg_info() {
+    local msg="$1"
+    echo -ne " ${HOLD} ${YW}${msg}..."
+}
+
+function msg_ok() {
+    local msg="$1"
+    echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
+}
+
+msg_info "Setting up Container OS "
+sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
+locale-gen >/dev/null
+while [ "$(hostname -I)" = "" ]; do
+  1>&2 echo -en "${CROSS}${RD}  No Network! "
+  sleep $RETRY_EVERY
+  ((NUM--))
+  if [ $NUM -eq 0 ]
+  then
+    1>&2 echo -e "${CROSS}${RD}  No Network After $RETRY_NUM Tries${CL}"    
+    exit 1
+  fi
+done
+msg_ok "Set up Container OS"
+msg_ok "Network Connected: ${BL}$(hostname -I)"
+
+msg_info "Updating Container OS"
+apt update &>/dev/null
+apt-get -qqy upgrade &>/dev/null
+msg_ok "Updated Container OS"
+
+msg_info "Installing Dependencies"
+apt-get install -y curl &>/dev/null
+apt-get install -y sudo &>/dev/null
+apt-get install -y apt-transport-https &>/dev/null
+apt-get install -y software-properties-common &>/dev/null
+msg_ok "Installed Dependencies"
+
+msg_info "Setting Up Hardware Acceleration"  
+apt-get -y install \
+    va-driver-all \
+    ocl-icd-libopencl1 \
+    beignet-opencl-icd &>/dev/null
+    
+/bin/chgrp video /dev/dri
+/bin/chmod 755 /dev/dri
+/bin/chmod 660 /dev/dri/*
+msg_ok "Set Up Hardware Acceleration"  
+
+msg_info "Setting Up Jellyfin Repository"
+sudo add-apt-repository universe -y &>/dev/null
+wget -q -O - https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key | sudo apt-key add - &>/dev/null
+echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/ubuntu $( lsb_release -c -s ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list &>/dev/null
+msg_ok "Set Up Jellyfin Repository"
+
+msg_info "Installing Jellyfin"
+apt-get update &>/dev/null
+sudo apt install jellyfin-server -y &>/dev/null
+msg_ok "Installed Jellyfin"
+
+msg_info "Creating Service"
+cat << 'EOF' > /lib/systemd/system/jellyfin.service
+[Unit]
+Description = Jellyfin Media Server
+After = network.target
+[Service]
+Type = simple
+EnvironmentFile = /etc/default/jellyfin
+User = root
+ExecStart = /usr/bin/jellyfin ${JELLYFIN_WEB_OPT} ${JELLYFIN_RESTART_OPT} ${JELLYFIN_FFMPEG_OPT} ${JELL>
+Restart = on-failure
+TimeoutSec = 15
+[Install]
+WantedBy = multi-user.target
+EOF
+ln -s /usr/share/jellyfin/web/ /usr/lib/jellyfin/bin/jellyfin-web
+msg_ok "Created Service"
+
+PASS=$(grep -w "root" /etc/shadow | cut -b6);
+  if [[ $PASS != $ ]]; then
+msg_info "Customizing Container"
+chmod -x /etc/update-motd.d/*
+touch ~/.hushlogin
+GETTY_OVERRIDE="/etc/systemd/system/container-getty@1.service.d/override.conf"
+mkdir -p $(dirname $GETTY_OVERRIDE)
+cat << EOF > $GETTY_OVERRIDE
+[Service]
+ExecStart=
+ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,38400,9600 \$TERM
+EOF
+systemctl daemon-reload
+systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//')
+msg_ok "Customized Container"
+  fi
+  
+msg_info "Cleaning up"
+apt-get autoremove >/dev/null
+apt-get autoclean >/dev/null
+rm -rf /var/{cache,log}/* /var/lib/apt/lists/*
+msg_ok "Cleaned"