Installer Koel sur Debian
Koel est un serveur de streaming musique écrit en PHP.
Ce guide est testé sur:
- Debian 9.0 Stretch
Ce guide est testé avec ces versions de Koel:
- 3.6.2
- 3.7.2
Pré-requis
Ce guide nécessite:
- a2tools, l'outil d'administration simplifiée d'Apache 2.
- un serveur HTTP avec support du PHP, comme décrit par Installer PHP-FPM sur Debian.
- php-tools, l'outil de configuration simplifiée de PHP.
- un serveur MySQL, comme décrit par Installer et configurer MySQL sur Debian.
- mysql-tools, l'outil d'administration simplifiée de MySQL sur l'hôte local (et l'hôte du serveur MySQL, si différent).
- Une installation globale de Composer, comme décrit par Installer Composer sur Debian.
- L'outil Yarn, comme décrit par Installer Yarn sur Debian.
Paramètres
Renseignez le nom de domaine où sera disponible l'application:
domain="music.domain.com"
Renseignez le nom d'hôte du serveur MySQL:
mysqlHost="localhost"
Si le serveur MySQL n'est pas local, l'outil mysql-tools essaiera de s'y connecter avec le client MySQL, ou, en cas d'échec de connexion, via une connexion SSH.
Renseignez le nom du certificat SSL à utiliser pour chiffrer l'application avec HTTPS (créé via la procédure Créer un certificat SSL / TLS sur Debian ou via Let's Encrypt) (optionnel, recommandé):
sslKeyName="auto"
Renseignez l'identifiant de l'utilisateur d'administration:
adminEmail="firstname.lastname@gmail.com"
Renseignez le chemin du dossier des musiques, pour configurer proprement le module X-SendFile:
musicPath="/var/lib/music"
Services tiers
Renseignez la clef d'API de Last.fm (obtenue via Get an API Account) (optionnel):
# lastfmApiKey="d5df942424c71b754e54ce1832505ae2"
# lastfmApiSecret="34f7c61a85732099bfbf2e3e1c0457d3"
Renseignez la clef d'API de Youtube (obtenue via la création d'un nouveau Projet Google avec l'API YouTube Data API v3):
# youtubeApiKey="AIzaMlDZrElkLoLfAdIvJsLwgbUYgDWzyPl732E"
Installation
Détectez le proxy de commande (command ou sudo):
cmdProxy='command'
command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'
Déterminez le chemin d'installation:
installPath="/var/lib/koel/${domain}"
Déterminez l'utilisateur pour l'utilisation de composer:
composerUser='composer'
Détectez le nom des paquets PHP disponibles:
phpVersion='5'
if [ -n "$(command apt-cache pkgnames php-cli)" ]; then
phpVersion=''
fi
Générez un mot de passe aléatoire pour l'utilisateur 'admin':
adminPassword="$(command apg -q -a 0 -n 1 -M NCL)"
Déterminez le protocole utilisé par l'application:
proto='http'
if [[ -n "${sslKeyName}" && ( -e "/etc/ssl/private/${sslKeyName}.key" || sslKeyName = 'auto' ) ]]; then
proto='https'
fi
Assurez-vous que le dossier parent existe:
${cmdProxy} mkdir -p "${installPath}"
${cmdProxy} chown "${composerUser}" "${installPath}"
Préparation de l'environnement
Installez les logiciels nécessaires:
${cmdProxy} apt-get install php${phpVersion}-mysql php${phpVersion}-gd \
php${phpVersion}-mcrypt php${phpVersion}-mbstring php${phpVersion}-zip \
unzip git ffmpeg libapache2-mod-xsendfile inotify-tools findutils
Ajustez la limite mémoire de PHP:
${cmdProxy} php-tools --for=Koel --set=memory_limit 512M
Rechargez la configuration de PHP:
${cmdProxy} php-tools --reload
Activez les modules Apache nécessaires:
${cmdProxy} a2enmod filter setenvif deflate expires rewrite headers xsendfile
Rechargez Apache:
${cmdProxy} service apache2 force-reload
Mise en place de l'application
Téléchargez la dernière version de l'application:
sudo -u "${composerUser}" git clone 'https://github.com/phanan/koel' "${installPath}"
Assurez-vous de disposer de la dernière version de l'application:
pushd "${installPath}"
sudo -u "${composerUser}" git checkout "$(sudo -u "${composerUser}" git tag | tail -n 1)"
popd
Installez les dépendances PHP du logiciel:
sudo -u "${composerUser}" composer --working-dir="${installPath}" install
Création de la base de données
Créez la base de données:
mysqlParams="$(command mysql-tools --server="${mysqlHost}" --with-ssh \
--auto-hosts --db-prefix="koel" --create "${domain}")"
Récupérez les paramètres de la nouvelle base de données:
mysqlDb="$(echo "${mysqlParams}" | command grep -e "^MYSQL_DB" \ | cut --delimiter="=" --fields="2-")" mysqlUser="$(echo "${mysqlParams}" | command grep -e "^MYSQL_USER" \ | cut --delimiter="=" --fields="2-")" mysqlPassword="$(echo "${mysqlParams}" | command grep -e "^MYSQL_PASSWORD" \ | cut --delimiter="=" --fields="2-")" echo "${mysqlParams}"
Configuration de l'application
Mettez à jour la configuration de l'application:
sudo -u "${composerUser}" sed -i \
-e "s|DB_CONNECTION=.*|DB_CONNECTION=mysql|" \
-e "s|DB_HOST=.*|DB_HOST=${mysqlHost}|" \
-e "s|DB_DATABASE=.*|DB_DATABASE=${mysqlDb}|" \
-e "s|DB_USERNAME=.*|DB_USERNAME=${mysqlUser}|" \
-e "s|DB_PASSWORD=.*|DB_PASSWORD=${mysqlPassword}|" \
-e "s|APP_URL=.*|APP_URL=${proto}://${domain}|" \
-e "s|STREAMING_METHOD=.*|STREAMING_METHOD=x-sendfile|" \
-e "s|ADMIN_EMAIL=.*|ADMIN_EMAIL=${adminEmail}|" \
-e "s|ADMIN_NAME=.*|ADMIN_NAME=admin|" \
-e "s|ADMIN_PASSWORD=.*|ADMIN_PASSWORD=${adminPassword}|" \
-e "s|FFMPEG_PATH=.*|FFMPEG_PATH=$(which 'ffmpeg')|" \
-e "s|LASTFM_API_KEY=.*|LASTFM_API_KEY=${lastfmApiKey}|" \
-e "s|LASTFM_API_SECRET=.*|LASTFM_API_SECRET=${lastfmApiSecret}|" \
-e "s|YOUTUBE_API_KEY=.*|YOUTUBE_API_KEY=${youtubeApiKey}|" \
-e "s|MAIL_HOST=.*|MAIL_HOST=localhost|" \
"${installPath}/.env"
Affichez les informations de configuration:
echo "Username: admin
Email: ${adminEmail}
Password: ${adminPassword}
Media path: ${musicPath}"
Initialisez la base de données:
pushd "${installPath}"
sudo -u "${composerUser}" php artisan koel:init
Quittez le dossier:
popd
Autorisez la modification par le serveur des caches et emplacements de données:
while read writeablePath; do
${cmdProxy} chown -R composer:www-data "${installPath}/${writeablePath}"
${cmdProxy} chmod -R g+rw "${installPath}/${writeablePath}"
done <<< "bootstrap/cache
storage
public/img/artists
public/img/covers"
Configurez logrotate pour gérer la rotation des journaux:
${cmdProxy} tee '/etc/logrotate.d/koel' <<< \
"# Logrotate configuration file for Koel \"$(command dirname "${installPath}")/*/storage/logs/*.log\" { weekly missingok rotate 12 copytruncate compress delaycompress create 664 composer www-data
su composer www-data
}"
Mise en place de l'hôte virtuel
Créez la configuration du serveur HTTP pour le domaine:
if [[ -n "${sslKeyName}" && ( -e "/etc/ssl/private/${sslKeyName}.key" || "${sslKeyName}" = 'auto' ) ]]; then
${cmdProxy} a2tools --ssl="${sslKeyName}" --xsendfile="${musicPath}" --overrides='All' "${domain}" "${installPath}"
else
${cmdProxy} a2tools --xsendfile="${musicPath}" --overrides='All' "${domain}" "${installPath}"
fi
Connectez-vous à l'application en utilisant les informations fournies par:
command echo "http://${domain}/
Login: ${adminEmail}
Password: ${adminPassword}"
Configurez l'emplacement des fichiers musicaux, fourni par la commande:
echo "${musicPath}"
Si le logiciel à des difficultés à recenser le contenu de la bibliothèque musicale via l'interface Web, lancer le recensement en ligne de commande:
pushd "${installPath}"
sudo -u www-data php artisan koel:sync
popd
Surveillance des mises à jour de la bibliothèque musicale
Mettez en place un script cron scannant la totalité de la bibliothèque musicale une fois par semaine:
echo "# Koel cron tasks for ${domain}
0 4 * * 7 www-data test -e '${installPath}/artisan' -a -x /usr/bin/php && php '${installPath}/artisan' --quiet koel:sync
" | ${cmdProxy} tee "/etc/cron.d/koel-${domain//./-}"
Recharchez la configuration de cron:
${cmdProxy} service cron reload
Mettez en place un service pour surveiller en temps réel les mises à jour dans le dossier des musiques:
${cmdProxy} tee "/etc/systemd/system/koel-${domain//\./-}.service" <<< "[Unit]
Description=koel-${domain//\./-}
Requires=network.target local-fs.target
After=mysql.service postgresql.service
[Install]
WantedBy=multi-user.target
[Service]
User=www-data
Group=www-data
Restart=always
Environment='COMMAND=inotifywait -mrse move,close_write,delete --format \"%e %w%\"\"f\" \"${musicPath}\" | while read file; do php artisan koel:sync \"\${file}\"; done'
ExecStart=/bin/bash -c \${COMMAND}
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
WorkingDirectory=${installPath}
PrivateTmp=true"
Activez le service et ajoutez le au démarrage de l'hôte:
${cmdProxy} systemctl daemon-reload
${cmdProxy} systemctl enable "koel-${domain//\./-}"
Démarrez le service:
${cmdProxy} service "koel-${domain//\./-}" start
Sauvegardes
Sauvegardez l'installation avec Backup Manager (voir Installer et configurer Backup Manager sur Debian):
${cmdProxy} backup-manager-tools add "${installPath}"
N'oubliez pas de sauvegarder la base de données (voir Installer et configurer MySQL sur Debian).
Remerciements
- Merci aux développeurs de Koel (en).