Funkwhale
Обновлено 20 января 2022
Введение
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:
ev5pFTw2gV4TEOeAmCwDZB87qGeFgvsHxUJt5A7c4SNfgP1HEZMxM5hz/mw+
Выполните настройку конфигурационного файла для хоста music.example.org:
# 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
Создайте суперпользователя:
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:
#!/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:
#!/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:
#!/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, необходимо сменить 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 перегенерируйте миниатюры изображений обложок:
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