Funkwhale

Обновлено 20 января 2022

Установка и настройка Funkwhale

Введение

Funkwhale - это проект, разрабатываемый сообществом, который позволяет вам слушать и обмениваться музыкой в децентрализованной, открытой сети.

Подготовка LXC-контейнера

Мы рекомендуем выполнить установку Funkwhale в отдельном контейнере, настроив его согласно инструкции.

Установка и настройка PostgreSQL

Установите и настройте PostgreSQL согласно руководству. Вместо базы данных dbtest из примера создайте базу funkwhale, а вместо пользователя test создайте funkwhale.

От пользователя postgres добавьте для базы расширения:

psql -U postgres funkwhale -c 'CREATE EXTENSION "unaccent";'

psql -U postgres funkwhale -c 'CREATE EXTENSION "citext";'

Установка системных пакетов

Установите вспомогательное программное обеспечение:

emerge -a dev-db/redis app-arch/unzip media-video/ffmpeg media-libs/libjpeg-turbo dev-libs/libpqxx net-nds/openldap sys-devel/gettext

Запуск Redis

Запустите Redis и добавьте его в автозагрузку:

/etc/init.d/redis start

rc-update add redis

Создание системного пользователя

Создайте системного пользователя funkwhale:

mkdir -p /var/calculate/www

useradd -r -s /sbin/nologin -d /var/calculate/www/funkwhale -m funkwhale

Залогиньтесь новым пользователем:

su - -s /bin/bash funkwhale

Создайте необходимые каталоги:

mkdir -p config api data/static data/media data/music front

Загрузка исходного кода Funkwhale

Скачайте и распакуйте последний релиз API:

export FUNKWHALE_VERSION="1.2.1"

curl -L -o "api-$FUNKWHALE_VERSION.zip" "https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/$FUNKWHALE_VERSION/download?job=build_api"

unzip "api-$FUNKWHALE_VERSION.zip" -d extracted

mv extracted/api/* api/

rm -rf extracted

rm api-${FUNKWHALE_VERSION}.zip

Скачайте и распакуйте последний релиз фронтэнда:

curl -L -o "front-$FUNKWHALE_VERSION.zip" "https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/$FUNKWHALE_VERSION/download?job=build_front"

unzip "front-$FUNKWHALE_VERSION.zip" -d extracted

mv extracted/front .

rm -rf extracted

rm front-${FUNKWHALE_VERSION}.zip

Установка Python-зависимостей

Создайте виртуальное окружение:

python3 -m venv virtualenv

echo 'source ~/virtualenv/bin/activate' >> ~/.bashrc

source virtualenv/bin/activate

Установите Python-зависимости:

pip install wheel

pip install -r api/requirements.txt

Настройка Funkwhale

Скачайте файл настроек и выставите права:

curl -L -o ~/config/.env "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/master/deploy/env.prod.sample"

chmod 600 ~/config/.env

Сгенерируйте секретный ключ для Django:

openssl rand -base64 45
ev5pFTw2gV4TEOeAmCwDZB87qGeFgvsHxUJt5A7c4SNfgP1HEZMxM5hz/mw+

Выполните настройку конфигурационного файла для хоста music.example.org:

~/config/.env
# Replace this by the definitive, public domain you will use for
# your instance
FUNKWHALE_HOSTNAME=music.example.org
FUNKWHALE_PROTOCOL=https
...
EMAIL_CONFIG=smtp://mail.example.org:25
# The email address to use to send system emails.
DEFAULT_FROM_EMAIL=support@example.org
...
# API/Django configuration

# Database configuration
# Examples:
#  DATABASE_URL=postgresql://<user>:<password>@<host>:<port>/<database>
#  DATABASE_URL=postgresql://funkwhale:passw0rd@localhost:5432/funkwhale_database
# Use the next one if you followed Debian installation guide
DATABASE_URL=postgresql://funkwhale:secret@localhost:5432/funkwhale

# Cache configuration
# Examples:
#  CACHE_URL=redis://<host>:<port>/<database>
#  CACHE_URL=redis://localhost:6379/0c
#  With a password:
#  CACHE_URL=redis://:password@localhost:6379/0
#  (the extra semicolon is important)
# Use the next one if you followed Debian installation guide
#
CACHE_URL=redis://127.0.0.1:6379/0

# Where media files (such as album covers or audio tracks) should be stored
# on your system?
# (Ensure this directory actually exists)
MEDIA_ROOT=/var/calculate/www/funkwhale/data/media

# Where static files (such as API css or icons) should be compiled
# on your system?
# (Ensure this directory actually exists)
STATIC_ROOT=/var/calculate/www/funkwhale/data/static

# Generate one using `openssl rand -base64 45`, for example
DJANGO_SECRET_KEY=ev5pFTw2gV4TEOeAmCwDZB87qGeFgvsHxUJt5A7c4SNfgP1HEZMxM5hz/mw+

# In-place import settings
# You can safely leave those settings uncommented if you don't plan to use
# in place imports.
# Typical docker setup:
#   MUSIC_DIRECTORY_PATH=/music  # docker-only
#   MUSIC_DIRECTORY_SERVE_PATH=/srv/funkwhale/data/music
# Typical non-docker setup:
#   MUSIC_DIRECTORY_PATH=/srv/funkwhale/data/music
#   # MUSIC_DIRECTORY_SERVE_PATH= # stays commented, not needed

MUSIC_DIRECTORY_PATH=/var/calculate/www/funkwhale/data/music
MUSIC_DIRECTORY_SERVE_PATH=/var/calculate/www/funkwhale/data/music
...
FUNKWHALE_FRONTEND_PATH=/var/calculate/www/funkwhale/front/dist

Выполните инициализацию базы данных:

python api/manage.py migrate

Выполните обновление статических файлов:

python api/manage.py collectstatic

Создайте суперпользователя:

python api/manage.py createsuperuser
Username: user
Email address: user@example.org
Password: 
Password (again): 
Superuser created successfully.

Завершите работу под пользователем funkwhale:

exit

Получение сертификата Let's Encrypt

Получите сертификат домена music.example.org для Nginx согласно руководству.

Установка и настройка Nginx

Установите и настройте веб-сервер Nginx в качестве обратного прокси согласно руководству.

Получите шаблон настроек Funkwhale для Nginx:

export FUNKWHALE_VERSION="1.2.1"

curl -L -o /etc/nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale_proxy.conf"

curl -L -o /etc/nginx/sites-enabled/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/nginx.template"

Настройте Nginx, используя шаблон:

set -a && source /var/calculate/www/funkwhale/config/.env && set +a

envsubst "`env | awk -F = '{printf \" $%s\", $$1}'`" \
< /etc/nginx/sites-enabled/funkwhale.template \
> /etc/nginx/sites-enabled/funkwhale.conf

Запуск Funkwhale

Создайте сценарии OpenRC для управления сервисами.

Сценарий запуска Funkwhale server:

/etc/init.d/funkwhale-server
#!/sbin/openrc-run
# Copyright 2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

name="Funkwhale application server"
description="Funkwhale application server"
command_user=funkwhale
command=/var/calculate/www/funkwhale/virtualenv/bin/gunicorn
FUNKWHALE_API_IP=127.0.0.1
FUNKWHALE_API_PORT=5000
FUNKWHALE_WEB_WORKER=4
command_args="config.asgi:application -w ${FUNKWHALE_WEB_WORKER} -k uvicorn.workers.UvicornWorker -b ${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}"
directory=/var/calculate/www/funkwhale/api
pidfile="/run/funkwhale-server.pid"
command_background=true
output_log=/var/log/funkwhale-server.log
error_log=/var/log/funkwhale-server.log

depend() {
        use net postgresql redis
}

start_pre() {
        checkpath -f -o funkwhale -m 0600 /var/log/funkwhale-server.log
}

Сценарий запуска Funkwhale celery worker:

/etc/init.d/funkwhale-worker
#!/sbin/openrc-run
# Copyright 2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

name="Funkwhale celery worker"
description="Funkwhale celery worker"
command_user=funkwhale
command=/var/calculate/www/funkwhale/virtualenv/bin/celery
command_args="-A funkwhale_api.taskapp worker -l INFO"
directory=/var/calculate/www/funkwhale/api
pidfile="/run/funkwhale-worker.pid"
command_background=true
output_log=/var/log/funkwhale-worker.log
error_log=/var/log/funkwhale-worker.log

depend() {
        use net postgresql redis
}

start_pre() {
        checkpath -f -o funkwhale -m 0600 /var/log/funkwhale-worker.log
}

Сценарий запуска Funkwhale beat:

/etc/init.d/funkwhale-beat
#!/sbin/openrc-run
# Copyright 2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

name="Funkwhale celery beat process"
description="Funkwhale celery beat process"
command_user=funkwhale
command=/var/calculate/www/funkwhale/virtualenv/bin/celery
command_args="-A funkwhale_api.taskapp beat -l INFO"
directory=/var/calculate/www/funkwhale/api
pidfile="/run/funkwhale-beat.pid"
command_background=true
output_log=/var/log/funkwhale-beat.log
error_log=/var/log/funkwhale-beat.log

depend() {
        use net postgresql redis
}

start_pre() {
        checkpath -f -o funkwhale -m 0600 /var/log/funkwhale-beat.log
}

Установите права на запуск сервисов Funkwhale:

chmod 0755 /etc/init.d/funkwhale-*

Запустите сервисы Funkwhale:

/etc/init.d/funkwhale-beat start

/etc/init.d/funkwhale-server start

/etc/init.d/funkwhale-worker start

Добавьте сервисы Funkwhale в автозагрузку:

rc-update add funkwhale-beat

rc-update add funkwhale-server

rc-update add funkwhale-worker

Обновление Funkwhale

Остановите сервисы Funkwhale:

/etc/init.d/funkwhale-beat stop

/etc/init.d/funkwhale-server stop

/etc/init.d/funkwhale-worker stop

По необходимости выполните действия для миграции между версиями:

Миграция до версии 1.1.4

При переходе на версию 1.1.4, необходимо сменить WSGI-сервер daphne на gunicron:

sed -i 's/daphne/gunicorn/;s/command_args=.*/FUNKWHALE_WEB_WORKER=4\ncommand_args="config.asgi:application -w ${FUNKWHALE_WEB_WORKER} -k uvicorn.workers.UvicornWorker -b ${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}"/' /etc/init.d/funkwhale-server

Обновление фронтэнда

Выполните вход под пользователем funkwhale

su - -s /bin/bash funkwhale

Скачайте архив последней версии фронтэнда (1.2.1):

export FUNKWHALE_VERSION="1.2.1"

curl -L -o "front-$FUNKWHALE_VERSION.zip" "https://dev.funkwhale.audio/funkwhale/funkwhale/builds/artifacts/$FUNKWHALE_VERSION/download?job=build_front"

Удалите текущий фронтэнд и распакуйте на его место новый:

rm -r front

unzip -o front-${FUNKWHALE_VERSION}.zip

rm front-${FUNKWHALE_VERSION}.zip

Обновление API

Скачайте архив последеней версии API (1.2.1):

curl -L -o "api-$FUNKWHALE_VERSION.zip" "https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/$FUNKWHALE_VERSION/download?job=build_api"

Удалите текущий API и распакуйте новый в директорию проекта:

unzip "api-$FUNKWHALE_VERSION.zip" -d extracted

rm -rf api/ && mv extracted/api .

rm -rf extracted

rm api-${FUNKWHALE_VERSION}.zip

Обновите зависимости Python:

virtualenv/bin/pip install -r api/requirements.txt

Обновите статические файлы проекта:

virtualenv/bin/python api/manage.py collectstatic --no-input

Выполните миграцию базы данных:

virtualenv/bin/python api/manage.py migrate

По необходимости выполните действия для миграции между версиями:

Миграция до версии 1.0

При переходе на версию 1.0 перегенерируйте миниатюры изображений обложок:

rm -r data/media/__sized__

virtualenv/bin/python api/manage.py fw media generate-thumbnails

Завершите сеанс пользователя funkwhale и запустите сервисы Funkwhale

exit

/etc/init.d/funkwhale-beat start

/etc/init.d/funkwhale-server start

/etc/init.d/funkwhale-worker start

Обновление настроек Nginx

Получите шаблон настроек Funkwhale последней версии (1.2.1) для Nginx:

export FUNKWHALE_VERSION="1.2.1"

curl -L -o /etc/nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/${FUNKWHALE_VERSION}/deploy/funkwhale_proxy.conf"

curl -L -o /etc/nginx/sites-enabled/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/${FUNKWHALE_VERSION}/deploy/nginx.template"

Настройте Nginx, используя шаблон:

set -a && source /var/calculate/www/funkwhale/config/.env && set +a

envsubst "`env | awk -F = '{printf \" $%s\", $$1}'`" \
< /etc/nginx/sites-enabled/funkwhale.template \
> /etc/nginx/sites-enabled/funkwhale.conf

При использовании сертификатов из /etc/nginx/ssl, вместо /etc/letsencrypt/live, скорректируйте сгенерированный funkwhale.conf:

sed -i 's,/etc/letsencrypt/live,/etc/nginx/ssl,g' /etc/nginx/sites-enabled/funkwhale.conf

Презагрузите настройки Nginx:

/etc/init.d/nginx reload

Восстановление Python окружения после обновления на новую версию Python

Залогиньтесь funkwhale пользователем:

su - -s /bin/bash funkwhale

Выключите старое виртуальное окружение и удалите его:

deactivate

rm -rf ~/virtualenv

Создайте новое виртуальное окружение:

python3 -m venv virtualenv

source virtualenv/bin/activate

Установите Python-зависимости:

pip install wheel

pip install -r api/requirements.txt