### Description Add the `--storage-path` flag to the installer to configure a custom storage path out of the box. On existing installation, we check that the 'storage.path' in the configuration file is the same as the one provided by the installer. This ensures that we don't update the nginx configuration file with an invalid storage path.
846 lines
24 KiB
Bash
Executable file
846 lines
24 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
set -eu
|
|
|
|
red='\e[0;31m'
|
|
yellow='\e[1;33m'
|
|
cyan='\e[0;36m'
|
|
reset='\e[0m'
|
|
|
|
info() {
|
|
printf "${cyan}info: $*${reset}\n"
|
|
}
|
|
|
|
warning() {
|
|
printf >&2 "${yellow}warning: $*${reset}\n"
|
|
}
|
|
|
|
error() {
|
|
printf >&2 "${red}error: $*${reset}\n"
|
|
exit 1
|
|
}
|
|
|
|
section() {
|
|
text="$*"
|
|
printf -v bar '═%.0s' {1..78}
|
|
printf -v fill ' %.0s' {1..76}
|
|
printf "$cyan"
|
|
printf '╔%s╗\n' "$bar"
|
|
printf '║ %s ║\n' "${text}${fill:${#text}}"
|
|
printf '╚%s╝\n' "$bar"
|
|
printf "$reset"
|
|
}
|
|
|
|
banner() {
|
|
printf "${cyan}"
|
|
cat << EOF
|
|
|
|
██╗ ██╗██████╗ ██████╗ ███████╗████████╗██╗███╗ ███╗███████╗
|
|
██║ ██║██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██║████╗ ████║██╔════╝
|
|
██║ ██║██████╔╝██████╔╝█████╗ ██║ ██║██╔████╔██║█████╗
|
|
██║ ██║██╔══██╗██╔══██╗██╔══╝ ██║ ██║██║╚██╔╝██║██╔══╝
|
|
███████╗██║██████╔╝██║ ██║███████╗ ██║ ██║██║ ╚═╝ ██║███████╗
|
|
╚══════╝╚═╝╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝
|
|
|
|
EOF
|
|
printf "${reset}"
|
|
}
|
|
|
|
SCRIPT_DIR="$( cd "$( dirname "$0")" && pwd)"
|
|
|
|
version() {
|
|
if [ ! -f "$SCRIPT_DIR/VERSION" ]; then
|
|
make VERSION > /dev/null
|
|
fi
|
|
echo "LibreTime Version $(cat "$SCRIPT_DIR/VERSION")"
|
|
exit 0
|
|
}
|
|
|
|
usage() {
|
|
cat >&2 << EOF
|
|
Usage: $0 [option]... [public_url]
|
|
|
|
Install LibreTime on the system.
|
|
|
|
Options:
|
|
|
|
--user USER, -u USER User used to run LibreTime.
|
|
--listen-port PORT, -p PORT Listen port for LibreTime.
|
|
--storage-path PATH, -s PATH Storage path for LibreTime.
|
|
|
|
--in-place, -i Install LibreTime in place.
|
|
|
|
--no-setup-icecast Do not setup Icecast.
|
|
--no-setup-postgresql Do not setup Postgresql.
|
|
--no-setup-rabbitmq Do not setup RabbitMQ.
|
|
|
|
Environment variables:
|
|
|
|
Advanced options can be changed using environment variables (flags will take
|
|
precedence over environment variables).
|
|
|
|
EOF
|
|
|
|
while read line; do
|
|
if echo "$line" | grep -q '^#'; then
|
|
line="${cyan}${line}${reset}"
|
|
fi
|
|
|
|
# Pretty print variable definition
|
|
line=$(echo "$line" | sed -E 's/=\$\{[A-Z_]+\:-(.*)\}/=\1/g')
|
|
|
|
printf " ${line}\n"
|
|
done <<< "$(grep -A1 '^# >' "$0")"
|
|
}
|
|
|
|
# Load .env file if exists
|
|
[[ -f "$SCRIPT_DIR/.env" ]] && source "$SCRIPT_DIR/.env"
|
|
|
|
# Configuration
|
|
# > User used to run LibreTime.
|
|
LIBRETIME_USER=${LIBRETIME_USER:-"libretime"}
|
|
# > Listen port for LibreTime.
|
|
LIBRETIME_LISTEN_PORT=${LIBRETIME_LISTEN_PORT:-"8080"}
|
|
# > Public URL for LibreTime.
|
|
LIBRETIME_PUBLIC_URL=${LIBRETIME_PUBLIC_URL:-}
|
|
# > Timezone for LibreTime.
|
|
LIBRETIME_TIMEZONE=${LIBRETIME_TIMEZONE:-}
|
|
# > Storage path for LibreTime.
|
|
LIBRETIME_STORAGE_PATH=${LIBRETIME_STORAGE_PATH:-"/srv/libretime"}
|
|
|
|
# > Install LibreTime in editable mode.
|
|
# > Will keep working files in the project directory.
|
|
LIBRETIME_INSTALL_IN_PLACE=${LIBRETIME_INSTALL_IN_PLACE:-false}
|
|
# > Install a default icecast configuration.
|
|
LIBRETIME_SETUP_ICECAST=${LIBRETIME_SETUP_ICECAST:-true}
|
|
# > Create a default postgresql user with a random password.
|
|
LIBRETIME_SETUP_POSTGRESQL=${LIBRETIME_SETUP_POSTGRESQL:-true}
|
|
# > Create a default rabbitmq user with a random password.
|
|
LIBRETIME_SETUP_RABBITMQ=${LIBRETIME_SETUP_RABBITMQ:-true}
|
|
|
|
# > Comma separated list of sections to exclude from packages list.
|
|
LIBRETIME_PACKAGES_EXCLUDES=${LIBRETIME_PACKAGES_EXCLUDES:-}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--user | -u)
|
|
LIBRETIME_USER=$2
|
|
shift 2
|
|
;;
|
|
--listen-port | -p)
|
|
LIBRETIME_LISTEN_PORT=$2
|
|
shift 2
|
|
;;
|
|
--storage-path | -s)
|
|
LIBRETIME_STORAGE_PATH=$2
|
|
shift 2
|
|
;;
|
|
--in-place | -i)
|
|
LIBRETIME_INSTALL_IN_PLACE=true
|
|
shift 1
|
|
;;
|
|
--update-nginx)
|
|
error "the '--update-nginx' option was removed in 4.0.0"
|
|
;;
|
|
--no-setup-icecast)
|
|
LIBRETIME_SETUP_ICECAST=false
|
|
shift 1
|
|
;;
|
|
--no-setup-postgresql)
|
|
LIBRETIME_SETUP_POSTGRESQL=false
|
|
shift 1
|
|
;;
|
|
--no-setup-rabbitmq)
|
|
LIBRETIME_SETUP_RABBITMQ=false
|
|
shift 1
|
|
;;
|
|
--packages-excludes)
|
|
LIBRETIME_PACKAGES_EXCLUDES=$2
|
|
shift 2
|
|
;;
|
|
--help | -h)
|
|
usage
|
|
exit 0
|
|
;;
|
|
--version)
|
|
version
|
|
exit 0
|
|
;;
|
|
-*)
|
|
usage
|
|
exit 1
|
|
;;
|
|
*)
|
|
LIBRETIME_PUBLIC_URL=$1
|
|
shift 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Variables
|
|
DEFAULT_WEB_USER="www-data"
|
|
|
|
# Paths
|
|
VENV_DIR="/opt/libretime"
|
|
CONFIG_DIR="/etc/libretime"
|
|
CONFIG_FILEPATH="$CONFIG_DIR/config.yml"
|
|
CONFIG_TMP_FILEPATH="$CONFIG_DIR/config.yml.tmp"
|
|
CONFIG_EXAMPLE_FILEPATH="$SCRIPT_DIR/installer/config.yml"
|
|
WORKING_DIR="/var/lib/libretime"
|
|
LOG_DIR="/var/log/libretime"
|
|
LEGACY_WEB_ROOT="/usr/share/libretime/legacy"
|
|
|
|
SERVICE_DIR="/usr/lib/systemd/system"
|
|
|
|
# command_exist <command>
|
|
command_exist() {
|
|
command -v "$1" > /dev/null || error "$1 command not found!"
|
|
}
|
|
|
|
# generate_random_password
|
|
generate_random_password() {
|
|
tr -cd '[:alnum:]' < /dev/urandom | head -c32
|
|
}
|
|
|
|
# mkdir_and_chown <user> <path>
|
|
mkdir_and_chown() {
|
|
mkdir -p "$2"
|
|
chown -R "$1:$1" "$2"
|
|
}
|
|
|
|
# backup_if_exists <file>
|
|
backup_if_exists() {
|
|
if [[ -f "$1" ]]; then
|
|
backup="$1.$(date --iso-8601=seconds).bak"
|
|
warning "found existing $1, creating a backup to $backup"
|
|
mv "$1" "$backup"
|
|
fi
|
|
}
|
|
|
|
# diff_if_exists <src> <dest>
|
|
diff_if_exists() {
|
|
src="$1"
|
|
dest="$2"
|
|
shift 2
|
|
|
|
if [[ -f "$dest" ]]; then
|
|
src_explicit_filename="$(dirname "$src")/$(basename "$dest").new"
|
|
cp "$src" "$src_explicit_filename"
|
|
# print what the existing file $dest would become if $src is copied
|
|
diff -u --color=always --ignore-trailing-space "$dest" "$src_explicit_filename" || :
|
|
rm -f "$src_explicit_filename"
|
|
fi
|
|
}
|
|
|
|
# cp_if_different <src> <dest>
|
|
cp_if_different() {
|
|
if [[ -f "$2" ]] && diff -q "$1" "$2" > /dev/null; then
|
|
return
|
|
fi
|
|
diff_if_exists "$1" "$2"
|
|
backup_if_exists "$2"
|
|
cp "$1" "$2"
|
|
}
|
|
|
|
# template_file <action> <src> <dest> <render...>
|
|
template_file() {
|
|
action="$1"
|
|
src="$2"
|
|
dest="$3"
|
|
shift 3
|
|
|
|
tmp_file=$(mktemp)
|
|
"$@" "$src" > "$tmp_file"
|
|
$action "$tmp_file" "$dest"
|
|
rm "$tmp_file"
|
|
}
|
|
|
|
# get_config <key...>
|
|
get_config() {
|
|
query="/^${1}:/\n"
|
|
while [[ $# -gt 1 ]]; do
|
|
shift
|
|
query+="/ \+${1}:/\n"
|
|
done
|
|
query+="q"
|
|
|
|
echo -e "$query" | ed --quiet "$CONFIG_FILEPATH" |
|
|
tail -n 2 |
|
|
grep "$1" |
|
|
awk -F ': ' '{ print $2 }'
|
|
}
|
|
|
|
# set_config <value> <key...>
|
|
set_config() {
|
|
value="${1}" && shift
|
|
|
|
query="/^${1}:/\n"
|
|
while [[ $# -gt 1 ]]; do
|
|
shift
|
|
query+="/ \+${1}:/\n"
|
|
done
|
|
query+="s|\(${1}:\).*|\1 ${value}|\n"
|
|
query+="wq"
|
|
|
|
echo -e "$query" | ed --quiet "$CONFIG_TMP_FILEPATH" > /dev/null
|
|
}
|
|
|
|
# install_python_app <path>
|
|
install_python_app() {
|
|
info "installing python app from $1"
|
|
$VENV_DIR/bin/pip install --upgrade "$1"
|
|
}
|
|
|
|
# link_python_app <name>
|
|
link_python_app() {
|
|
ln -s -f "$VENV_DIR/bin/$1" "/usr/local/bin/$1"
|
|
}
|
|
|
|
# install_service <name> <filepath>
|
|
#
|
|
# <filepath> has to be relative to the project root
|
|
install_service() {
|
|
command_exist systemctl
|
|
|
|
local service_name="$1"
|
|
local service_src="$2"
|
|
local service_dest="$SERVICE_DIR/$service_name"
|
|
|
|
info "deploying $service_name service"
|
|
|
|
[[ -f "$service_src" ]] || error "service '$service_name' src path '$service_src' does not exists!"
|
|
|
|
if [[ ! -d "$SERVICE_DIR" ]]; then
|
|
mkdir -p "$SERVICE_DIR"
|
|
fi
|
|
|
|
template_file cp_if_different "$service_src" "$service_dest" \
|
|
sed \
|
|
-e "s|^User=.*|User=${LIBRETIME_USER}|" \
|
|
-e "s|^Group=.*|Group=${LIBRETIME_USER}|" \
|
|
-e "s|@@DEFAULT_WEB_USER@@|${DEFAULT_WEB_USER}|g" \
|
|
-e "s|@@VENV_DIR@@|${VENV_DIR}|g" \
|
|
-e "s|@@CONFIG_DIR@@|${CONFIG_DIR}|g" \
|
|
-e "s|@@CONFIG_FILEPATH@@|${CONFIG_FILEPATH}|g" \
|
|
-e "s|@@LOG_DIR@@|${LOG_DIR}|g" \
|
|
-e "s|@@WORKING_DIR@@|${WORKING_DIR}|g"
|
|
|
|
chmod 0644 "$service_dest"
|
|
chown root:root "$service_dest"
|
|
systemctl enable "$service_name"
|
|
}
|
|
|
|
# service_restart_if_active <name>
|
|
service_restart_if_active() {
|
|
if systemctl is-active "$1" > /dev/null; then
|
|
info "restarting $1 service"
|
|
systemctl restart "$1"
|
|
fi
|
|
}
|
|
|
|
is_ubuntu=false
|
|
is_debian=false
|
|
distro="unknown"
|
|
|
|
check_distribution() {
|
|
local ID="unknown"
|
|
local VERSION_ID="unknown"
|
|
|
|
if [[ -f "/etc/os-release" ]]; then
|
|
source "/etc/os-release"
|
|
fi
|
|
|
|
# shellcheck disable=SC2034
|
|
case "$ID-$VERSION_ID" in
|
|
ubuntu-20.04) is_ubuntu=true && distro="focal" ;;
|
|
debian-11) is_debian=true && distro="bullseye" ;;
|
|
*)
|
|
error "could not determine supported distribution '$ID-$VERSION_ID'
|
|
|
|
Please check the documentation to find the supported distributions.
|
|
|
|
Support for installing LibreTime on Buster has dropped since 3.1.0.
|
|
Support for installing LibreTime on Bionic has dropped since 3.1.0.
|
|
Support for installing LibreTime on Xenial has dropped since 3.0.0-alpha.10.
|
|
Support for installing LibreTime on Stretch has dropped since 3.0.0-alpha.10.
|
|
Support for installing LibreTime on Jessie has dropped since 3.0.0-alpha.8."
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# list_packages <packages_file>
|
|
list_packages() {
|
|
extra_args=()
|
|
for section in $LIBRETIME_PACKAGES_EXCLUDES; do
|
|
extra_args+=("--exclude=$section")
|
|
done
|
|
|
|
"$SCRIPT_DIR/tools/packages.py" \
|
|
"$distro" \
|
|
"$1" \
|
|
--format=line \
|
|
"${extra_args[@]}"
|
|
}
|
|
|
|
prepare_packages_install() {
|
|
if $is_ubuntu || $is_debian; then
|
|
DEBIAN_FRONTEND=noninteractive apt-get -q update
|
|
fi
|
|
|
|
if $is_ubuntu; then
|
|
install_packages software-properties-common
|
|
add-apt-repository -y ppa:libretime/libretime
|
|
|
|
DEBIAN_FRONTEND=noninteractive apt-get -q update
|
|
fi
|
|
}
|
|
|
|
# install_packages <packages...>
|
|
install_packages() {
|
|
if $is_ubuntu || $is_debian; then
|
|
# shellcheck disable=SC2086
|
|
DEBIAN_FRONTEND=noninteractive apt-get -qq -y install "$@"
|
|
else
|
|
warning "installing dependencies is not supported for this distribution"
|
|
fi
|
|
}
|
|
|
|
# get_system_timezone
|
|
get_system_timezone() {
|
|
if ! command -v timedatectl > /dev/null; then
|
|
return
|
|
fi
|
|
|
|
timezone="$(timedatectl show --property=Timezone --value)"
|
|
if [[ -n "$timezone" && ! "$timezone" =~ UTC$ ]]; then
|
|
echo "$timezone"
|
|
fi
|
|
}
|
|
|
|
load_config_defaults() {
|
|
if [[ -z "$LIBRETIME_TIMEZONE" ]]; then
|
|
LIBRETIME_TIMEZONE="$(get_system_timezone)"
|
|
fi
|
|
}
|
|
|
|
# Prepare
|
|
########################################################################################
|
|
|
|
# Make sure only root can run our script
|
|
(($( id -u) == 0)) || error "this script must be run as root!"
|
|
|
|
banner
|
|
check_distribution
|
|
|
|
load_config_defaults
|
|
|
|
is_first_install=true
|
|
if [[ -f "$CONFIG_FILEPATH" ]]; then
|
|
is_first_install=false
|
|
warning "a configuration file already exists at $CONFIG_FILEPATH, only running upgrade steps!"
|
|
fi
|
|
|
|
section "Prepare"
|
|
|
|
prepare_packages_install
|
|
|
|
install_packages sudo git make ed
|
|
make VERSION
|
|
|
|
info "creating project user"
|
|
if ! id "$LIBRETIME_USER" &> /dev/null; then
|
|
useradd --no-create-home --home-dir "$WORKING_DIR" "$LIBRETIME_USER"
|
|
fi
|
|
|
|
info "creating project directories"
|
|
mkdir -p "$CONFIG_DIR"
|
|
mkdir_and_chown "$LIBRETIME_USER" "$WORKING_DIR"
|
|
mkdir_and_chown "$LIBRETIME_USER" "$LOG_DIR"
|
|
|
|
if $is_first_install; then
|
|
[[ -f "$CONFIG_TMP_FILEPATH" ]] || cp "$CONFIG_EXAMPLE_FILEPATH" "$CONFIG_TMP_FILEPATH"
|
|
chown "$LIBRETIME_USER:$LIBRETIME_USER" "$CONFIG_TMP_FILEPATH"
|
|
chmod 640 "$CONFIG_TMP_FILEPATH"
|
|
|
|
if [[ -n "$LIBRETIME_PUBLIC_URL" ]]; then
|
|
set_config "$LIBRETIME_PUBLIC_URL" general public_url
|
|
fi
|
|
set_config "$(generate_random_password)" general api_key
|
|
|
|
set_config "$(generate_random_password)" general secret_key
|
|
|
|
if [[ -n "$LIBRETIME_TIMEZONE" ]]; then
|
|
set_config "$LIBRETIME_TIMEZONE" general timezone
|
|
fi
|
|
|
|
mkdir_and_chown "$LIBRETIME_USER" "$LIBRETIME_STORAGE_PATH"
|
|
set_config "$LIBRETIME_STORAGE_PATH" storage path
|
|
else
|
|
if [[ "$LIBRETIME_STORAGE_PATH" != "$(get_config storage path)" ]]; then
|
|
error \
|
|
"configuration mismatch between" \
|
|
"the installer storage path option ('$LIBRETIME_STORAGE_PATH') and" \
|
|
"the configuration file 'storage.path' field ('$(get_config storage path)')"
|
|
fi
|
|
fi
|
|
|
|
# PostgreSQL
|
|
########################################################################################
|
|
|
|
# > LibreTime PostgreSQL user
|
|
LIBRETIME_POSTGRESQL_USER=${LIBRETIME_POSTGRESQL_USER:-"libretime"}
|
|
# > LibreTime PostgreSQL user password
|
|
LIBRETIME_POSTGRESQL_PASSWORD=${LIBRETIME_POSTGRESQL_PASSWORD:-$(generate_random_password)}
|
|
# > LibreTime PostgreSQL database
|
|
LIBRETIME_POSTGRESQL_DATABASE=${LIBRETIME_POSTGRESQL_DATABASE:-"libretime"}
|
|
|
|
if $LIBRETIME_SETUP_POSTGRESQL; then
|
|
section "PostgreSQL"
|
|
install_packages postgresql postgresql-client
|
|
|
|
if $is_first_install; then
|
|
if ! sudo -iH -u postgres psql --csv --tuples-only --command='\du' | grep -qw "^$LIBRETIME_POSTGRESQL_USER"; then
|
|
info "creating PostgreSQL user '$LIBRETIME_POSTGRESQL_USER'"
|
|
sudo -iH -u postgres createuser "$LIBRETIME_POSTGRESQL_USER"
|
|
sudo -iH -u postgres psql -c "ALTER ROLE $LIBRETIME_POSTGRESQL_USER WITH PASSWORD '$LIBRETIME_POSTGRESQL_PASSWORD';"
|
|
|
|
set_config "$LIBRETIME_POSTGRESQL_USER" database user
|
|
set_config "$LIBRETIME_POSTGRESQL_PASSWORD" database password
|
|
else
|
|
warning "PostgreSQL user '$LIBRETIME_POSTGRESQL_USER' already exists!"
|
|
fi
|
|
|
|
if ! sudo -iH -u postgres psql --csv --tuples-only --list | grep -qw "^$LIBRETIME_POSTGRESQL_DATABASE"; then
|
|
info "creating PostgreSQL database '$LIBRETIME_POSTGRESQL_DATABASE' with owner '$LIBRETIME_POSTGRESQL_USER'"
|
|
sudo -iH -u postgres createdb --template=template0 --encoding=UTF-8 --owner="$LIBRETIME_POSTGRESQL_USER" "$LIBRETIME_POSTGRESQL_DATABASE"
|
|
|
|
set_config "$LIBRETIME_POSTGRESQL_DATABASE" database name
|
|
else
|
|
warning "PostgreSQL database '$LIBRETIME_POSTGRESQL_DATABASE' already exists!"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# RabbitMQ
|
|
########################################################################################
|
|
|
|
# > LibreTime RabbitMQ user
|
|
LIBRETIME_RABBITMQ_USER=${LIBRETIME_RABBITMQ_USER:-"libretime"}
|
|
# > LibreTime RabbitMQ user password
|
|
LIBRETIME_RABBITMQ_PASSWORD=${LIBRETIME_RABBITMQ_PASSWORD:-$(generate_random_password)}
|
|
# > LibreTime RabbitMQ vhost
|
|
LIBRETIME_RABBITMQ_VHOST=${LIBRETIME_RABBITMQ_VHOST:-"/libretime"}
|
|
|
|
if $LIBRETIME_SETUP_RABBITMQ; then
|
|
section "RabbitMQ"
|
|
install_packages rabbitmq-server
|
|
|
|
if $is_first_install; then
|
|
if ! rabbitmqctl --quiet list_users | grep -qw "^$LIBRETIME_RABBITMQ_USER"; then
|
|
info "creating RabbitMQ user '$LIBRETIME_RABBITMQ_USER'"
|
|
rabbitmqctl add_user "$LIBRETIME_RABBITMQ_USER" "$LIBRETIME_RABBITMQ_PASSWORD"
|
|
|
|
set_config "$LIBRETIME_RABBITMQ_USER" rabbitmq user
|
|
set_config "$LIBRETIME_RABBITMQ_PASSWORD" rabbitmq password
|
|
else
|
|
warning "RabbitMQ user '$LIBRETIME_RABBITMQ_USER' already exists!"
|
|
fi
|
|
|
|
if ! rabbitmqctl --quiet list_vhosts | grep -qw "^$LIBRETIME_RABBITMQ_VHOST"; then
|
|
info "creating RabbitMQ vhost '$LIBRETIME_RABBITMQ_VHOST' with owner '$LIBRETIME_RABBITMQ_USER'"
|
|
rabbitmqctl add_vhost "$LIBRETIME_RABBITMQ_VHOST"
|
|
rabbitmqctl set_permissions -p "$LIBRETIME_RABBITMQ_VHOST" "$LIBRETIME_RABBITMQ_USER" '.*' '.*' '.*'
|
|
|
|
set_config "$LIBRETIME_RABBITMQ_VHOST" rabbitmq vhost
|
|
else
|
|
warning "RabbitMQ vhost '$LIBRETIME_RABBITMQ_VHOST' already exists!"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Icecast
|
|
########################################################################################
|
|
|
|
# > LibreTime Icecast admin password
|
|
LIBRETIME_ICECAST_ADMIN_PASSWORD=${LIBRETIME_ICECAST_ADMIN_PASSWORD:-$(generate_random_password)}
|
|
# > LibreTime Icecast source password
|
|
LIBRETIME_ICECAST_SOURCE_PASSWORD=${LIBRETIME_ICECAST_SOURCE_PASSWORD:-$(generate_random_password)}
|
|
# > LibreTime Icecast relay password
|
|
LIBRETIME_ICECAST_RELAY_PASSWORD=${LIBRETIME_ICECAST_RELAY_PASSWORD:-$(generate_random_password)}
|
|
|
|
if $LIBRETIME_SETUP_ICECAST; then
|
|
section "Icecast"
|
|
install_packages icecast2
|
|
systemctl enable icecast2
|
|
|
|
systemctl start icecast2
|
|
|
|
if $is_first_install; then
|
|
icecast_config_filepath="/etc/icecast2/icecast.xml"
|
|
|
|
cp_if_different \
|
|
"${SCRIPT_DIR}/installer/icecast/icecast.xml" \
|
|
"$icecast_config_filepath"
|
|
|
|
sed --in-place \
|
|
-e "s|<admin-password>[^<]*</admin-password>|<admin-password>${LIBRETIME_ICECAST_ADMIN_PASSWORD}</admin-password>|" \
|
|
-e "s|<source-password>[^<]*</source-password>|<source-password>${LIBRETIME_ICECAST_SOURCE_PASSWORD}</source-password>|" \
|
|
-e "s|<relay-password>[^<]*</relay-password>|<relay-password>${LIBRETIME_ICECAST_RELAY_PASSWORD}</relay-password>|" \
|
|
"$icecast_config_filepath"
|
|
|
|
service_restart_if_active icecast2
|
|
|
|
set_config "$LIBRETIME_ICECAST_ADMIN_PASSWORD" stream outputs .default_icecast_output admin_password
|
|
set_config "$LIBRETIME_ICECAST_SOURCE_PASSWORD" stream outputs .default_icecast_output source_password
|
|
fi
|
|
fi
|
|
|
|
# Prepare python
|
|
########################################################################################
|
|
|
|
section "Python3"
|
|
install_packages python3 python3-pip python3-wheel python3-venv
|
|
|
|
info "creating python3 venv"
|
|
python3 -m venv "$VENV_DIR"
|
|
|
|
info "upgrading python3 tools"
|
|
$VENV_DIR/bin/pip install --upgrade pip setuptools wheel
|
|
|
|
# Install Shared and API client
|
|
########################################################################################
|
|
|
|
section "Shared"
|
|
|
|
# shellcheck disable=SC2046
|
|
install_packages $(list_packages "$SCRIPT_DIR/shared")
|
|
|
|
install_python_app "$SCRIPT_DIR/shared"
|
|
|
|
section "API client"
|
|
install_python_app "$SCRIPT_DIR/api-client"
|
|
|
|
# Install API
|
|
########################################################################################
|
|
|
|
section "API"
|
|
|
|
# shellcheck disable=SC2046
|
|
install_packages $(list_packages "$SCRIPT_DIR/api")
|
|
|
|
install_python_app "$SCRIPT_DIR/api[prod]"
|
|
link_python_app libretime-api
|
|
|
|
install_service "libretime-api.service" "$SCRIPT_DIR/api/install/systemd/libretime-api.service"
|
|
install_service "libretime-api.socket" "$SCRIPT_DIR/api/install/systemd/libretime-api.socket"
|
|
|
|
# Install Playout
|
|
########################################################################################
|
|
|
|
section "Playout"
|
|
|
|
# shellcheck disable=SC2046
|
|
install_packages $(list_packages "$SCRIPT_DIR/playout")
|
|
|
|
install_python_app "$SCRIPT_DIR/playout"
|
|
link_python_app libretime-liquidsoap
|
|
link_python_app libretime-playout
|
|
link_python_app libretime-playout-notify
|
|
|
|
info "creating libretime-playout working directory"
|
|
mkdir_and_chown "$LIBRETIME_USER" "$WORKING_DIR/playout"
|
|
|
|
install_service "libretime-liquidsoap.service" "$SCRIPT_DIR/playout/install/systemd/libretime-liquidsoap.service"
|
|
install_service "libretime-playout.service" "$SCRIPT_DIR/playout/install/systemd/libretime-playout.service"
|
|
|
|
info "deploying libretime-liquidsoap logrotate config"
|
|
template_file cp_if_different \
|
|
"$SCRIPT_DIR/playout/install/logrotate/libretime-liquidsoap.conf" \
|
|
"/etc/logrotate.d/libretime-liquidsoap" \
|
|
sed \
|
|
-e "s|@@LOG_DIR@@|${LOG_DIR}|g" \
|
|
-e "s|@@USER@@|${LIBRETIME_USER}|g"
|
|
|
|
# Install Analyzer
|
|
########################################################################################
|
|
|
|
section "Analyzer"
|
|
|
|
# shellcheck disable=SC2046
|
|
install_packages $(list_packages "$SCRIPT_DIR/analyzer")
|
|
|
|
install_python_app "$SCRIPT_DIR/analyzer"
|
|
link_python_app libretime-analyzer
|
|
|
|
info "creating libretime-analyzer working directory"
|
|
mkdir_and_chown "$LIBRETIME_USER" "$WORKING_DIR/analyzer"
|
|
|
|
install_service "libretime-analyzer.service" "$SCRIPT_DIR/analyzer/install/systemd/libretime-analyzer.service"
|
|
|
|
# Install Worker
|
|
########################################################################################
|
|
|
|
section "Worker"
|
|
|
|
install_python_app "$SCRIPT_DIR/worker"
|
|
|
|
info "creating libretime-worker working directory"
|
|
mkdir_and_chown "$LIBRETIME_USER" "$WORKING_DIR/worker"
|
|
|
|
install_service "libretime-worker.service" "$SCRIPT_DIR/worker/install/systemd/libretime-worker.service"
|
|
|
|
# Install Legacy
|
|
########################################################################################
|
|
|
|
section "Legacy"
|
|
|
|
install_composer() {
|
|
install_packages unzip
|
|
|
|
curl -sS https://composer.github.io/installer.sig > installer.sig
|
|
echo " composer-setup.php" >> installer.sig
|
|
|
|
curl -sS https://getcomposer.org/installer > composer-setup.php
|
|
|
|
if ! sha384sum installer.sig; then
|
|
rm -f composer-setup.php
|
|
error "invalid composer-setup.php checksum"
|
|
fi
|
|
|
|
php -f composer-setup.php -- \
|
|
--install-dir=/usr/local/bin \
|
|
--filename=composer \
|
|
--quiet
|
|
|
|
rm -f composer-setup.php installer.sig
|
|
}
|
|
|
|
# shellcheck disable=SC2046
|
|
install_packages $(list_packages "$SCRIPT_DIR/legacy")
|
|
|
|
if ! command -v "composer" > /dev/null; then
|
|
info "installing Composer"
|
|
install_composer
|
|
fi
|
|
|
|
info "building libretime-legacy files"
|
|
make -C legacy build
|
|
cp "$SCRIPT_DIR/VERSION" "$SCRIPT_DIR/legacy/"
|
|
|
|
info "deploying libretime-legacy files"
|
|
if $LIBRETIME_INSTALL_IN_PLACE; then
|
|
LEGACY_WEB_ROOT="$SCRIPT_DIR/legacy"
|
|
else
|
|
if [[ -d "$LEGACY_WEB_ROOT" ]]; then
|
|
info "cleaning old libretime-legacy files"
|
|
rm -Rf "$LEGACY_WEB_ROOT"
|
|
fi
|
|
|
|
mkdir_and_chown "$LIBRETIME_USER" "$LEGACY_WEB_ROOT"
|
|
cp -R "$SCRIPT_DIR/legacy/." "$LEGACY_WEB_ROOT"
|
|
chown -R "$LIBRETIME_USER:$LIBRETIME_USER" "$LEGACY_WEB_ROOT"
|
|
fi
|
|
|
|
PHP_VERSION="$(php-config --version | awk -F . '{ print $1 "." $2 }')"
|
|
|
|
info "deploying libretime-legacy php-fpm config"
|
|
template_file cp_if_different \
|
|
"$SCRIPT_DIR/legacy/install/php-fpm/libretime-legacy.conf" \
|
|
"/etc/php/$PHP_VERSION/fpm/pool.d/libretime-legacy.conf" \
|
|
sed \
|
|
-e "s|@@DEFAULT_WEB_USER@@|${DEFAULT_WEB_USER}|g" \
|
|
-e "s|@@USER@@|${LIBRETIME_USER}|g"
|
|
|
|
info "deploying libretime-legacy logrotate config"
|
|
template_file cp_if_different \
|
|
"$SCRIPT_DIR/legacy/install/logrotate/libretime-legacy.conf" \
|
|
"/etc/logrotate.d/libretime-legacy" \
|
|
sed \
|
|
-e "s|@@LOG_DIR@@|${LOG_DIR}|g" \
|
|
-e "s|@@USER@@|${LIBRETIME_USER}|g"
|
|
|
|
# Install Nginx
|
|
########################################################################################
|
|
|
|
section "Nginx"
|
|
|
|
if $is_first_install; then
|
|
install_packages nginx
|
|
|
|
info "disabling nginx default site"
|
|
rm -f "/etc/nginx/sites-enabled/default"
|
|
fi
|
|
|
|
info "deploying libretime nginx config"
|
|
template_file cp_if_different \
|
|
"${SCRIPT_DIR}/installer/nginx/libretime.conf" \
|
|
"/etc/nginx/sites-available/libretime.conf" \
|
|
sed \
|
|
-e "s|@@LISTEN_PORT@@|${LIBRETIME_LISTEN_PORT}|g" \
|
|
-e "s|@@LEGACY_WEB_ROOT@@|${LEGACY_WEB_ROOT}|g" \
|
|
-e "s|@@STORAGE_PATH@@|${LIBRETIME_STORAGE_PATH}|g"
|
|
|
|
info "enabling libretime nginx config"
|
|
ln -s --force \
|
|
"/etc/nginx/sites-available/libretime.conf" \
|
|
"/etc/nginx/sites-enabled/libretime.conf"
|
|
|
|
# Finalize
|
|
########################################################################################
|
|
|
|
if $is_first_install; then
|
|
section "Finalize"
|
|
info "moving config file in place"
|
|
mv "$CONFIG_TMP_FILEPATH" "$CONFIG_FILEPATH"
|
|
fi
|
|
|
|
# Services
|
|
########################################################################################
|
|
|
|
section "Services"
|
|
|
|
install_service "libretime.target" "$SCRIPT_DIR/installer/systemd/libretime.target"
|
|
|
|
systemctl daemon-reload
|
|
|
|
service_restart_if_active "php$PHP_VERSION-fpm"
|
|
service_restart_if_active "nginx"
|
|
|
|
# Instructions
|
|
########################################################################################
|
|
|
|
if $is_first_install; then
|
|
section "Instructions"
|
|
printf "
|
|
${yellow}\
|
|
To finalize the installation process, start by editing your configuration file $CONFIG_FILEPATH.
|
|
|
|
Once configured, run the following command to setup the database:
|
|
|
|
${cyan}\
|
|
$ sudo -u $LIBRETIME_USER libretime-api migrate
|
|
|
|
${yellow}\
|
|
Finally, start LibreTime using the following command:
|
|
|
|
${cyan}\
|
|
$ sudo systemctl start libretime.target
|
|
|
|
${reset}"
|
|
|
|
else
|
|
printf "
|
|
${yellow}\
|
|
Once upgraded, run the following command to migrate the database:
|
|
|
|
${cyan}\
|
|
$ sudo -u $LIBRETIME_USER libretime-api migrate
|
|
|
|
${yellow}\
|
|
You can restart LibreTime using the following command:
|
|
|
|
${cyan}\
|
|
$ sudo systemctl restart libretime.target
|
|
|
|
${reset}"
|
|
fi
|