libretime/install

754 lines
22 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.
--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:-"80"}
# > Public URL for LibreTime.
LIBRETIME_PUBLIC_URL=${LIBRETIME_PUBLIC_URL:-}
# > 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
;;
--in-place | -i)
LIBRETIME_INSTALL_IN_PLACE=true
shift 1
;;
--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
PYTHON="python3"
PIP="$PYTHON -m pip"
DEFAULT_WEB_USER="www-data"
# Paths
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"
STORAGE_DIR="/srv/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
}
# cp_if_different <src> <dest>
cp_if_different() {
if [[ -f "$2" ]] && diff -q "$1" "$2" > /dev/null; then
return
fi
backup_if_exists "$2"
cp "$1" "$2"
}
# template_file <src> <dest> <render...>
template_file() {
src="$1"
dest="$2"
shift 2
tmp_file=$(mktemp)
"$@" "$src" > "$tmp_file"
cp_if_different "$tmp_file" "$dest"
rm "$tmp_file"
}
# set_config <value> <key...>
set_config() {
value="${1}" && shift
# Build sed query
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"
$PIP install "$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!"
template_file "$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|@@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
is_centos=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
debian-10) is_debian=true && distro="buster" ;;
debian-11) is_debian=true && distro="bullseye" ;;
ubuntu-18.04) is_ubuntu=true && distro="bionic" ;;
ubuntu-20.04) is_ubuntu=true && distro="focal" ;;
centos-8) is_centos=true && distro="centos8" ;;
*)
error << "EOF"
could not determine supported distribution "$ID-$VERSION_ID"!
Ubuntu Xenial is archived and does not receive any security or other updates since
2021-04-01, support for installing LibreTime on Xenial has dropped since 3.0.0-alpha.10.
Debian Stretch is archived and does not receive any security or other updates since
2020-06-06, support for installing LibreTime on Stretch has dropped since 3.0.0-alpha.10.
Debian Jessie is archived and does not receive any security or other updates since
2018-05-17, support for installing LibreTime on Jessie has dropped since 3.0.0-alpha.8.
EOF
exit 1
;;
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
}
# Prepare
########################################################################################
# Make sure only root can run our script
(($( id -u) == 0)) || error "this script must be run as root!"
banner
check_distribution
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 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"
# TODO: Config dir should not be owned by www-data and should be readonly
mkdir_and_chown "$LIBRETIME_USER" "$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"
if [[ -n "$LIBRETIME_PUBLIC_URL" ]]; then
set_config "$LIBRETIME_PUBLIC_URL" general public_url
fi
set_config "$(generate_random_password)" general api_key
mkdir_and_chown "$LIBRETIME_USER" "$STORAGE_DIR"
set_config "$STORAGE_DIR" storage path
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 -u postgres psql --csv --tuples-only --command='\du' | grep -qw "^$LIBRETIME_POSTGRESQL_USER"; then
info "creating PostgreSQL user '$LIBRETIME_POSTGRESQL_USER'"
sudo -u postgres createuser "$LIBRETIME_POSTGRESQL_USER"
sudo -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 -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 -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 list_users --quiet | 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 list_vhosts --quiet | 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"
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" icecast admin_password
# set_config "$LIBRETIME_ICECAST_SOURCE_PASSWORD" icecast source_password
fi
fi
# Prepare python
########################################################################################
section "Python3"
install_packages python3 python3-pip
info "upgrading python3 tools"
$PIP install --upgrade setuptools~=58.0
# Install Shared and API client
########################################################################################
section "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")
# TODO: Remove when Bionic support is dropped
if [[ $distro == "bionic" ]]; then
info "installing gunicorn"
$PIP install \
'gunicorn' \
'uvicorn>=0.16.0,<0.17'
ln -sf /usr/local/bin/gunicorn /usr/bin/gunicorn
fi
install_python_app "$SCRIPT_DIR/api[prod]"
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"
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 "$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"
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 "$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 "$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"
install_packages nginx
info "disabling nginx default site"
rm -f "/etc/nginx/sites-enabled/default"
info "deploying libretime nginx config"
template_file "${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"
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}\
Run the following command to configure the default icecast passwords in the database:
${cyan}\
$ sudo libretime-api set_icecast_passwords --from-icecast-config
${yellow}\
Finally, start LibreTime using the following command:
${cyan}\
$ sudo systemctl start libretime.target
${reset}"
else
printf "
${yellow}\
You can restart LibreTime using the following command:
${cyan}\
$ sudo systemctl restart libretime.target
${reset}"
fi