#!/usr/bin/env bash # Copyright (c) 2021-2024 tteck # Author: tteck (tteckster) # License: MIT # https://github.com/tteck/Proxmox/raw/main/LICENSE source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors setting_up_container network_check update_os msg_info "Installing Python3" $STD apt-get install -y --no-install-recommends \ python3 \ python3-dev \ python3-setuptools \ python3-venv msg_ok "Installed Python3" msg_info "Installing Dependencies (Patience)" $STD apt-get install -y --no-install-recommends \ redis \ postgresql \ postgresql-contrib \ postgresql-client \ build-essential \ gnupg \ ffmpeg \ libjpeg-dev \ libpq-dev \ libmagic-dev \ libzbar0 \ poppler-utils \ automake \ libtool \ pkg-config \ curl \ libtiff-dev \ libpng-dev \ libleptonica-dev \ sudo \ make \ mc msg_ok "Installed Dependencies" msg_info "Setup Funkwhale Dependencies (Patience)" export FUNKWHALE_VERSION=1.4.0 $STD sudo apt install -y --no-install-recommends $(curl https://dev.funkwhale.audio/funkwhale/funkwhale/-/raw/$FUNKWHALE_VERSION/deploy/requirements.apt) $STD sudo useradd --system --shell /bin/bash --create-home --home-dir /opt/funkwhale funkwhale cd /opt/funkwhale $STD sudo mkdir -p config api data/static data/media data/music front $STD sudo chown -R funkwhale:funkwhale data msg_ok "Initial Setup complete" msg_ok "Download Funkwhale API" $STD sudo curl -L -o "api-$FUNKWHALE_VERSION.zip" "https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/$FUNKWHALE_VERSION/download?job=build_api" $STD sudo unzip -q "api-$FUNKWHALE_VERSION.zip" -d extracted $STD sudo mv extracted/api/* api/ $STD sudo rm -rf extracted api-$FUNKWHALE_VERSION.zip msg_ok "Downloaded and extracted Funkwhale API" msg_info "Download Funkwhale Frontend" $STD sudo curl -L -o "front-$FUNKWHALE_VERSION.zip" "https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/$FUNKWHALE_VERSION/download?job=build_front" $STD sudo unzip -q "front-$FUNKWHALE_VERSION.zip" -d extracted $STD sudo mv extracted/front . $STD sudo rm -rf extracted front-$FUNKWHALE_VERSION.zip msg_ok "Downloaded and extracted Funkwhale Frontend" msg_info "Install Funkwhale API and DJANGO" cd /opt/funkwhale $STD sudo python3 -m venv venv $STD sudo venv/bin/pip install --upgrade pip wheel $STD sudo venv/bin/pip install --editable ./api $STD sudo curl -L -o /opt/funkwhale/config/.env "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/env.prod.sample" secret_key=$(openssl rand -base64 45 | sed 's/\//\\\//g') sudo sed -i "s/DJANGO_SECRET_KEY=.*/DJANGO_SECRET_KEY=$secret_key/" /opt/funkwhale/config/.env sudo sed -i 's/# CACHE_URL=redis:\/\/127.0.0.1:6379\/0/CACHE_URL=redis:\/\/127.0.0.1:6379\/0/' /opt/funkwhale/config/.env #Remove #Hashtag From Config for Debian sudo sed -i 's/# DATABASE_URL=postgresql:\/\/funkwhale@:5432\/funkwhale/DATABASE_URL=postgresql:\/\/funkwhale@:5432\/funkwhale/' /opt/funkwhale/config/.env #Remove #Hashtag From Config for Debian # set the paths to /opt instead of /srv sudo sed -i 's/MEDIA_ROOT=\/srv\/funkwhale\/data\/media/MEDIA_ROOT=\/opt\/funkwhale\/data\/media/' /opt/funkwhale/config/.env sudo sed -i 's/STATIC_ROOT=\/srv\/funkwhale\/data\/static/STATIC_ROOT=\/opt\/funkwhale\/data\/static/' /opt/funkwhale/config/.env sudo sed -i 's/MUSIC_DIRECTORY_PATH=\/srv\/funkwhale\/data\/music/MUSIC_DIRECTORY_PATH=\/opt\/funkwhale\/data\/music/' /opt/funkwhale/config/.env sudo sed -i 's/MUSIC_DIRECTORY_SERVE_PATH=\/srv\/funkwhale\/data\/music/MUSIC_DIRECTORY_SERVE_PATH=\/opt\/funkwhale\/data\/music/' /opt/funkwhale/config/.env sudo sed -i 's/FUNKWHALE_FRONTEND_PATH=\/srv\/funkwhale\/front\/dist/FUNKWHALE_FRONTEND_PATH=\/opt\/funkwhale\/front\/dist/' /opt/funkwhale/config/.env sudo chown funkwhale:funkwhale /opt/funkwhale/config/.env sudo chmod 600 /opt/funkwhale/config/.env msg_ok "Environment successfully set up" msg_info "Setting up Database" DB_NAME=funkwhale DB_USER=funkwhale DB_EXTENSION_UNACCENT=unaccent DB_EXTENSION_CITEXT=citext DB_PASS="$(openssl rand -base64 18 | cut -c1-13)" SECRET_KEY="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)" $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" $STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" echo "" >>~/funkwhale.creds echo -e "Funkwhale Database User: \e[32m$DB_USER\e[0m" >>~/funkwhale.creds echo -e "Funkwhale Database Password: \e[32m$DB_PASS\e[0m" >>~/funkwhale.creds echo -e "Funkwhale Database Name: \e[32m$DB_NAME\e[0m" >>~/funkwhale.creds $STD sudo -u postgres psql -c "CREATE EXTENSION $DB_EXTENSION_UNACCENT;" $STD sudo -u postgres psql -c "CREATE EXTENSION $DB_EXTENSION_CITEXT;" cd /opt/funkwhale $STD sudo -u funkwhale venv/bin/funkwhale-manage migrate msg_ok "Set up PostgreSQL database" msg_info "Setting up Funkwhale and systemd" FUNKWHALE_USER=funkwhale_su FUNKWHALE_MAIL=mail@example.com FUNKWHALE_PASS="$(openssl rand -base64 18 | cut -c1-13)" echo -e "Funkwhale Superuser: \e[32m$FUNKWHALE_USER\e[0m" >>~/funkwhale.creds echo -e "Funkwhale Mail: \e[32m$FUNKWHALE_MAIL\e[0m" >>~/funkwhale.creds echo -e "Funkwhale Superuser Password: \e[32m$FUNKWHALE_PASS\e[0m" >>~/funkwhale.creds $STD sudo -u funkwhale venv/bin/funkwhale-manage fw users create --superuser --username $FUNKWHALE_USER --email $FUNKWHALE_MAIL --password $FUNKWHALE_PASS $STD sudo venv/bin/funkwhale-manage collectstatic $STD sudo curl -L -o "/etc/systemd/system/funkwhale.target" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale.target" $STD sudo curl -L -o "/etc/systemd/system/funkwhale-server.service" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale-server.service" $STD sudo curl -L -o "/etc/systemd/system/funkwhale-worker.service" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale-worker.service" $STD sudo curl -L -o "/etc/systemd/system/funkwhale-beat.service" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale-beat.service" $STD sudo systemctl daemon-reload $STD sudo systemctl start funkwhale.target $STD sudo systemctl enable --now funkwhale.target msg_ok "Funkwhale successfully set up" read -r -p "Would you like to Setup Reverse Proxy (Nginx)? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Installing NGINX" $STD apt install -y nginx sudo su $STD curl -L -o /etc/nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale_proxy.conf" $STD curl -L -o /etc/nginx/sites-available/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/nginx.template" $STD set -a && source /opt/funkwhale/config/.env && set +a envsubst "`env | awk -F = '{printf \" $%s\", $$1}'`" \ < /etc/nginx/sites-available/funkwhale.template \ > /etc/nginx/sites-available/funkwhale.conf $STD grep '${' /etc/nginx/sites-available/funkwhale.conf $STD ln -s /etc/nginx/sites-available/funkwhale.conf /etc/nginx/sites-enabled/ $STD systemctl reload nginx msg_ok "Installed Nginx" fi read -r -p "Would you like to Setup TLS (Certbot)? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Installing Certbot" $STD apt install -y certbot python3-certbot-nginx $STD sudo certbot --nginx -d $FUNKWHALE_HOSTNAME msg_ok "Installed Certbot" fi motd_ssh customize msg_info "Cleaning up" $STD apt-get autoremove $STD apt-get autoclean msg_ok "Cleaned"