Funkwhale

Updated 20 Janvier 2022

Installer et configurer Funkwhale

Introduction

Funkwhale est un projet communautaire qui vous permet d'écouter et de partager de la musique sur un réseau distribué et open.

Préparer un conteneur LXC

Nous conseillons d'installer Funkwhale dans un conteneur dédié, après l'avoir configuré selon le manuel.

Installer et configurer PostgreSQL

Installez et configurez PostgreSQL conformément au manuel. Dans l'exemple, remplacez dbtest par funkwhale, et l'utilisateur test par funkwhale également.

Ajouter des extensions pour la base de données sous postgres :

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

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

Installer les paquets système

Veuillez installer les logiciels nécessaires :

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

Démarrer Redis

Lancez Redis et ajoutez-le au démarrage automatique :

/etc/init.d/redis start

rc-update add redis

Ajouter un compte utilisateur

Ajoutez l'utilisateur funkwhale :

mkdir -p /var/calculate/www

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

Connectez-vous en tant que funkwhale :

su - -s /bin/bash funkwhale

Créez les répertoires nécessaires :

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

Télécharger le code source Funkwhale

Téléchargez et décompressez la dernière version de l'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

Téléchargez et décompressez la dernière version du front-end :

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

Installer les dépendances de Python

Créez un environnement virtuel :

python3 -m venv virtualenv

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

source virtualenv/bin/activate

Vous pouvez maintenant installer les dépendances Python :

pip install wheel

pip install -r api/requirements.txt

Configurer Funkwhale

Téléchargez le fichier de configuration et définissez les droits d'accès :

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

chmod 600 ~/config/.env

Créez une clé privée pour Django :

openssl rand -base64 45
ev5pFTw2gV4TEOeAmCwDZB87qGeFgvsHxUJt5A7c4SNfgP1HEZMxM5hz/mw+

Editez le fichier de configuration pour 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

Initialisez la base de données :

python api/manage.py migrate

Mettez à jour les fichiers statiques :

python api/manage.py collectstatic

Créez le super-utilisateur :

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

Sortir sous funkwhale :

exit

Obtenir un certificat Let's Encrypt

Obtenez le certificat de domaine music.example.org pour Nginx, comme expliqué dans le manuel.

Installation et configuration de Nginx

Installez et configurez le serveur web Nginx en tant que proxy inverse, conformément au manuel.

Récupérer le modèle de configuration de Funkwhale pour 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"

Utilisez le modèle pour configurer 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

Lancer Funkwhale

Créez des scripts OpenRC permettant de gérer les services.

Ci-dessous le script permettant de démarrer le serveur Funkwhale :

/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
}

Voici le script celery worker de Funkwhale :

/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
}

Voici le script beat de Funkwhale :

/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
}

Définissez les autorisations d'accès aux services de Funkwhale :

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

Lancez les services Funkwhale :

/etc/init.d/funkwhale-beat start

/etc/init.d/funkwhale-server start

/etc/init.d/funkwhale-worker start

Ajoutez les services Funkwhale à la liste de démarrage automatique :

rc-update add funkwhale-beat

rc-update add funkwhale-server

rc-update add funkwhale-worker

Mettre à jour Funkwhale

D'abord, les services Funkwhale :

/etc/init.d/funkwhale-beat stop

/etc/init.d/funkwhale-server stop

/etc/init.d/funkwhale-worker stop

Si nécessaire, passez manuellement d'une version à l'autre :

Passage à la version 1.1.4

Pour passer à la version 1.1.4, remplacez le nom du serveur WSGI, daphne, par 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

Mettre à jour l'interface utilisateur

Connectez-vous en tant que funkwhale.

su - -s /bin/bash funkwhale

Téléchargez l'archive de la dernière version du front-end (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"

Supprimez le front-end actuel et remplacez-le par le nouveau, à extraire de l'archive :

rm -r front

unzip -o front-${FUNKWHALE_VERSION}.zip

rm front-${FUNKWHALE_VERSION}.zip

Mettre à jour l'API

Téléchargez l'archive de la dernière version de l'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"

Supprimez l'API actuelle et récupérez la nouvelle dans le répertoire du projet :

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

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

rm -rf extracted

rm api-${FUNKWHALE_VERSION}.zip

Mettez à jour les dépendances de Python

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

Actualisez les fichiers statiques du projet :

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

Procédez à la migration de la base de données :

virtualenv/bin/python api/manage.py migrate

Si nécessaire, passez manuellement d'une version à l'autre :

Passage à la version 1.0

Au moment de passer à la version 1.0, rescannez les vignettes :

rm -r data/media/__sized__

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

Déconnectez-vous en tant que funkwhale et lancez les services Funkwhale.

exit

/etc/init.d/funkwhale-beat start

/etc/init.d/funkwhale-server start

/etc/init.d/funkwhale-worker start

Actualiser la configuration Nginx

Obtenez le dernier modèle de configuration de Funkwhale (1.2.1) pour 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"

Utilisez le modèle pour configurer 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

Pour les certificats provenant de /etc/nginx/ssl, remplacez /etc/letsencrypt/live par le nouveau fichier funkwhale.conf :

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

Rechargez les paramètres de Nginx pour que les modifications prennent effet :

/etc/init.d/nginx reload

Restaurer l'environnement Python après une mise à jour

Connectez-vous en tant que funkwhale :

su - -s /bin/bash funkwhale

Désactivez l'ancien environnement virtuel puis supprimez-le :

deactivate

rm -rf ~/virtualenv

Créez un nouvel environnement virtuel :

python3 -m venv virtualenv

source virtualenv/bin/activate

Vous pouvez maintenant installer les dépendances Python :

pip install wheel

pip install -r api/requirements.txt