Funkwhale
Updated 20 Janvier 2022
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 :
ev5pFTw2gV4TEOeAmCwDZB87qGeFgvsHxUJt5A7c4SNfgP1HEZMxM5hz/mw+
Editez le fichier de configuration pour 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
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 :
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 :
#!/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 :
#!/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 :
#!/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 :
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 :
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