#!/usr/bin/env bash # # NOTE! THIS HAS ALREADY BEEN SUPERCEEDED BY NEW WORK! # # It's in testing now and I'll replace this ASAP! # set -eu red='\e[0;31m' yellow='\e[1;33m' cyan='\e[0;36m' reset='\e[0m' # Something like this may be useful, but the arg parsing should come early! trace=1 function trace { if [ -n "$trace" ] ; then echo "$@" fi } # Unique fedora stuff here: # installed_fedora_packages= 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" # RT: WORKING_DIR="/nfs/fs1/Streaming/Platforms/LibreTime" LOG_DIR="/var/log/libretime" STORAGE_DIR="/srv/libretime" # STORAGE_DIR="/nfs/fs1/Streaming/Platforms/LibreTime" LEGACY_WEB_ROOT="/usr/share/libretime/legacy" # LEGACY_WEB_ROOT="/users/www/TheTroyPress/http/abs" SERVICE_DIR="/usr/lib/systemd/system" # command_exist 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 mkdir_and_chown() { mkdir -p "$2" chown -R "$1:$1" "$2" } # backup_if_exists 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 cp_if_different() { if [[ -f "$2" ]] && diff -q "$1" "$2" > /dev/null; then return fi backup_if_exists "$2" cp "$1" "$2" } # template_file 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 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 install_python_app() { info "installing python app from $1" $PIP install \ --upgrade \ --upgrade-strategy only-if-needed \ "$1" } # install_service # # 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!" # TODO: Remove when Bionic support is dropped if [[ $distro == "bionic" ]]; then mkdir -p "$SERVICE_DIR" fi 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" # TODO: Remove when Bionic support is dropped if [[ $distro == "bionic" ]]; then for feature in ProtectClock ProtectHostname ProtectKernelLogs ProtectProc; do sed -i -e "s|^${feature}=|#${feature}=|" "$service_dest" done fi chmod 0644 "$service_dest" chown root:root "$service_dest" systemctl enable "$service_name" } # service_restart_if_active 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_fedora=false distro="unknown" ID= # Note that VERSION ID is declared an int in /etc/os-release declare -i VERSION_ID=0 declare -i default_version=0 function get_distribution_data() { if [[ -f "/etc/os-release" ]]; then source "/etc/os-release" else if [ -n "$(which hostnamectl >/dev/null)" ] ; then ID=$(hostnamectl | grep "Operating" | cut -f 2 -d ":" | cut -f 2 -d " " | tr [:upper:] [:lower:]) VERSION_ID=$(hostnamectl | grep "Operating" | cut -f 2 -d ":" | cut -f 4 -d " ") else warning "We can't determine which distribution this is." info "" fi fi } function check_distribution() { get_distribution_data case $ID in debian) is_debian=true # Maintainers update this: default_version=11 case $VERSION_ID in 10) distro="buster" ;; 11) distro="bullseye" ;; *) warning "Unknown version for $ID: $VERSION_ID" warning "Proceeding as the youngest version we know of: $default_version" VERSION_ID=$default_version ;; esac ;; fedora) set +eu PIP=fedora_PIP is_fedora=true # Fedora isn't known for variations by version yet. If it ever does, # then add in a case statement... # And, don't forget a default version for Maintainers to update... # default_version=35 # distro=$(hostnamectl | grep "Operating" | cut -f 2 -d "(" | cut -f 1 -d ")") ;; ubuntu) is_ubuntu=true # Maintainers update this: default_version=20.04 case $VERSION_ID in 18.04) distro="bionic" ;; 20.04) distro="focal" ;; *) warning "Unknown version for $ID: $VERSION_ID" warning "Proceeding as the youngest version we know of: $default_version" VERSION_ID=$default_version ;; esac ;; *) warning "Unrecognized distribution type: $ID - this is not supported." ;; esac trace "Is: ID: $ID, VERSION_ID: $VERSION_ID, distro: $distro" } check_distribution_old() { 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" ;; *) error << "EOF" could not determine supported distribution "$ID-$VERSION_ID"! 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. EOF exit 1 ;; esac } # list_packages 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 function fedora_postgres_install() { trace "Installing: $1" if [ "$1" == "postgresql" ] ; then dnf install posgresql-server else if [ "$1" == "postgresql-client" ] ; then dnf install postgresql postgresql-contrib postgresql-docs postgresql-ip4r postgresql-jdbc postgresql-jdbc-javadoc postgresql-llvmjit postgresql-odbc postgresql-plperl postgresql-plpython3 postgresql-pltcl else dnf install "$1" fi fi } function fedora_PIP() { su $LIBRETIME_USER -c $PYTHON -m pip "$@" } function install_packages() { case "$ID" in debian) DEBIAN_FRONTEND=noninteractive apt-get -qq -y install "$@" ;; fedora) trace "at: $@" for arg in $@ do pkg=$(echo "$arg" | tr [:upper:] [:lower:] ) if [ "$pkg" == "postgresql" ] || [ "$pkg" == "postgresql-client" ] ; then fedora_postgres_install "$pkg" else status=$(rpm -q $pkg) trace "$status" if [ -z "$(echo "$status" | grep -v "package $pkg")" ] ; then info "Installing $pkg" dnf install "$pkg" else info "Package $pkg is already installed: $status" fi fi done ;; ubuntu) DEBIAN_FRONTEND=noninteractive apt-get -qq -y install "$@" ;; *) warning "installing dependencies is not supported for this distribution" ;; esac } install_packages_old() { 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" 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 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 # TODO: Swap lines when Bionic support is dropped # if ! sudo -u postgres psql --csv --tuples-only --command='\du' | grep -qw "^$LIBRETIME_POSTGRESQL_USER"; then if ! sudo -u postgres psql --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 # TODO: Swap lines when Bionic support is dropped # if ! sudo -u postgres psql --csv --tuples-only --list | grep -qw "^$LIBRETIME_POSTGRESQL_DATABASE"; then if ! sudo -u postgres psql --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 # TODO: Swap lines when Bionic support is dropped # if ! rabbitmqctl --quiet list_users | grep -qw "^$LIBRETIME_RABBITMQ_USER"; then if ! rabbitmqctl -q 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 # TODO: Swap lines when Bionic support is dropped # if ! rabbitmqctl --quiet list_vhosts | grep -qw "^$LIBRETIME_RABBITMQ_VHOST"; then if ! rabbitmqctl -q 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 # TODO: Remove when Bionic support is dropped if [[ $distro == "bionic" ]]; then sed --in-place -e "s|^ENABLE=.*$|ENABLE=true|" /etc/default/icecast2 fi systemctl start icecast2 if $is_first_install; then icecast_config_filepath="/etc/icecast2/icecast.xml" sed --in-place \ -e "s|[^<]*|${LIBRETIME_ICECAST_ADMIN_PASSWORD}|" \ -e "s|[^<]*|${LIBRETIME_ICECAST_SOURCE_PASSWORD}|" \ -e "s|[^<]*|${LIBRETIME_ICECAST_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 info "upgrading python3 tools" $PIP install --upgrade setuptools~=58.0 # 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") # 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" # TODO: Remove when Bionic support is dropped if [[ $distro == "bionic" ]]; then ln -sf /bin/sh /usr/bin/sh fi 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}\ 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